Tap1から出るすべてのUDPトラフィックを傍受したいと思います。たとえば、DNS要求に応答できます。これを達成するために、localhostを受け取り、使用するPythonコードを書いた。iptablesルールセットは次のとおりです。
チェーンPREROUTING(ポリシーは2つのパケット、333バイトを許可します) pkts byte target prot は出力ソースターゲットを選択します。 0 0 DIVERT udp - ソケット どこでも tap1 0 0 TPROXY udp - どこでも tap1 TPROXY リダイレクト 127.0.0.1:5001 タグ 0x1/0x1 チェーンDIVERT(参照1個) pkts byte target prot は出力ソースターゲットを選択します。 0 0 MARK udp - MARKが0x1に設定されているすべての場所 0 0 UDPを許可 - どこでもどこでも
ポリシールーティングは、次の方法で実行されます。
100を見つけるには、IPルールにfwmark 1を追加してください。 IPルーティングはローカル0.0.0.0/0 dev loテーブル100を追加します。
この設定は、カーネルの Documentation/networking/tproxy.txt で適用されます。これは、IP_TRANSPARENTオプションで開かれたTCPソケットで完全に機能します。
残念ながら、UDPソケットが接続を処理できないようです。たとえば、これを行うとncat -u localhost 1234
ソケットがデータを受け取りますが、何も送信できません。 Wiresharkは正確に3つのパケットを表示します。
- 着信ncatパケット(localhost:1234へ)
- 私のソフトウェアから出るパケット(ターゲット:5001)
- ICMPポートにアクセスできません(もちろん)。
任意のポートが機能するために適切な(S)NATtingルールを設定することは不可能です。
それでは、これを機能させるために必要な設定は何ですか?普段着着信ポート?