web-dev-qa-db-ja.com

iptables -j REDIRECTはパケットヘッダーに対して*実際に*何をしますか?

好奇心から、透過的なTORプロキシに関するチュートリアルをいくつか読んでいます。これは、ネットワーキングの観点からは非常に興味深いトピックであるためです。 tun/tapインターフェイスを使用するだけで完全に明確なVPNゲートウェイとは対照的に、TORプロキシは単一のポートを使用します。すべてのチュートリアルは魔法の行を繰り返します:

iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040

ここで、eth0は入力(LAN)インターフェイスであり、9040はTORポートです。ネットワーキングの観点から、そのようなことがまったく意味をなさない理由はまったくわかりません。

redirect/dst-natチェーン、および物理ルーターでの動作のように見える私の理解によると、dst-natチェーンはdst-portおよびdst-addr[〜#〜] before [〜#〜]ルーティング決定が行われ、それらが別の何かに変更されます。だから例えば:

  • dst-natより前:192.168.1.2:46364 -> 88.88.88.88:80
  • dst-nat以降:192.168.1.2:46364 -> 99.99.99.99:8080

そして99.99.99.99:8080は、IPパケットフローレーンのさらなるチェーン(たとえば、filterテーブル)であり、これは、たとえば、デバイスを離れた後のパケットの外観です。

現在、このスタックエクスチェンジを含むインターネット上の多くの人々が、redirectdst-natと基本的に同じであり、dst-addrがインターフェイスのローカルアドレスに設定されていると主張しています。そのような観点から、このルールは:

iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040

明らかに意味がありません。それがそのように機能する場合、TORは宛先127.0.0.1:9040allパケットを取得します。アプリがパケットを受け取り、何らかの形でそれに応答する典型的なアプリケーション(Webサーバーなど)の場合、結局のところ、そのようなサーバープロセスがパケットの最終的な宛先であり、宛先アドレスがlocalhostであっても問題ないため、それは完全に意味があります。しかし、TORルーターはまあ...ルーターなので、パケットの元の宛先を知っている必要があります。何か不足していますか? DNATは、ローカルアプリケーションが受け取るものに影響しませんか?それとも、REDIRECTディレクティブの特定の動作ですか?

7
Lapsio

この答えを見てください: 透過SOCKSプロキシはどの宛先IPを使用するかをどのようにして知るのですか?

引用:

iptablesは元の宛先アドレスを上書きしますが、古いアドレスを記憶しています。アプリケーションコードは、特別なソケットオプションSO_ORIGINAL_DST

3
user280720

実際、あなたはTORについて正しく、受信したすべてのtcpパケットはlocalhost:9040にリダイレクトされます。

ターゲットREDIRECTはDNATターゲットの特別なタイプであり、IPアドレスをローカルインターフェイスに変更し、指定したポートにマップします。

LANインターフェースがeth0(ネットワーク192.168.1.0/24およびIPアドレス:192.168.1.1)であるルーターがあり、このルーターのiptablesルールが次のとおりであるとします。

iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040

その後、LAN内のクライアントからのすべてのTCPパケットは192.168.1.1:9040にリダイレクトされます。

LAN内のクライアント(IPアドレス192.168.1.2)からgoogle.comへのTCP接続があると仮定します(IP:8.8.1.1と仮定します)。

生のリクエスト:192.168.1.2:12345 -> 8.8.1.1:80

ルーターの事前ルーティングチェーンの後:192.168.1.2:12345->192.168.1.1:9040

0
Jichao