This post is created 4 years ago, the content may be outdated.
折腾透明代理主要目的是想让局域网内的PlayStation® 4能樯访问DMM互联网。因为众所周知不可描述的原因,大陆境内PS4™游戏连接Ubisoft™、SQUARE ENIX™等公司的服务器非常痛苦。虽然PS4™系统设置中提供了代理选项,可以应用HTTP代理,但是实际测试发现很多应用不理会系统代理设置,仍然是直连模式。解决方案之一就是在路由端配置Shadowsocks透明代理,使用iptables转发全部流量,实现全局代理。
本文记录安装过程,供日后参考。
ss-redir 客户端安装
OpenWrt使用shadowsocks-libev客户端,可以从源码编译,也可以直接从软件源安装。我就懒得折腾编译了,直接安装的shadowsocks-libev-ss-redir
这个包。这个包还会自动安装一个并没什么作用的shadowsocks-libev-ss-config
,我也没有找到关于ss-config的文档。还有个名称很相似的shadowsocks-client
没有redir功能。
装完shell输入ss-redir --help
测试一下。
Obfs 客户端
OpenWrt的simple-obfs项目地址在此。
这个需要按照README.md介绍下载OpenWrt SDK进行编译。编译好的ipk文件用SCP传到OpenWrt并在shell使用opkg install /path/to/simple-obfs.ipk
安装。
安装后shell输入obfs-local
测试一下。
服务自启动
/etc/init.d/
目录下建立名为shadowsocks-libev-redir
的文件,内容可以如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #!/bin/sh /etc/rc.common
START=99
SERVICE_USE_PID=1 SERVICE_WRITE_PID=1 SERVICE_DAEMONIZE=1
start() { service_start /usr/bin/ss-redir -s server_host_or_ip -p remote_port -l 1080 -k server_password -m encryption_method -b 0.0.0.0 -u --fast-open --plugin obfs-local --plugin-opts obfs=http }
stop() { service_stop /usr/bin/ss-redir }
|
注意本地监听一定要绑定0.0.0.0而不能是默认的127.0.0.1。
添加执行权限chmod +x /etc/init.d/shadowsocks-libev-redir
可使用/etc/init.d/shadowsocks-libev-redir start/stop
控制服务
iptables 配置
安装插件iptables-mod-tproxy
,注意不是kmod-ipt-tproxy
在OpenWrt自定义防火墙规则中添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| iptables -t nat -N SSREDIR_TCP
iptables -t nat -A SSREDIR_TCP -s localhost -j RETURN iptables -t nat -A SSREDIR_TCP -d shadosocks_server_host_or_ip -j RETURN iptables -t nat -A SSREDIR_TCP -d another_shadosocks_server_host_or_ip -j RETURN
iptables -t nat -A SSREDIR_TCP -d 0.0.0.0/8 -j RETURN iptables -t nat -A SSREDIR_TCP -d 10.0.0.0/8 -j RETURN iptables -t nat -A SSREDIR_TCP -d 127.0.0.0/8 -j RETURN iptables -t nat -A SSREDIR_TCP -d 169.254.0.0/16 -j RETURN iptables -t nat -A SSREDIR_TCP -d 172.16.0.0/12 -j RETURN iptables -t nat -A SSREDIR_TCP -d 192.168.0.0/16 -j RETURN iptables -t nat -A SSREDIR_TCP -d 224.0.0.0/4 -j RETURN iptables -t nat -A SSREDIR_TCP -d 240.0.0.0/4 -j RETURN
iptables -t nat -A SSREDIR_TCP -s PS4_hostname_or_ip -p tcp -j REDIRECT --to-ports 1080
ip rule add fwmark 1 table 100 ip route add local 0.0.0.0/0 dev lo table 100 iptables -t mangle -N SSREDIR_UDP
iptables -t mangle -A SSREDIR_UDP -s localhost -j RETURN iptables -t mangle -A SSREDIR_UDP -d shadosocks_server_host_or_ip -j RETURN iptables -t mangle -A SSREDIR_UDP -d another_shadosocks_server_host_or_ip -j RETURN
iptables -t mangle -A SSREDIR_UDP -d 0.0.0.0/8 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 10.0.0.0/8 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 127.0.0.0/8 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 169.254.0.0/16 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 172.16.0.0/12 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 192.168.0.0/16 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 224.0.0.0/4 -j RETURN iptables -t mangle -A SSREDIR_UDP -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A SSREDIR_UDP -s PS4_hostname_or_ip -p udp -j TPROXY --on-port 1080 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -j SSREDIR_UDP iptables -t nat -A PREROUTING -p tcp -j SSREDIR_TCP
|
规则重启防火墙后生效。
最后两行可以通过注释方便控制TCP代理和UDP代理的开关。
因为PS4®默认没有主机名,本例中预先在DHCP中为其指定了固定IP与主机名。
在iptables里可使用IP、CIDR、hostname、MAC匹配源与目的,方便灵活配置规则,所以也可以只为特定的域名启用代理。
似乎还可以通过附加iptables模块搭配GFWList实现自动分流?
测试
在PS4®网络连接中测试,NAT识别为Type 2 o( ̄▽ ̄)ブ
luci界面状态 > 防火墙
可以监测iptable规则与流量状态。
附注
经测试仅做透明代理不足以达到魔法上网目的,需在路由端解决DNS污染问题。可用PcapDNSProxy解决。