すべてのポートでUDPをリダイレクトするTPROXY

すべてのポートでUDPをリダイレクトするTPROXY

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つのパケットを表示します。

  1. 着信ncatパケット(localhost:1234へ)
  2. 私のソフトウェアから出るパケット(ターゲット:5001)
  3. ICMPポートにアクセスできません(もちろん)。

任意のポートが機能するために適切な(S)NATtingルールを設定することは不可能です。

それでは、これを機能させるために必要な設定は何ですか?普段着着信ポート?

関連情報