iptablesポートミラーリング


8

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

カーネルまたはiptables古すぎる可能性があります。2つのインターネット接続を介して重複パケット
Gilles「SO-邪悪なことをやめよう」

この質問は、ここで回答されていますsuperuser.com/questions/753294/mirror-port-via-iptables/...
パット

回答:


6

--teeフラグは、ルートの一部である、DNATチェーンの一部ではありません。の宣言の後にのみ使用でき-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

1
警告...別のサイト訪問者は、これと同様のバージョンが実際に無限ループを引き起こすことを指摘しています!おそらく、同じアクションで複製されたパケットにタグを付ける方法を理解してから、タグを照合する必要があります。
カレブ

ROUTEは時代遅れのようですよね?
デイジー

それは単なるタイプミス、172.0.0.1-> 127.0.0.1です。
アキ

1
NBからSEの読者:ROUTE上記の回答で使用されていたターゲットは、この記事の執筆時点では廃止されており、最新のディストリビューションのiptablesでは使用できません。serverfault.com/questions/333155/…を
Jonathan Ben-Avraham

6

さらににカレブの答え、あなたが新しいで作業している場合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キーを押します。あなたが押した後にEnter第二ターミナルウィンドウでキーを、あなたは第二ターミナルウィンドウに入力したテキストは、最初のターミナルウィンドウに表示されます。Ctrl2番目のウィンドウで-cを押して、セッションを終了します。


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


debianの何らかの理由で、netcatでポートを明示的に指定する必要がありますnc -l -p 8002
Marcelo Lacerda '25

私はMint 19 Tessaでこのソ​​リューションを再現しようとして、役に立たなかった。一部のパッケージが内部で跳ね返り、2つのポートの1つだけがパッケージを受信することがわかりました。ルールをトラブルシューティングするためにロギングを追加するのを間違えた場合、ログ(カーネル、syslog、ジャーナル)はすぐにストレージを使い果たします。
hanzo2001

DNATがOUTPUTチェーンに設定されている理由もわかりません。パッケージはすでにプロセスを外部に任せていませんか?またはループバックアドレスの動作は異なりますか?
hanzo2001
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.