路由器透明代理

基于iptables+ipset实现内网透明代理

ipset

借助ipset来区分大陆和海外IP

wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

ipset create chnroute hash:net 
for i in $(cat /jffs/configs/cn.zone ); do ipset -A chnroute $i; done > /dev/null 2>&1 &

iptables

graph TD
START((START)) --> A
A(内网终端) -->|发起请求| B(路由器/网关)
B --> B1(CLASH链)
B1 --> B2(流量打标)
B2 --> C{内网IP段?}
C -->|yes| END((END))
C -->|no| D{有标签 & 目标是代理服务器?}
D -->|yes| END
D -->|no| E{大陆IP?}
E -->|yes| END
E --> G(redir-port)
  1. 创建一个新的链CLASH, 也可命名其它
  2. 跳过目标是内网IP段的流量
  3. 这里有一个点需要关注, 经过代理转发的流量还会重新进入CLASH链, 产生循环, 故对刚进入CLASH链的流量进行打标 iptables -t nat -I CLASH 1 -p tcp -j CONNMARK --set-mark 5, 并且在CLASH链中忽略目标是代理服务器IP且有标的流量, 这样就能避免循环
  4. 通过ipset匹配并忽略大陆IP
  5. 将CLASH链的流量转发到代理服务器, 这个服务器可以是redir-port, 或者其它
  6. 将tcp流量全部转发到CLASH链
iptables -t nat -N CLASH
# tag for redir-port
iptables -t nat -I CLASH 1 -p tcp -j CONNMARK --set-mark 5
iptables -t nat -A CLASH -d 0.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN
iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN
iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN
iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN
iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN

# check tag for redir-port
iptables -t nat -A CLASH -d 127.0.0.1 -p tcp -m tcp --dport 7892 -m connmark ! --mark 5 -j RETURN
iptables -t nat -A CLASH -d 10.33.30.1 -p tcp -m tcp --dport 7892 -m connmark ! --mark 5 -j RETURN
iptables -t nat -A CLASH -d 127.0.0.1 -p udp -m udp --dport 7892 -m connmark ! --mark 5 -j RETURN
iptables -t nat -A CLASH -d 10.33.30.1 -p udp -m udp --dport 7892 -m connmark ! --mark 5 -j RETURN

# domestic ip
iptables -t nat -A CLASH -p tcp -m set --match-set chnroute dst -j RETURN
iptables -t nat -A CLASH -p icmp -m set --match-set chnroute dst -j RETURN
# redirect to clash
iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -A PREROUTING -p tcp -j CLASH

启动脚本 & 定期更新

iptables和ipset会在重启后丢失, 可将以上代码封装到proxy.sh中, 在系统启动时执行, 也可以保存iptables规则, 笔者选择前者.

欢迎关注公众号(代码如诗)

代码如诗(poetic_code)

推荐阅读

4 1 投票
文章评分
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x