ローカルの透過的なTCPプロキシをlocalhost
に設定しました。すべてのTCPトラフィックをこのプロキシにリダイレクトしたいので、トラフィックをリダイレクトするためにIPTablesを使用する必要があります。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テーブルの最後のルールに関して、SYNパケットをローカルプロキシポート(--syn
)にのみリダイレクトするのはなぜですか? I ALL TCPパケットをリダイレクトしたい。現在の構成では、SYNパケットのみがローカルプロキシにリダイレクトされ、他のすべてのパケットは宛先に直接流れることが許可されているようです。理論)を完全に混乱させます(またはSYNを除くすべてがフィルターテーブルによってブロックされます)。ただし、--syn
オプションを削除し、すべてのパケットをローカルプロキシにリダイレクトすると、プロキシがまったく機能しません。なぜですか。
2)フィルターテーブルの4番目のルールに関して、確立された発信接続を明示的に許可する必要があるのはなぜですか?プロキシは、ローカルホスト以外の宛先にパケットを送信できる唯一のアプリケーションであり、すでにそうすることが許可されているので(ルール3)、4番目のルールは何のために必要ですか?非プロキシ接続でプロキシを回避できるようです。
ありがとうございました!
あなたの質問の両方の部分がリンクされています。
パート(1)は、SYNパケットをキャプチャし、提案どおりにリダイレクトします。この時点から、conntrack(2)が引き継ぎ、そのストリーム内の後続の各パケットが同じ接続の一部であることを認識し、元のSYNパケットと同じ方法でリダイレクトします。
接続追跡の概要は http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking にあります。
回答:
SYNのみを照合する理由は2つあります。まず、後続の確立されたすべてのパケットがconntrack(あなたが質問した2行目)を通過します。 not conntrackと一致し、SYNでもないものはすべて、確立されていないパケットであり、属していません。したがって、この時点では無視され、最終的にフィルターテーブルの最後のルールによって最終的に削除されます。これは、プロキシプロセスをユーザーのアクティビティから保護する方法です。たとえば、一部の形式のネットワークプローブは、リモートがどのように反応するかを確認するためだけにACKまたはFINで送信を開始し、一部のアプリケーションは、不正な形式のパケットや予期しないパケットを受信するとひどく死にます。
なぜconntrack-edトラフィックを明示的に許可するのですか?最後の行が無差別にすべてをドロップするからです。ドロップを終了してconntrackを削除すると、プロキシからパケットがドロップされ、クライアントと通信します。ここには非常に細かい違いがあります。 uid所有者に基づいて一致する行は、プロキシ所有者によってパケットにのみ一致します生成。プロキシに配信されるクライアントからの着信パケットはnotプロキシによって所有されます。
次の図を検討してください。
[ client ] <---traffic---> [ proxy ] <---traffic---> [ target ]
クライアントとプロキシの間の左側のトラフィックないプロキシが所有している(システム外の信頼できないソースによって作成された)ため、フィルタライン3と一致しません。つまり、フィルタラインがありません。 4フィルターライン6によってドロップされます。
プロキシとターゲットの間の右側のトラフィックisプロキシが所有しているため(ローカルUIDで実行されているプロセスによって作成された)、したがって、nat行4とfilter行3によって常に許可されます。
特にあなたの場合、すべてローカルで実行されているため、これは最善のアプローチではない可能性があります。 iptables
ルールをロールする方法は無数にあります。結局のところ、これはまだあなたのために働くはずです。 iptablesについてもっと学ぶなら、ルールをマッサージすることができますが、そのままにしておくこともできます。
これがお役に立てば幸いです。それはかなり複雑なトピックです。
トラフィックをリダイレクトするためにiptablesを使用する必要があります
いいえ-ネットワークを設定しただけなので、これがインターネットにアクセスできる唯一のホストであり、他のすべてのホストにルーターとして使用するように指示します。
あなたが必要とする他のものはただNAT /マスカレードです-それをプロキシとして振る舞わせることを試みることはただばかげています。