透過モードでは、次の iptable ルールを使用してトラフィックを squid にリダイレクトします。
iptables -I PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 3128
私の知る限り、REDIRECT は宛先 IP アドレスをローカル インターフェイスの IP に変更します。
では、トラフィックが squid に到達したとき、宛先 IP が変更されているため、squid はトラフィックをどこに転送するかをどのようにして知るのでしょうか?
答え1
を使用すると、Squid は本来意図されていた宛先 IP を確認できないのは正しいですREDIRECT
。代わりに、HTTP ヘッダーでクライアントによって提供されたホストを解決しますHost:
。これは、HTTP 1.1 では必須です。
答え2
それはゲートウェイと非常によく似ています。
クライアント ホストが宛先ホストの場所を知らない場合、パケットはデフォルト ゲートウェイに送信されます。ゲートウェイは、そのパケットを送信する場所を定義します。
透過プロキシも同様です。xxx.xxx.xxx.xxx:80 へのすべてのパケットは、パケット ヘッダーに記載されているポートではなく、ポート 3128 に転送されます。Squid はパケットとそのヘッダー、src
およびdst
対応するポートを分析し、ゲートウェイと同様にパケットを送信するか、以前にキャッシュされていた場合はすぐに応答を送信します。
主な考え方は、パケットが転送中に異なるホスト/ポートにルーティングされる一方で、宛先ポートが各パケット内に格納されることです。