在vps上通过ew做流量转发。
./ew_for_linux64 -s ssocksd -l 44444
在宿主机,通过redsocks + iptables 将所有流量进行转发。
安装redsocks
apt install redsocks
配置redsocks配置文件
# /etc/redsocsk.conf
base {
log_debug = off;
log_info = on;
log = "syslog:daemon"; // log = "file:/tmp/red.log"
daemon = on;
user = redsocks;
group = redsocks;
redirector = iptables;
}
redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = <vps_ip>;
port = 44444;
type = socks5;
}
配置iptables
iptables -t nat -N REDSOCKS # 在nat下新增一个链
# 忽略宿主机和vps的地址
iptables -t nat -A REDSOCKS -d 192.168.88.123 -j RETURN
iptables -t nat -A REDSOCKS -d <vps_ip> -j RETURN
# 忽略本地地址
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
# 其余tcp包都转发到redsocks端口
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345 # <redsocket监听的本地端口>
iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
因为在 nat表做的转发,所以可以先监听 mangle 表的输入数量
iptables -t mangle -I OUTPUT -d 39.156.66.14 -j ACCEPT
iptables -t mangle -I OUTPUT -d 139.199.116.80 -j ACCEPT
iptables -t filter -I OUTPUT -d 39.156.66.14 -j ACCEPT
iptables -t filter -I OUTPUT -d 139.199.116.80 -j ACCEPT
iptables -t mangle -I POSTROUTING -d 39.156.66.14 -j ACCEPT
iptables -t mangle -I POSTROUTING -d 139.199.116.80 -j ACCEPT
这里我没有完全理解,当我curl www.baidu.com
的时候,理论上来讲先经过第一步,发送了7个包。但是被 REDSOCKS钩住了,REDSOCKS和服务器交换握手存在2个包(步骤2)。然后一开始的7个包全都被发到vps上,所以发往VPS的一共有 7 + 2 个包(步骤3、4、5)。(但是我不懂为啥nat部分只显示了2个包,理论上应该是7个包才对)