index.html

OpenWrt中使用ss-redir为设备提供透明代理

字数统计: 1k阅读时长: 4 min
2018/04/26 Share

折腾透明代理主要目的是想让局域网内的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

# CONFIG_FILE=/etc/shadowsocks-libev/config.json

start() {
# service_start /usr/bin/ss-redir -c $CONFIG_FILE # Use external configuration file
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
# SS-REDIR TCP
iptables -t nat -N SSREDIR_TCP

# Bypass ssserver and LAN
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

# Redirect TCP
iptables -t nat -A SSREDIR_TCP -s PS4_hostname_or_ip -p tcp -j REDIRECT --to-ports 1080

# SSREDIR_UDP
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

# Bypass ssserver and LAN
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

# Redirect UDP
iptables -t mangle -A SSREDIR_UDP -s PS4_hostname_or_ip -p udp -j TPROXY --on-port 1080 --tproxy-mark 1

# Enable
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解决。


EOF

CATALOG
  1. 1. ss-redir 客户端安装
    1. 1.1. Obfs 客户端
    2. 1.2. 服务自启动
  2. 2. iptables 配置
  3. 3. 测试
  4. 4. 附注