web-dev-qa-db-ja.com

iptablesポートミラーリング

ポート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
8
Parikshit

--teeフラグはDNATチェーンの一部ではなく、ROUTEの一部です。 -j ROUTEの宣言の後にのみ使用できます。次のように、iptablesから特定のヘルプを取得できます。

 $ iptables -j ROUTE help

私はあなたのiptablesコマンドを見ていましたが、それは私には意味がありません。質問で「packegs received on port」と言ったのに、なぜパケットの送信元および送信元ポートと照合しようとしているのですか?着信トラフィックを分割して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
6
Caleb

Caleb の回答に加えて、iptablesターゲットがなくなった新しいROUTE(v1.4.14)を使用している場合は、次のようなものが必要になります。 、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番目のターミナルウィンドウでEnterキーを押すと、2番目のターミナルウィンドウに入力したテキストが最初のターミナルウィンドウに表示されます。 2番目のウィンドウでCtrl- cを押して、セッションを終了します。


*この構文はRHEL/Centos(6.5以前)ではサポートされていません: したがって、socatを使用して元のポートの着信パケットを2つの新しいポートに転送します。元の受信ポートでリッスンしているプロセスがある場合、socatがリスナーになるので、それらをtee'dポートの1つでリッスンするように再構成する必要があります。元のポート。ポートクローンのsocat構文の例---(このSEの投稿 を参照してください。