iptables DNAT + SNAT:同じUDPデータグラムの不要な冗長(および失敗)

iptables DNAT + SNAT:同じUDPデータグラムの不要な冗長(および失敗)

次の非常に簡単なシナリオで私のエラーを特定しようとしています。

|peerA|(Aip:Aport) <--> (Bdev:Bip:Bport)|NatNode|(Cdev:Cip:Cport) <--> (Dip:Dport)| peerD

(ピアAはデータグラムをBip:Bportに送信し、NatNodeはそれをCip:Cportが送信したデータグラムに変換してDip:Dportに送信します。逆の場合も同様です。)

空のiptablesと「バニラ」ルーティングテーブルを使って私がしたことは次のとおりです。

iptables -p udp -t nat -A PREROUTING -s Aip -d Bip -i Bdev --destination-port Bport -j DNAT --to-destination Dip:Dport

iptables -p udp -t nat -A POSTROUTING -s Aip -d Dip -o Cdev --destination-port Dport -j DNAT --to-source Cip:Cport

(リバースルールと-t natと-t filterのデフォルトターゲットごとに1つのLOGターゲットを含む)

私が期待するものは次のとおりです。 - 正しい書き換え(wiresharkに示されているようにOK) - 各受信パケットはPREROUTING(ルーティング決定、おそらくCdevへ)通過から来ます。一度進む(ルーティング決定、可能であればCdevへ)、その後配線は一度、その後、ネットワークに入ります。

私が得るものは(ロギングチェック)です。 1.最初のパケットはPREROUTINGを1回通過し、フィルタリング/1トン進む回(例えば、同じパケットID)、その後後半の作業がたくさん必要その後、リモートピアはそれを受信するネットワークに一度送信されます。 2. 2番目のデータグラムから始めると、すべてが起こるように見えますが、変換されたデータグラムは発行されないデバイスから。 3. 十分に長い(たとえば、15秒以上)待ってからやり直すと、ヘッダーデータグラムの新しいシーケンスは1のように動作し、2番目から2のように動作します。

また、-iと-oオプションを削除してみましたが、何も変更されていないようです。

私がここで何を間違っているのか?

問題が見つかりません。 「予想通り」行ったようです。本能的には、ルーティング決定ポイントに問題があると思われます。おそらく、2のようなパケットはLinuxのいくつかの保護動作によって送信されないかもしれません。 TCP / IPスタック用...

私はそれが私のせいであると確信していますが、どこにいるのかわかりません。

ご協力ありがとうございます!

ベストアンサー1

Dipに対してクラシックNATを実行し、Dportに対してポート転送を実装するには、特別なPOSTROUTINGルールは必要なく、通常の-j MASQUERADEを追加するだけです。

そして..ポストルーティングのDNAT?タイプミスを出しましたか?

私は通常、次のようにクラシックNATを実装しています(ブロックファイアウォールが設定され、conntrackがすべての「応答」パケットを撤回すると仮定します)。

iptables -I POSTROUTING -o ppp0 -j MASQUERADE

iptables -I FORWARD -i eth0 -o ppp0 -j ACCEPT

iptables -I PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to local_ip:80

ここで、eth0はlocal_ipと同じサブネット上のローカルiface、ppp0はインターネットifaceです。

おすすめ記事