Post

OpenWrt Shadowsocks 使用 GFWList 路由规则

介绍

在 《OpenWrt Shadowsocks 安装&配置指南》一文中博主详细介绍了使用 CHNRoutes 规则翻墙方案,本文进一步说明如何在其基础上切换为 GFWList 规则,即仅在 GFWList 中流量的走 Shadowsocks 代理。方案的基本思路是基于 GFWList IP 地址列表构建 iptables (防火墙) 规则,将目标 IP 的流量转发至 Shadowsocks。

注意:你首先需要完成前述文章的配置内容

Step 1 - 准备 GFWList ipset 集

ipset 是一个iptables 的辅助工具,能够轻松愉快地创建和维护一组IP地址。本文通过配置 dnsmasq ,命令其将 GFWList 列表中的域名一一解析成 IP 地址,并记录为一个 ipset 集。

首先,我们创建一个专门存放 dnsmasq.d 自定义配置文件的目录

1
mkdir /etc/dnsmasq.d

接着,指定 dnsmasq 加载该目录

  • OpenWrt

修改 /etc/dnsmasq.conf,最后加一行:

1
2
3
4
vim /etc/dnsmasq.conf

...
conf-dir=/etc/dnsmasq.d
  • LEDE

执行以下命令获取当前的配置状态

1
uci get dhcp.@dnsmasq[0].confdir

如果返回值为 uci: Entry not found 或不是 /etc/dnsmasq.d ,则执行:

1
2
uci add_list dhcp.@dnsmasq[0].confdir=/etc/dnsmasq.d
uci commit dhcp

下载已经整理好的规则文件到 dnsmasq.d 目录

1
2
cd /etc/dnsmasq.d
wget https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf

配置文件的语法是用 server 指定某 GFW 域名用某 DNS 解析,然后将解析结果 ipset 到一个名为 gfwlist 的地址集中。片段如下:

1
2
3
4
dnsmasq_gfwlist_ipset.conf
...
server=/030buy.com/127.0.0.1#5353
ipset=/030buy.com/gfwlist

Network - Firewall - [Custom Rules](http://lede/cgi-bin/luci/admin/network/firewall/custom) 中添加一条 ipset create gfwlist hash:ip,让 iptables 启动时创建 gfwlist ipset

重启 dnsmasq,完成所有配置。

1
/etc/init.d/dnsmasq restart

最后,为了测试 gfwlist  是否成功创建,你可以先访问一些存在于 GFWlist 中的网站,然后执行

1
ipset list gfwlist

检查 gfwlist 这个 ipset 是否存在且包含解析的 IP 地址。

Step 2 - 将 Shadowsocks 路由规则切换到 GFWlist

参考 luci-app-shadowsocks/wiki/GfwList-Support 将 Shadowsocks 的 access control/访问控制 规则修改为:

进入 Luci 界面 -> 访问控制 -> 外网区域 「被忽略IP列表」 选择留空(/dev/null) 「额外被忽略IP」 设置为 0.0.0.0/1 和 128.0.0.0/1

即忽略所有 IP 的流量

然后执行 iptables 命令,将匹配 gfwlist 的流量转发至 Shadowsocks

1
iptables -t nat -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW

注意:每次重启 Shadowsocks 后都需要运行一次此命令。如果想随 Shadowsocks 启动时运行此命令,编辑其启动脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /etc/init.d/shadowsocks

...
start() {
    pidof ss-redir ss-local ss-tunnel >/dev/null && return 0
    mkdir -p /var/run /var/etc
    ss_redir && rules
    ss_local
    ss_tunnel

    #增加此行
    iptables -t nat -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW

} 
...

至此,Shadosocks 路由规则完成从 CH NRoutes 切换到 GFWlist ,如果要反向操作,将 Step 2 的修改复原即可。

This post is licensed under CC BY 4.0 by the author.