准备

在开始以下步骤之前,你需要确保透明代理网关上已经做好以下准备

  • 安装好ipsetdnsmasq
  • 无污染的DNS代理(端口不要和dnsmasq需要用到的53端口冲突)
  • shadowsocks-libev已安装并且ss-redir已配置

开始

配置NAT规则

gfwlist模式需要记录一份IP列表,以便把这个列表中的IP都转向到SS,创建ipset并配置NAT:

ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1234

其中--to-port指向到ss-redir配置的端口
如果想每次开机启动都自动生效可以把上面两行加到/etc/rc.local

如果是不同机,网关使用DNAT转发到代理机上指定端口

iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j DNAT --to 192.168.10.10:1235

代理机上将指定端口REDIRECT到ss-redir的端口

iptables -t nat -A PREROUTING --proto tcp --dport 1235 -j REDIRECT --to-port 1234

其它操作

# 日志
sudo iptables -A INPUT -j LOG --log-prefix "curious_log " --log-level 6
# 查看NAT规则与删除
sudo iptables -t nat -L --line-numbers
sudo iptables -t nat -D PREROUTING 1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p

sudo vi /etc/dhcpcd.conf
#Add the following lines
interface eth0
static ip_address=192.168.10.10
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

配置IP清单

为了批量且易于管理,可以使用dnsmasq向ipset里添加IP,此外dnsmasq可以进行本地的DNS管理。首先配置/etc/dnsmasq.conf,添加conf-dir目录便于管理:

conf-dir=/etc/dnsmasq.d

这样在/etc/dnsmasq.d/下面所有.conf文件都会加载,为了和dnsmasq的其它配置隔离,可以新建一个gfwlist.conf文件,添加需要NAT的域名,参考格式如下:

server=/remotewebsite.com/127.0.0.1#5353
ipset=/remotewebsite.com/gfwlist

其中5353是本地DNS的代理端口,后面有详细描述。
github里有各种gfwlist转dnsmasq配置的工具(如cokebar/gfwlist2dnsmasq)。使用方式大同小异。

其它

dnsmasq的默认上级DNS使用的是/etc/resolv.conf指定的DNS也就是主机网络的DNS,也可以改成指定的:

resolv-file=/etc/resolv.dnsmasq.conf

另外,需要排查问题时可以开启日志:

log-queries
log-facility=/var/log/dnsmasq.log