我决定先实现策略C(onlyChinaDNS),需要先编译ChinaDNS和DNS-Forwarder for OpenWRT(强烈建议把nano也加入编译,vi反复i/Esc实在太反人性)。据说ChinaDNS-NG维护更好更新,但没提OpenWRT,感觉不易上手。编译好刷机完,ssh登录,先设置Trojan:nano /etc/trojan.json
因为要通过dnsmasq配置/etc/config/dhcp或命令行设置上游DNS,要用noresolv替换resolvfile,local从/lan/改成127.0.0.1:5353 。cachesize和dnsforwardmax本为解决网络拥堵或大量并发查询时DNS on TCP超时,导致trojan进程占内存太多被杀掉,然并卵还得上UDP。
echo "$IPtoTrojanProxy $domain" >> /etc/hosts
否则会形成DNS死锁,对代理服务DNS要通过代理服务解析成IP才能进行代理服务DNS……
ChinaDNS在UDP 5353提供纯净的DNS,需要通过境外DNS将污染过滤;而现在从境外DNS无论UDP还是TCP查询都会被DROP/REJECT,因此需要通过DNS-Forwarder在5300提供UDP转TCP的DNS,最后DNS on TCP通过iptables重定向到代理Trojan发出。
iptables -t nat -N FKCCP
iptables -t mangle -N FKCCP
iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0/8 -j RETURN
iptables -t nat -A FKCCP -d 10/8 -j RETURN
iptables -t nat -A FKCCP -d 127/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168/16 -j RETURN
iptables -t nat -A FKCCP -d 224/4 -j RETURN
iptables -t nat -A FKCCP -d 240/4 -j RETURN
while read block; do
iptables -t nat -A FKCCP -d $block -j RETURN
done < /etc/chinadns_chnroute
#iptables -t nat -A FKCCP -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
iptables -t mangle -A FKCCP -p udp -d 1.1.1.1 --dport 53 -j TPROXY --on-port 1080 #--tproxy-mark 0x01/0x01
#iptables -t mangle -A OUTPUT -p udp --dport 53 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -p tcp -j FKCCP
#iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 1080
iptables -t mangle -A PREROUTING -j FKCCP
iptables -t mangle -A OUTPUT -p udp -d 1.1.1.1 --dport 53 -j MARK --set-mark 1
exit 0
尝试过代理DNS on UDP,原理也懂点,但无论本地/转发都试过,要么无应答,要么被污染。OpenWRT日志看不到Trojan对DNS on UDP的转发,TPROXY流程很复杂,日志看得晕头转向:DNS on UDP(1.1.1.1)没重定向到1080就发出去了、或不知所踪、或SRC/DST逆转(不知道无应答/被污染还是彻底反了),总之追踪路由/网络编程源码(还是C语言)超出了效费比下限……
OpenWRT透明代理日常上网没问题,p2p下载DNS on TCP(网络拥堵或大量并发查询)会导致trojan在2’/10’内耗尽内存被杀掉(MiR4A峰值load超过17了…),内存/系统/闪存/CPU局限太多了。这些对电脑根本不是问题(除了能效差),玩到最后都会上软路由,我觉得我不会MIPS>ARM>Intel NANO>Intel移动U,MIPS/ARM高端路由缺乏性价比,技术还落伍。如果我需要WiFi6VR流视频,AX200比2.5G有线网卡便宜。毕竟160MHz的WiFi6峰值1.6G有线千兆已成瓶颈,广域网才普及100M,WiFi6软路由不会长时间运行。这需求有线网太贵了,用NAS俩万兆网卡就超过1600了,618/双11不到1000攒2×32G内存不香吗?
# Create new chain
iptables -t nat -N SHADOWSOCKS
iptables -t mangle -N SHADOWSOCKS
# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
# See ashi009/bestroutetb for a highly optimized CHN route list.
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
我决定先实现策略C(onlyChinaDNS),需要先编译ChinaDNS和DNS-Forwarder for OpenWRT(强烈建议把nano也加入编译,vi反复i/Esc实在太反人性)。据说ChinaDNS-NG维护更好更新,但没提OpenWRT,感觉不易上手。编译好刷机完,ssh登录,先设置Trojan:nano /etc/trojan.json
ChinaDNS在UDP 5353提供纯净的DNS,需要通过境外DNS将污染过滤;而现在从境外DNS无论UDP还是TCP查询都会被DROP/REJECT,因此需要通过DNS-Forwarder在5300提供UDP转TCP的DNS,最后DNS on TCP通过iptables重定向到代理Trojan发出。
此命令换节点/IP就得手动修改,嫌麻烦:
# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
Wed Aug 5 19:49:10 2020 daemon.err trojan[1964]: [2020-08-05 19:49:10] [WARN] trojan service (nat) started at 127.0.0.1:1080
ChinaDNS/DNS-Forwarder配置很简单,没JSON苛刻的语法,一次过:
root@MiR4A:~# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:www 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 :::www :::* LISTEN
tcp 0 0 :::ssh :::* LISTEN
udp 0 0 0.0.0.0:5300 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 1024 /var/run/ubus.sock
5300为DNS-Forwarder,mdns(Multicast DNS,与前面www/ssh类似标准端口)即5353,为ChinaDNS。netstat只确保ChinaDNS/DNS-Forwarder运行,ChinaDNS只执行过滤DNS污染的逻辑,DNS-Forwarder只提供UDP转TCP的DNS,iptables则承担最关键DNS on TCP on Trojan,以保证可信的DNS:
对比Trojan文档关于透明代理iptables规则设置和Trojan透明代理手动配置,会发现Trojan文档推荐配置修改UDP 53,重定向到代理服务完成DNS,而Trojan透明代理手动配置则通过DNS-Forwarder将DNS on UDP转为DNS on TCP,再重定向给代理服务完成DNS。如果将DNS on TCP视为和80/443的HTTP/HTTPS(on TCP)一样的数据包,只有PREROUTING没OUTPUT,就没有过滤DNS污染的效果。
复杂的3层DNS(dnsmasq/ChinaDNS/DNS-Forwarder)过滤都成功了,而且DNS on TCP也REDIRECT成功了,关键就一句REDIRECT还不简单吗?然而就上不了谷歌,那照猫画虎加一句OUTPUT:
iptables -t nat -N FKCCP
iptables -t nat -A FKCCP -d $IPtoTrojanProxy -j RETURN
iptables -t nat -A FKCCP -d 0.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 10.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 127.0.0.0/8 -j RETURN
iptables -t nat -A FKCCP -d 169.254.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 172.16.0.0/12 -j RETURN
iptables -t nat -A FKCCP -d 192.168.0.0/16 -j RETURN
iptables -t nat -A FKCCP -d 224.0.0.0/4 -j RETURN
iptables -t nat -A FKCCP -d 240.0.0.0/4 -j RETURN
iptables -t nat -A FKCCP -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 1080
iptables -t nat -A PREROUTING -p tcp -j FKCCP
iptables -t nat -A OUTPUT -p tcp -j FKCCP
还是上不了,而且看日志trojan只收到转发DNS on TCP。几十个网页看得欲仙欲死,文档惜字如金,一图胜千言还是看不懂。最关键内网在哪外网在哪?此图进出口没问题,但区分内外网是基础。
不过也非自愿明白了PREROUTING和OUTPUT的区别:内网进/出路由的流量。所以重定向DNS on TCP不需要PREROUTING。DNS标准也支持TCP,但通常只有报文长度超过UDP最大512字节,或域名服务器之间同步才用到。内网DNS皆UDP,根本不调用PREROUTING。如果调用了PREROUTING,复杂的3层DNS(dnsmasq/ChinaDNS/DNS-Forwarder)过滤就失效了,CDN加速/内外分流都白折腾了。
root@MiR4A:~# nano /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
tproxy
exit 0