iptables MASQUERADE ルールを使用した NAT 設定は、外部 WAN インターフェイスから着信パケットの conntrack エントリを追加します。

iptables MASQUERADE ルールを使用した NAT 設定は、外部 WAN インターフェイスから着信パケットの conntrack エントリを追加します。

ネットワークネームスペース内でNAT /ルーター設定をシミュレートしていますが、外部WANインターフェイスからルーターに送信されたパケットでconntrackエントリが生成される奇妙な動作に直面しました。これらのconntrackエントリは、内部インターフェイスから外部インターフェイスにパケットが転送されるときにのみ生成されるべきであると予想しました(これは、外部ネットワークから内部ネットワークを保護するNAT機能を実行します)。

私の状況は次のとおりです。

建築学

上記のアーキテクチャイメージは少し古いものです。私は代わりに192.168.0.1andを使用しています。192.168.0.2198.168.X.X

ip netns add agent1
ip netns add router1
ip netns add router2
ip netns add agent2

# creates an interface a1 (otherside is r1-int)
ip netns exec agent1 ip link add a1 type veth peer name r1-int
# set r1-int to router1
ip netns exec agent1 ip link set r1-int netns router1

# creates an interface r1-ext (otherside is rw-ext)
ip netns exec router1 ip link add r1-ext type veth peer name r2-ext
# sets r2-ext to router2
ip netns exec router1 ip link set r2-ext netns router2

# creates an interface r2-int (otherwisde is a2)
ip netns exec router2 ip link add r2-int type veth peer name a2
# sets a2 to agent2
ip netns exec router2 ip link set a2 netns agent2

# set up interfaces for agent1
ip netns exec agent1 ip link set lo up
ip netns exec agent1 ip link set a1 up
ip netns exec agent1 ip addr add 10.0.0.2/24 dev a1
ip netns exec agent1 ip route add default via 10.0.0.1

# set up interfaces for router1
ip netns exec router1 ip link set lo up
ip netns exec router1 ip link set r1-int up
ip netns exec router1 ip link set r1-ext up
ip netns exec router1 ip addr add 10.0.0.1/24 dev r1-int
ip netns exec router1 ip addr add 192.168.0.1/24 dev r1-ext
ip netns exec router1 ip route add default via 192.168.0.2

# setup interfaces for router2
ip netns exec router2 ip link set lo up
ip netns exec router2 ip link set r2-int up
ip netns exec router2 ip link set r2-ext up
ip netns exec router2 ip addr add 10.0.0.1/24 dev r2-int
ip netns exec router2 ip addr add 192.168.0.2/24 dev r2-ext
ip netns exec router2 ip route add default via 192.168.0.1

# setup interfaces for agent2
ip netns exec agent2 ip link set lo up
ip netns exec agent2 ip link set a2 up
ip netns exec agent2 ip addr add 10.0.0.2/24 dev a2
ip netns exec agent2 ip route add default via 10.0.0.1

# Setting up port-restricted NAT for both routers (mapping will always be to port 55555 for easier testing)
ip netns exec router1 iptables -t nat -A POSTROUTING -p udp -o r1-ext -j MASQUERADE --to-ports 55555
ip netns exec router2 iptables -t nat -A POSTROUTING -p udp -o r2-ext -j MASQUERADE --to-ports 55555

agent1tomeからUDPパケットを送信すると、期待どおりにconntrackエントリが生成されますrouter2。何も聞いていないrouter1ので失敗します。router2

ip netns exec agent1 nc -u -p 55555 192.168.0.2 55555
> FIRST PACKET

ただし、conntrackアイテムも作成されますrouter2

$ sudo ip netns exec router1 conntrack -L
udp      17 14 src=10.0.0.2 dst=192.168.0.2 sport=55555 dport=55555 [UNREPLIED] src=192.168.0.2 dst=192.168.0.1 sport=55555 dport=55555 mark=0 use=1
conntrack v1.4.6 (conntrack-tools): 1 flow entries have been shown.

$ sudo ip netns exec router2 conntrack -L
udp      17 16 src=192.168.0.1 dst=192.168.0.2 sport=55555 dport=55555 [UNREPLIED] src=192.168.0.2 dst=192.168.0.1 sport=55555 dport=55555 mark=0 use=1
conntrack v1.4.6 (conntrack-tools): 1 flow entries have been shown.

この追加のconntrackエントリのrouter2ため。agent2router1

ip netns exec agent2 nc -u -p 55555 192.168.0.1 55555
> SECOND PACKET

インターフェイスSECOND PACKETに到着した後、消えて送信されず、到着しません。router2 r2-intr2-extrouter1

iptables私のルールはあまりにも一般的で、もう少し選択的でなければならないと思います(https://superuser.com/questions/1706874/iptables-selective-masquerade)。しかし、ソースアドレスの一致のみを試しましたが、-s 10.0.0.0/24まだ同じ動作が発生しました。

iptables設定から何かが落ちましたか?router2から送信されたパケットにconntrackエントリが生成されないようにするにはagent1

答え1

部分的な答え:

より一般的なルールを使用して、私のシステムで双方向に動作させることができます。転送を有効にする

echo "1" | ip netns exec router1 tee /proc/sys/net/ipv4/ip_forward
ip netns exec router1 iptables -t nat -A POSTROUTING -o r1-ext -j MASQUERADE 

echo "1" | ip netns exec router2 tee /proc/sys/net/ipv4/ip_forward
ip netns exec router2 iptables -t nat -A POSTROUTING -o r2-ext -j MASQUERADE 

ncその後、外部インターフェイスの2つのルータ(別のxterm)から起動できます。

ip netns exec router1 nc -u -l 192.168.0.1 -p 5555
ip netns exec router2 nc -u -l 192.168.0.2 -p 5555

そして、プロキシが「リモート」ルーターに接続するようにします。

echo foo | sudo ip netns exec agent1 nc -u 192.168.0.2 5555
echo foo | sudo ip netns exec agent2 nc -u 192.168.0.1 5555

Pingまた動作します。

したがって、conntrackエントリを「追加」しても、リバースパケットは「ブロック」されません(そしてあなたのコンピュータに正確に何が問題なのかわかりません)。

発信接続のみを転送できるようにするのも標準的な方法です(発信パケットに対してNATを実行しているため)。

ip netns exec router1 iptables -P FORWARD DROP
ip netns exec router1 iptables -A FORWARD -i r1-ext -o r1-int -m state --state ESTABLISHED,RELATED -j ACCEPT
ip netns exec router1 iptables -A FORWARD -i r1-int -o r1-ext -j ACCEPT

ip netns exec router2 iptables -P FORWARD DROP
ip netns exec router2 iptables -A FORWARD -i r2-ext -o r2-int -m state --state ESTABLISHED,RELATED -j ACCEPT
ip netns exec router2 iptables -A FORWARD -i r2-int -o r2-ext -j ACCEPT

ただし、これらのフィルタを使用しても、2番目のconntrackエントリは引き続き生成されます。理由はわかりませんが、正常に動作するのを妨げないので、期待どおりに動作すると仮定します。接続がまったく発生しなくても、潜在的な接続を追跡できるようにパケットが記憶されます。

関連情報