localhost
にローカルの透過的なTCPプロキシを設定しました 。すべての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
)にのみリダイレクトする必要があるのはなぜですか )?
すべてのTCPパケットをリダイレクトしたい。現在の構成では、SYNパケットのみがローカルプロキシにリダイレクトされているように見えます。
他のすべてのパケットは宛先に直接流れることが許可されており、(理論的には)完全な混乱につながります(またはSYNを除くすべてのパケットがフィルタテーブルによってブロックされます。
ただし、--syn
を削除すると オプションですべてのパケットをローカルプロキシにリダイレクトすると、プロキシはまったく機能しません。なぜですか?
2)フィルターテーブルの4番目のルールに関して、確立された発信接続を明示的に許可する必要があるのはなぜですか? プロキシは、とにかくローカルホスト以外の宛先にパケットを送信することを許可されている唯一のアプリケーションであり、すでに送信が許可されています(ルール3)。では、4番目のルールは何のために必要ですか?非プロキシ接続でプロキシを回避できるようです。
ありがとうございます!
承認された回答:
質問の両方の部分がリンクされています。
パート(1)は、SYNパケットをキャプチャし、提案どおりにリダイレクトします。この時点から、conntrack(2)が引き継ぎ、そのストリーム内の後続の各パケットが同じ接続の一部であることを認識し、元のSYNパケットと同じ方法でリダイレクトします。
関連:実行中のプロセスの環境を変更しますか?接続追跡の概要は、http://en.wikipedia.org/wiki/Netfilter#Connection_Tracking
にあります。