透明代理踩坑指北
最近入手了一台矿渣NAS,想着不能浪费机器性能就动了在上面部署透明代理的心思。本想以我对网络层的了解配个透明代理是件比较容易的事情,但还是踩中了一些坑,导致花了两个晚上才全搞定,并且没有达到理想中的完美效果,特意记录下来中间遇到几个问题以供指北。
代理软件是V2Ray,CDN加速模式。官方文档比较简单,没有给出完整可用的示例,但是各模块功能解释得还算清晰。TCP部分的处理比较简单,nat链的PREROUTING阶段把非LAN目标的流量全部DIRECT到V2Ray的自由入站端口就行,但是UDP部分遇到了第一个坑点。
按我的经验UDP流量其实是没必要走代理的,只要DNS请求由代理处理好就行了。这个软件恰好就支持DNS代理,软件作者有写博文讲解如何使用,但是没收进官网文档里,于是我就开始按作者博文尝试部署DNS代理。一番功夫后终于明白了为什么不收进官网文档里,因为这个功能根本就不能用。
最后还是老老实实改iptables规则。期间发现这个软件竟然同时支持TCP和UDP的TProxy,这点其实很有利但是文档里没有重点体现,还是在翻isuess的时候注意到有人提到了这点。
最终写成的iptables和路由规则如下,纯TProxy非常的漂亮。
# ROUTE RULES
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
# CREATE TABLE
iptables -t mangle -N V2RAY
# RETURN LOCAL AND LANS
iptables -t mangle -A V2RAY -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A V2RAY -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A V2RAY -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A V2RAY -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A V2RAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A V2RAY -d 240.0.0.0/4 -j RETURN
# FORWARD ALL
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
# REDIRECT
iptables -t mangle -A PREROUTING -j V2RAY
同时,需要手动打开入站连接的TProxy支持。
{
"protocol": "dokodemo-door",
"streamSettings": {
"sockopt": {
"tproxy": "tproxy"
}
}
}
TCP与UDP连接全部代理成功,但仅仅是做到这一步会发现访问国内网站的速度变慢了,这是因为DNS请求全部走代理的原因,软件内置的路由规则并不对代理流量中的DNS请求自动生效。
翻阅文档后发现,软件其实可以拦截入站流量中的DNS请求由自己发出,这个过程可以针对站点分流,简单设置即可。
"dns": {
"servers": [
"1.1.1.1",
{
"address": "114.114.114.114",
"port": 53,
"domains": [
"geosite:cn",
]
}
]
}
这个配置会把所有符合geosite:cn规则的域名分流到114服务器,而其他不在列的则走1.1.1.1服务器,虽不完美但将就着用。
至此基本完美透明代理,只要把手机和笔记本的网关指向这台NAS就可以愉快的上网了,甚至不需要修改DNS服务器,体验还是很良好的。