好奇心から、透過的な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
テーブル)であり、これは、たとえば、デバイスを離れた後のパケットの外観です。
現在、このスタックエクスチェンジを含むインターネット上の多くの人々が、redirect
はdst-nat
と基本的に同じであり、dst-addr
がインターフェイスのローカルアドレスに設定されていると主張しています。そのような観点から、このルールは:
iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
明らかに意味がありません。それがそのように機能する場合、TORは宛先127.0.0.1:9040
のallパケットを取得します。アプリがパケットを受け取り、何らかの形でそれに応答する典型的なアプリケーション(Webサーバーなど)の場合、結局のところ、そのようなサーバープロセスがパケットの最終的な宛先であり、宛先アドレスがlocalhostであっても問題ないため、それは完全に意味があります。しかし、TORルーターはまあ...ルーターなので、パケットの元の宛先を知っている必要があります。何か不足していますか? DNAT
は、ローカルアプリケーションが受け取るものに影響しませんか?それとも、REDIRECT
ディレクティブの特定の動作ですか?
この答えを見てください: 透過SOCKSプロキシはどの宛先IPを使用するかをどのようにして知るのですか?
引用:
iptablesは元の宛先アドレスを上書きしますが、古いアドレスを記憶しています。アプリケーションコードは、特別なソケットオプションSO_ORIGINAL_DST
。
実際、あなたは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