使用 iptables + ipset 禁止代理服务器访问中国大陆 IP 地址

根据 @RPRX 关于 GFW 检测方式的讨论

是的,请不要使用代理访问境内 IP 网站,这是一个基本实践问题,因为你使用任何代理访问境内网站,代理的 IP 都会被记录、上传、标记。

使用代理服务器访问中国大陆 IP 地址存在被检测的风险,因此有必要从服务端屏蔽所有的境内 IP 访问请求。本文暂不讨论这种检测方式是否被 GFW 使用。

由于并非所有代理工具都支持ACL或分流功能,配置防火墙成了最通用的选项。

安装 ipset

sudo apt update
sudo apt install ipset

创建 IP 集合

我们首先需要下载一个包含所有中国大陆 CIDR 的列表。

curl -o cn.txt https://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone

创建一个 hash:net 类型的集合,可以让我们导入整个 IP 地址段而不是单个 IP 地址。

sudo ipset create cn hash:net

假设文件每行包括一个 IP 段,批量导入文件的每一行

for ip in $(cat cn.txt); do sudo ipset add cn $ip; done

配置 iptables

别忘了,代理服务器仍然需要将结果发给境内的客户端。所以我们必须允许服务器端口访问任何地址。

sudo iptables -A OUTPUT -p tcp --sport $YOUR_PROXY_SERVER_PORT -j ACCEPT

最后,禁止其它端口访问境内 IP, 我们就完成啦!

sudo iptables -A OUTPUT -p tcp -m set --match-set cn dst -j DROP

参考

如何屏蔽 SS 服务器访问大陆的 IP 段?

关于XTLS流量特征是否可能导致被检测的一个问题