Centos 下配置 trojan-go 客户端

2025年9月8日 0 条评论 38 次阅读 0 人点赞

直奔主题

为了方便拉代码,我自己有个 trojan-go 的服务端,在美国的服务器。

我国内的服务器想拉代码,因此就装了一个 trojan-go 的客户端。

当启动 trojan-go 客户端,会监听在 1080 端口

此时我执行下面的命令进行测试

curl -v -x socks5://127.0.0.1:1080 'https://www.google.com'  -k -L

这行命令是有问题的,curl 命令会调用本地 DNS 解析 google.com 然后被墙和运营商抢答,导致拿到 google.com 的 IP 是错误的。

当代理到 1080 端口 trojan-go 时,实际上 trojan-go 用的是 curl 这步骤解析的错误 IP 导致客户端无法出国。

苦思冥想下,找到了一个办法。我采用了 DoH (DNS over HTTPS) 的手段,在本地搭建了一个 127.0.0.1:53 dnsmasq。

/etc/reslove 将 nameserver 改成了 127.0.0.1 也就意味着默认的 DNS 解析走的是 本地 53 端口。

dnsmasq 设置了上游,走的是 cloudflared DoH 形式,

cloudflared 监听在 127.0.0.1 5553 端口

当 dnsmasq 发生 cachemiss 时,会去 cloudflared

dnsmasq 的配置如下

yum install -y dnsmasq

vim /etc/dnsmasq.d/custom.conf
# 监听本地所有网卡(可选,根据需求调整)
listen-address=127.0.0.1,192.168.1.1  # 替换为你的本地 IP

# 禁用 resolv.conf 中的默认 DNS 服务器(避免绕过 cloudflared)
no-resolv

# 关键:将所有 DNS 查询转发到本地的 cloudflared(端口 5353)
server=127.0.0.1#5353

# 1. 本地解析记录的缓存时间(秒)
# 适用于通过 address=/domain/ip 定义的本地域名
local-ttl=300  # 本地记录缓存 5 分钟

# 2. 外部 DNS 记录的最大缓存时间(秒)
# 无论上游返回的 TTL 多大,最多缓存此值
#max-cache-ttl=86400  # 外部记录最长缓存 1 天
max-cache-ttl=10  # 外部记录最长缓存 1 天

# 3. 外部 DNS 记录的最小缓存时间(秒)
# 无论上游返回的 TTL 多小,至少缓存此值(避免低于 0)
min-cache-ttl=3  # 外部记录最短缓存 1 分钟

# 4. 否定响应的缓存时间(秒)
# 如 "域名不存在" 等失败响应的缓存时长
neg-ttl=300  # 否定响应响应缓存 5 分钟

cache-size=10000
systemctl restart dnsmasq
systemctl enable dnsmasq

cloudflared 具体架构是这样的

  1. 安装 cloudflared
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
vim /etc/cloudflared/config.yml
proxy-dns: true
proxy-dns-address: 127.0.0.1     # 对应 --address 参数,指定监听地址
proxy-dns-port: 5353             # 对应 --port 参数,指定监听端口
proxy-dns-upstream:
  - http://192.3.7.126:6443/dns-query # 远程海外服务器的 DNS 查询接口

这个程序启动后会监听本地 5353 端口,当dnsmasq 去到 cloudflared 发起 DNS 查询,会走到这个服务 http://192.3.7.126:6443/dns-query 海外服务器查询 DNS

启动程序命令:

/usr/local/bin/cloudflared   --config /etc/cloudflared/config.yml

此时这个 192.3.7.126:6443 海外服务器启动了一个 Ngx 又将它反向代理到 1.1.1.1

server {
    listen 6443 ;
    server_name racknerd.xhyonline.com;
    server_name www.xhyonline.com www.123pan.com;
    ssl_certificate /etc/trojan-go/racknerd.xhyonline.com.pem;
    ssl_certificate_key /etc/trojan-go/racknerd.xhyonline.com.key;
    location / {
        proxy_ssl_server_name on;
        proxy_set_header Host 1.1.1.1;
        proxy_set_header Accept application/dns-json;
        proxy_pass https://1.1.1.1/;
    }
}

此时 1.1.1.1 DNS 服务器即会触发类似于下面的请求

curl -v -s "https://1.1.1.1/dns-query?name=www.baidu.com&type=A"   -H "Accept: application/dns-json"

返回类似于如下的结果

{
    "Status": 0,
    "TC": false,
    "RD": true,
    "RA": true,
    "AD": false,
    "CD": false,
    "Question": [
        {
            "name": "www.baidu.com",
            "type": 1
        }
    ],
    "Answer": [
        {
            "name": "www.baidu.com",
            "type": 5,
            "TTL": 1193,
            "data": "www.a.shifen.com."
        },
        {
            "name": "www.a.shifen.com",
            "type": 5,
            "TTL": 23,
            "data": "www.wshifen.com."
        },
        {
            "name": "www.wshifen.com",
            "type": 1,
            "TTL": 293,
            "data": "103.235.46.102"
        },
        {
            "name": "www.wshifen.com",
            "type": 1,
            "TTL": 293,
            "data": "103.235.46.115"
        }
    ]
}

修改本地的 nameserver

vim /etc/resolv.conf
# 注释掉其他的 nameserver 只留 127.0.0.1
nameserver 127.0.0.1

一路回传给国内服务器那个 cloudflared 服务,它会识别,并被 dnsmasq 缓存

这样就成功绕开了 DNS 抢答和污染的问题。之后开始配置 trojan-go 的客户端

安装客户端

https://github.com/trojan-gfw/trojan/releases

解压

tar xvf trojan-1.16.0-linux-amd64.tar.xz 

配置客户端 config.json

{
  "run_type": "client",
  "local_addr": "0.0.0.0",
  "local_port": 1080,
  "remote_addr": "$trojan-go的地址,也就是那个域名",
  "remote_port": 443,
  "password": [
    "$trojan-go的密码" 
  ],
  "log_level": 1,
  "ssl": {
    "verify_hostname": false,
    "verify": false,
    "cert": "/path/to/certificate.crt",
    "key": "/path/to/private.key",
    "key_password": "",
    "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384",
    "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
    "prefer_server_cipher": true,
    "alpn": [
      "http/1.1"
    ],
    "alpn_port_override": {
      "h2": 81
    },
    "reuse_session": true,
    "session_ticket": false,
    "session_timeout": 600,
    "plain_http_response": "",
    "curves": "",
    "dhparam": ""
  },
  "tcp": {
    "prefer_ipv4": false,
    "no_delay": true,
    "keep_alive": true,
    "reuse_port": false,
    "fast_open": false,
    "fast_open_qlen": 20
  },
  "mysql": {
    "enabled": false,
    "server_addr": "127.0.0.1",
    "server_port": 3306,
    "database": "trojan",
    "username": "trojan",
    "password": "",
    "key": "",
    "cert": "",
    "ca": ""
  }
}

启动 trojan-go

./trojan --config ./config.json

测试是否生效

curl -v -x socks5://127.0.0.1:1080 'https://www.google.com'  -k -L

兰陵美酒郁金香

大道至简 Simplicity is the ultimate form of sophistication.

文章评论(0)

你必须 登录 才能发表评论