我试图在docker容器中设置一个代理服务器,以便将一些数据包路由出VPN (有些站点不响应VPN的ip,它们是国家锁定的)。为了做到这一点,我尝试标记数据包发送到和从码头集装箱接口。
我使用代理服务器容器连接到用户定义的桥接网络(172.18.0.0/16),并使用名为br-43cb854b8af8的虚拟接口。我的PC上的物理网络接口的名称是enp3s0。还有带有net172.17.0.0/16的标准坞桥接口docker0,所以当它包含在iptables规则中时,就不使用它了。
在PC表的开头,原始和残缺都是空的,
过滤表:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-43cb854b8af8 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-43cb854b8af8 -j DOCKER
-A FORWARD -i br-43cb854b8af8 ! -o br-43cb854b8af8 -j ACCEPT
-A FORWARD -i br-43cb854b8af8 -o br-43cb854b8af8 -j ACCEPT
-A DOCKER -d 172.18.0.2/32 ! -i br-43cb854b8af8 -o br-43cb854b8af8 -p tcp -m tcp --dport 3128 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-43cb854b8af8 ! -o br-43cb854b8af8 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-43cb854b8af8 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURNnat桌:
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.18.0.0/16 ! -o br-43cb854b8af8 -j MASQUERADE
-A POSTROUTING -s 172.18.0.2/32 -d 172.18.0.2/32 -p tcp -m tcp --dport 3128 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-43cb854b8af8 -j RETURN
-A DOCKER ! -i br-43cb854b8af8 -p tcp -m tcp --dport 3128 -j DNAT --to-destination 172.18.0.2:3128问题是如果我加上
iptables -t mangle -A PREROUTING -i br-43cb854b8af8 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i enp3s0 -s 172.18.0.0/16 -j MARK --set-mark 1要标记来自代理服务器的传出数据包,第二条规则不适用于任何数据包,而第一条规则适用于任何数据包,而通过enp3s0伪装的第一条规则也有效。换句话说,数据包按其应有的方式进行,但是由于某种原因,规则iptables -t mangle -A PREROUTING -i enp3s0 -s 172.18.0.0/16 -j MARK --set-mark 1没有被应用。此外,除了默认的ip路由或规则之外,没有打开VPN或任何应用的ip路由或规则。
发布于 2022-10-08 15:14:47
首先,正如在对这个问题的评论中回答的那样,第二条规则不适用,因为-i意味着数据包是从接口enp3s0接收的。因此,为了标记来自代理的所有传出数据包,第一条规则就足够了。为了对传入的数据包执行相同的操作,我们需要添加
iptables -t mangle -A FORWARD -i enp3s0 -d 172.18.0.0/16 -j MARK --set-mark 1因此,现在所有用于和从br-43cb854b8af8的数据包都被标记了(但是那些从浏览器发送到代理的数据包),这是时间设置路由。
第一组命令是
ip rule add to 172.18.0.0/16 pref 100 table 1
ip rule add fwmark 0x0001 pref 101 table 1
ip route add table 1 to 172.18.0.0/16 dev br-43cb854b8af8它们允许来自浏览器的流量和代理的传入流量直接进入码头网络。使用pref选项,因为VPN也设置了它的规则,只有当上面的规则不适用于数据包时,我们才希望检查它。
第二组命令是
ip rule add fwmark 0x0001 pref 102 table main它将其设置为,如果数据包有标记而不去码头网(这意味着它是从码头网发出的),它将避免VPN的规则,并按他的标准路由移动,而不使用VPN。
最终脚本
#!/bin/sh
iptables -t mangle -A PREROUTING -i br-43cb854b8af8 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -i enp3s0 -d 172.18.0.0/16 -j MARK --set-mark 1
ip rule add to 172.18.0.0/16 pref 100 table 1
ip rule add fwmark 0x0001 pref 101 table 1
ip route add table 1 to 172.18.0.0/16 dev br-43cb854b8af8
ip rule add fwmark 0x0001 pref 102 table main
ip route flush cachehttps://unix.stackexchange.com/questions/720256
复制相似问题