一直想留个 dns tunnel 的实例给手机用,以便不时之需。最近发现有个特殊场景,需要用到 dns tunnel。
很多年前调研的时候,选定了 iodine,但是客户端是个问题,windows的程序古早,而且需要 openvpn 古早版本的 tuntap 驱动,iOS之前一直没有找到合适的客户端,拿电脑开热点有点过于傻(虽然我还是买了个 Connectify并用过几次),带个 OpenWRT 的路由(gl-inet)配充电宝好像是可以但是也挺麻烦。
其他方案也看过,dns2tcp 算是接受度很高的方案,但是没找到 iOS 的客户端。
Github 上有个 iOS 版的开源项目,不想折腾。
最近又发现一个上架了的开源项目,Purple Haze,使用的方案是基于 iodine 的,省事了。
服务器,iodined
iodined -f -c -P password -DD -l 1.2.3.4 -m 1120 172.16.55.1 24 dns.sskaje.me
MTU是个大问题,如果不指定,客户端每次建立连接都要去试。大概观察了一下客户端的日志,选了个小的 1120,客户端也得同步设置。
NAT是需要开启的。eth0是公网的出口设备。
iptables -t nat -A POSTROUTING -s 172.16.55.0/24 -o eth0 -j MASQUERADE
实测,速度大概比 56k 猫的速度快一点,图片什么的基本看不到了,而且丢包率可观。
再,如果iodined的服务器有其他网络,需要指定出口,例如:
流量按本机的路由表转给其他二层设备,直接添加路由,并根据需求在出口设备上加 NAT。
流量转给一个 point-to-point 设备,例如 wireguard、sit tunnel,OpenVPN TUN等,或者 OpenVPN TAP 类似的 二层设备
例如,全部流量转给 wireguard wg0,table 33
ip route add 172.16.55.0/24 dev dns0 table 33
ip rule add from 172.16.55.0/24 table 33
ip route add default dev wg0 table 33
iptables -t nat -A POSTROUTING -s 172.16.55.0/24 -o wg0 -j MASQUERADE