ポート8001で受信したパケットのコピーをポート8002にインポートできる必要があります。次の試みたが--tee未定義のエラーが発生します。
sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
答え1
さらに進むガレブiptables
答え、もはや対象外の最新バージョン(v1.4.14)を使用している場合は、ROUTE
Debian Wheezy*でテストしてください。
iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
「netcat」()を使ってman nc
テストします。ターミナルウィンドウに次のように入力し、キーを押しますEnter
。
nc -l 8002
このコマンドは、2番目の端末ウィンドウに入力した入力を待ちます。
2番目の端末ウィンドウに次のように入力し、[次へ]をEnter
クリックします。
nc 127.0.0.1 8001
コマンドは追加の入力を待ちます。何かを入力してEnter
キーを押します。 2番目の端末ウィンドウでキーを押した後、2番目の端末ウィンドウEnter
に入力したテキストが最初の端末ウィンドウに表示されます。Ctrl
セッションを終了するには、2番目のウィンドウで-cを押します。
*この構文はいいえRHEL / Centos(6.5以下)でサポートされています:-(したがって、socat
teeを使用して元のポートから着信パケットを2つの新しいポートに転送する必要があります。元の着信ポートでリッスンするプロセスがある場合は、リッスンするように再構成する必要があります。socat
現在、元のポートのリスナーと同様に、転送されたポートの1つです。このSEポストたとえば、socat
ポート複製構文があります。
答え2
この--tee
フラグはDNATチェーンの一部ではなく、ROUTEの一部です。宣言した後にのみ使用できます-j ROUTE
。次のように、iptablesでこのトピックに関する具体的なヘルプを入手できます。
$ iptables -j ROUTE help
私はあなたのiptablesコマンドを見ていますが、それは私には意味がありません。質問に「受信パケット」と言うとき、パケットの送信元ポートと送信元ポートを一致させたいのはなぜですか?存在する着信トラフィックを2つのポートに分割したいのですか、それとも1つのポートの出力を別のポートの入力に接続したいですか?
前者の場合、実際には2つのステップがあります。 tee を使用してパケットのコピーを取得すると同時に、パケットが破損してポート番号を変更することはできません。まず、自分にパケットのコピーを送信してから、そのコピーのみを一致させ、宛先ポートを変更する2つの手順でこれを試すことができます。警告:テストされていません。次の疑似コードを検討してください。
$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002