首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么iptables mangle表没有捕获数据包?

为什么iptables mangle表没有捕获数据包?
EN

Unix & Linux用户
提问于 2022-10-08 13:37:10
回答 1查看 240关注 0票数 0

我试图在docker容器中设置一个代理服务器,以便将一些数据包路由出VPN (有些站点不响应VPN的ip,它们是国家锁定的)。为了做到这一点,我尝试标记数据包发送到和从码头集装箱接口。

我使用代理服务器容器连接到用户定义的桥接网络(172.18.0.0/16),并使用名为br-43cb854b8af8的虚拟接口。我的PC上的物理网络接口的名称是enp3s0。还有带有net172.17.0.0/16的标准坞桥接口docker0,所以当它包含在iptables规则中时,就不使用它了。

在PC表的开头,原始和残缺都是空的,

过滤表:

代码语言:javascript
复制
-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 RETURN

nat桌:

代码语言:javascript
复制
-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

问题是如果我加上

代码语言:javascript
复制
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路由或规则。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-10-08 15:14:47

首先,正如在对这个问题的评论中回答的那样,第二条规则不适用,因为-i意味着数据包是从接口enp3s0接收的。因此,为了标记来自代理的所有传出数据包,第一条规则就足够了。为了对传入的数据包执行相同的操作,我们需要添加

代码语言:javascript
复制
iptables -t mangle -A FORWARD -i enp3s0 -d 172.18.0.0/16 -j MARK --set-mark 1

因此,现在所有用于和从br-43cb854b8af8的数据包都被标记了(但是那些从浏览器发送到代理的数据包),这是时间设置路由。

第一组命令是

代码语言:javascript
复制
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也设置了它的规则,只有当上面的规则不适用于数据包时,我们才希望检查它。

第二组命令是

代码语言:javascript
复制
ip rule add fwmark 0x0001 pref 102 table main

它将其设置为,如果数据包有标记而不去码头网(这意味着它是从码头网发出的),它将避免VPN的规则,并按他的标准路由移动,而不使用VPN。

最终脚本

代码语言:javascript
复制
#!/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 cache
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/720256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档