出力インターフェイスに基づいてiptablesにパケットを表示する

出力インターフェイスに基づいてiptablesにパケットを表示する

私のサーバーには珍しい設定があります。 3つの発信イーサネットポートがあり、すべてブリッジインターフェイスに接続されており、これを2つの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

私のサーバー内にそのアドレスに接続するドッカーイメージがあり、veth.20そのイメージはveth.20

宛先に関係なく、iptablesインターフェイスからサーバーを除いて発信パケットを処理するルールを追加したいと思います。 (一部のパケットはインターフェイス内にveth.20残る必要があり、一部のパケットは他のVLANにルーティングすることができます。)veth.20

次のルールを試しましたが、何らかの理由でveth.20ドッカーコンテナに残されたパケットが表示されないようです。

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

つまり、これらのルールは他のVLANのホストから発信されたパケットには適用されiptables -L -n -v -t mangleないようです。iptables -L -n -v -t natveth.20

ifconfig私はドッカーイメージ内のすべてのパケットがサーバーを離れることを確認しましたveth.20

iptables -A OUTPUT -t mangle -o veth.20 -j MARK --set-mark 3

サーバーまたはDockerイメージからVLAN 20の外部システムにパケットを送信するとルールが適用されますが、veth.20外部VLAN 10またはVLAN 30アドレス(図示せず)にルーティングされるDockerインターフェイスを介してパケットを送信するとルールが適用されます。どのタグも適用されません。

私はこれが単純な問題だと思いますが、私が試したものはボックスを残すために使用したインターフェイスに基づいてパケットにタグを付けることはできません。私は何を見逃していますか?

答え1

他のルールがタグルールの前に出てくるようです。

iptables -I代わりに試してみます。iptables -A

関連情報