次の非常に簡単なシナリオで私のエラーを特定しようとしています。
|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です。