ネットワークネームスペース内でNAT /ルーター設定をシミュレートしていますが、外部WANインターフェイスからルーターに送信されたパケットでconntrackエントリが生成される奇妙な動作に直面しました。これらのconntrackエントリは、内部インターフェイスから外部インターフェイスにパケットが転送されるときにのみ生成されるべきであると予想しました(これは、外部ネットワークから内部ネットワークを保護するNAT機能を実行します)。
私の状況は次のとおりです。
上記のアーキテクチャイメージは少し古いものです。私は代わりに192.168.0.1
andを使用しています。192.168.0.2
198.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
agent1
tomeから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
ため。agent2
router1
ip netns exec agent2 nc -u -p 55555 192.168.0.1 55555
> SECOND PACKET
インターフェイスSECOND PACKET
に到着した後、消えて送信されず、到着しません。router2
r2-int
r2-ext
router1
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エントリは引き続き生成されます。理由はわかりませんが、正常に動作するのを妨げないので、期待どおりに動作すると仮定します。接続がまったく発生しなくても、潜在的な接続を追跡できるようにパケットが記憶されます。