![根据输出接口在 iptables 中标记数据包](https://linux22.com/image/229925/%E6%A0%B9%E6%8D%AE%E8%BE%93%E5%87%BA%E6%8E%A5%E5%8F%A3%E5%9C%A8%20iptables%20%E4%B8%AD%E6%A0%87%E8%AE%B0%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我的服务器上有一个不寻常的设置。我们有三个传出以太网端口,全部连接到一个桥接接口,我们将其分为两个 VLAN:
ip link add veth type bridge
ip link set veth address 01:23:45:67:89:0A
ip link set dev eth1 master veth
ip link set dev eth2 master veth
ip link set dev eth3 master veth
[...]
ip link add veth name veth.10 type vlan id 10
ip link add veth name veth.20 type vlan id 20
ip link add veth.20-local link veth.20 type macvlan mode bridge
[...]
docker network create --driver=macvlan --subnet=192.168.XXX.0/24 --opt com.docker.network.driver.mpu=1500 --gateway 192.168.XXX.1 --opt parent=veth.20-local dockerbr20
我的服务器内有一个连接到该地址的 docker 映像veth.20
,该映像只允许通过veth.20
.网络的其余部分中存在路由和转发规则,允许 docker 映像与该 VLAN 之外的一些选定目标进行通信。
我想添加一条iptables
规则,涵盖将我的服务器排除在接口之外的传出数据包veth.20
,无论其目的地如何。 (某些数据包必须保留在veth.20
接口内;某些数据包可以路由到其他 VLAN。)
已尝试以下规则,并且无论出于何种原因,似乎都没有标记veth.20
从 docker 容器留下的数据包:
iptables -A POSTROUTING -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A POSTROUTING -t nat -o veth.20 -j MARK --set-mark 3
iptables -A PREROUTING -t nat -i veth.20 -j MARK --set-mark 3
iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3
iptables -A INPUT -t mangle -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -i veth.20 -j MARK --set-mark 3
iptables -A FORWARD -o veth.20 -j MARK --set-mark 3
也就是说,iptables -L -n -v -t mangle
不iptables -L -n -v -t nat
显示任何这些规则应用于从veth.20
另一个 VLAN 上的主机发出的传出数据包。
我已经通过 确认ifconfig
来自 docker 镜像的所有数据包都将离开服务器veth.20
;这
iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3
当我从服务器或 Docker 映像向 VLAN 20 上的外部计算机发送数据包时,适用该规则;但是当我veth.20
通过 docker 的接口发送路由到外部 VLAN 10 或 VLAN 30 地址(未显示)的数据包时,不会应用任何标记。
我觉得这应该是一个简单的问题,但我尝试过的任何方法都无法根据数据包用于离开盒子的接口进行标记。我缺少什么?
答案1
看起来其他规则在标记规则之前。
我会尝试使用iptables -I
而不是iptables -A