ss-redir透明代理

本文基于debian 11. 透明代理就是在你的路由器上设置一个代理,然后局域网内的所有流量都从这个代理过。至于用途,懂的都懂。有很多方法实现,如openwrt GUI插件,linux命令行软件,这又包括如clash、ss-redir。本文给出debian 11下配置ss-redir的详细步骤。

本文参考文章[1][2][3],其中第3个是主要参考对象。如果这三篇文章在你那里显示404,无需往下看了。

首先安装必要组件,如果你不知道必要组件是什么,无需继续往下看。

本文后续内容假定配置文件目录为

/etc/libev

配置json文件,该文件内为参数

nano /etc/libev/ss-redir.json

输入如下内容,注意修改ipv6, ipv4, port, password加密方法等与你的vps服务器一致。这里写了tcp only因为我不玩游戏,也没研究udp如何配置。udp代理的配置是个比较大的麻烦。local port可任意修改。local_address写成0.0.0.0才能同时对路由器本机和局域网内所有设备生效。

{ "server": ["ipv6", "ipv4"], "server_port": xxxx, "encryption_method": "chacha20-ietf-poly1305", "password": "xxxxx", "mode": "tcp_only", "local_port": 55555, "fast_open": false, "local_address": "0.0.0.0", "timeout": 600 }

生成chnroute文件,该文件内含所有china mainland ip。这个文件的用处是让所有国内ip不走透明代理,所有不在这个文件里的ip都会走透明代理。这里我偷懒了,实际上有更智能的办法,下载一个pac文件,所有在pac文件里的才走透明代理。

wget -O-| awk -F\| /CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) } > /etc/libev/chnroute.txt

安装ipset

apt-get install ipset

创建ss-up文件,该文件的作用是在启动路由器时自动向iptables添加透明代理规则。之所以不直接写到永久保存的iptables里原因也很显然,如果写进去,就没有关闭透明代理的途径了。这种启动时加载规则的办法算是折衷,代价是要遍历chnroute文件,延长启动时间大概2分钟。

#!/bin/bash /usr/sbin/ipset -N chnroute hash:net maxelem 65536 for ip in $(cat /etc/shadowsocks-libev/chnroute.txt); do /usr/sbin/ipset add chnroute $ip done /usr/sbin/iptables -t nat -N SHADOWSOCKS # 直连服务器 IP #iptables -t nat -A SHADOWSOCKS -d [server_ip]/24 -j RETURN # 允许连接保留地址 /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # 直连中国 IP /usr/sbin/iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN /usr/sbin/iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN # 重定向到 ss-redir 端口 /usr/sbin/iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 55555 #iptables -t nat -A SHADOWSOCKS -p udp -j REDIRECT --to-port 55555 /usr/sbin/iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS /usr/sbin/iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS

再创建一个ss-down,目的是关闭透明代理。但是根据我的使用经验,无法关闭,关闭的方法在下面。

nano /etc/libev/ss-down

输入如下内容

#!/bin/bash /usr/sbin/iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS /usr/sbin/iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS /usr/sbin/iptables -t nat -F SHADOWSOCKS /usr/sbin/iptables -t nat -X SHADOWSOCKS /usr/sbin/ipset destroy chnroute

创建透明代理系统服务 service文件,路由器启动时自动加载上面的ss-up文件。因此只要关闭这个服务再重启路由器,就可以关闭透明代理了。

nano /etc/systemd/system/iptables-proxy.service

输入如下内容

[Unit] Description=Packet Filtering Framework and Shadowsocks-chnroute Before=network-pre.target Wants=network-pre.target [Service] Type=oneshot ExecStart=/etc/shadowsocks-libev/ss-up.sh ExecStop=/etc/shadowsocks-libev/ss-down.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target

创建ss-redir service文件

nano /etc/systemd/system/ss-redir.service

[Unit] Description=Shadowsocks-Libev Client Service Redir Mode After=network.target [Service] Type=simple User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE ExecStart=/usr/bin/ss-redir -c /etc/libev/ss-redir.json [Install] WantedBy=multi-user.target

开启服务

systemctl enable ss-redir systemctl enable iptables-proxy systemctl start ss-redir systemctl start iptables-proxy

如果要关闭透明代理,输入

systemctl stop iptables-proxy systemctl disable iptables-proxy

再重启系统即可关闭透明代理

参考

^^^