IPTableと透明プロキシ

IPTableと透明プロキシ

にローカル透過TCPプロキシを設定しましたlocalhost。すべてのTCPトラフィックを適切なプロキシにリダイレクトして処理でき、何も「漏れない」ようにしてプロキシをバイパスしたいと思います。トラフィックをリダイレクトするにはIPTableを使用する必要があります。 TPROXYの使用を検討しましたが、これにはアプリケーションサポートが必要で、現在はREDIRECTターゲットのみをサポートしています。

次のIPTablesルールを使用しました。

iptables -t nat -A OUTPUT -o lo -j RETURN
iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
iptables -t nat -A OUTPUT -m owner --uid-owner proxy-owner -j RETURN
iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $PROXY_PORT

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner proxy-owner -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j LOG
iptables -P OUTPUT DROP

それら〜らしいうまくいくのになぜそうなのか気になります。

まだ答えがわからない2つの質問は次のとおりです。

1) NAT テーブルの最後のルールについて、--synSYNパケットをローカルプロキシポート()にのみリダイレクトしたいのはなぜですか? すべてのTCPパケットをリダイレクトしたいと思います。現在の設定では、SYNパケットのみがローカルプロキシにリダイレクトされ、他のすべてのパケットは宛先に直接流れることが許可されており(理論的には)完全な混乱を招くように見えます(またはSYNを除くすべてのパケットはフィルタリングされたデバイスブロックです)。ただし、その--synオプションを削除してすべてのパケットをローカルプロキシにリダイレクトすると、プロキシはまったく機能しません。なぜ?

2)フィルタテーブルの4番目の規則について、発信確立された接続を明示的に許可する必要があるのはなぜですか。とにかく、プロキシはローカルホストではなく宛先にパケットを送信できる唯一のアプリケーションであり、すでにそうすることが許可されています(ルール3)。それでは、4番目の規則で何をすべきですか?非プロキシ接続がプロキシをバイパスできるようにするようです。

ありがとうございます!

答え1

答え:

  1. SYNのみを一致させるには2つの理由があります。まず、後で設定されたすべてのパケットはconntrack(ユーザーが要求した2行目)を介して転送されます。何でもいいえSYN 以外の conntrack と一致するのは未確立のパケットであり、属していません。したがって、この時点では無視され、最終的にフィルタテーブルの最後のルールによって削除されます。これは、ユーザーアクティビティからエージェントプロセスを保護する方法です。たとえば、一部の種類のネットワーク検索は、リモートデバイスがどのように反応するかを確認するためにACKまたはFIN送信を開始しますが、一部のアプリケーションは、誤ったフォーマット/予期しないパケットを受信したときにひどく停止します。

  2. 追跡されたトラフィックを明示的に許可するのはなぜですか?最後の行はすべてを無差別に捨てるからです。 Discardをそのままにしてconntrackを削除すると、プロキシクライアント通信用のパケットが破棄されます。ここには非常に微妙な違いがあります。 uid 所有者に基づいて一致する行は、パケットとのみ一致します。作成済み代理所有者別。クライアントからプロキシに送信される受信パケットは次のとおりです。いいえ代理人が所有します。

次の図を考えてみましょう。

[ client ] <---traffic---> [ proxy ] <---traffic---> [ target ]

左側にはクライアントとプロキシ間のトラフィックがあります。いいえエージェントが所有しているため(システム外の信頼できないソースによって生成される)、フィルタライン3と一致しません。つまり、フィルタライン4がない場合、フィルタライン6によって削除される。

正しいプロキシと宛先間のトラフィックはいエージェントが所有しているので(ローカルUIDで実行されるプロセスによって生成されます)、常にnat行4とフィルタ行3で許可されます。

あなたの場合はすべてローカルで実行されるため、これが最善の方法ではない可能性があります。さまざまな方法でiptablesルールを作成できます。結局、これはまだ効果があるでしょう。 iptablesについてもっと知っていれば、ルールを変更できますが、そのままにしておくこともできます。

これが役に立つことを願っています。これはかなり複雑なトピックです。

答え2

質問の両方が関連しています。

パート(1)はSYNパケットをキャプチャし、提案どおりにリダイレクトします。この時点から、conntrack(2)は、ストリーム内のすべての後続のパケットが同じ接続の一部であることを引き継ぎ、認識し、元のSYNパケットと同じ方法でリダイレクトします。

接続追跡の概要は、以下で確認できます。http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking

答え3

トラフィックをリダイレクトするには、iptablesを使用する必要があります。

いいえ。このホストがインターネットにアクセスできる唯一のホストになるようにネットワークを設定し、他のすべてのホストにルーターとして使用するように指示します。

必要なもう1つはNAT /マスクです。これをプロキシとして機能させることは愚かなことです。

関連情報