直奔主题
为了方便拉代码,我自己有个 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 具体架构是这样的
- 安装 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
文章评论(0)