web-dev-qa-db-ja.com

透過的なプロキシは、MacOS X 10.6 Snow Leopard(およびおそらくFreeBSD)でSYN_RCVDを使用してソケットを残します

Linuxから sshuttle sshベースのトランスプロキシVPN を移植するために、MacOSマシンで透過プロキシを作成しようとしています。私はほぼ動作していると思いますが、残念ながら、ほぼ100%ではありません。

ショートバージョンはこちらです。 1つのウィンドウで、ポート12300でリッスンするものを開始します。

$ while :; do nc -l 12300; done

次に、プロキシを有効にします。

# sysctl -w net.inet.ip.forwarding=1
# sysctl -w net.inet.ip.fw.enable=1
# ipfw add 1000 fwd 127.0.0.1,12300 log tcp from any to any

そして今それをテストしてください:

$ telnet localhost 9999   # any port number will do
  # this works; type stuff and you'll see it in the nc window

$ telnet google.com 80    # any Host/port will do
  # this *doesn't* work!

後者の実験の後、netstatに次のような行が表示されます。

$ netstat -tn | grep ^tcp4
tcp4       0      0  66.249.91.104.80       192.168.1.130.61072    SYN_RCVD
tcp4       0      0  192.168.1.130.61072    66.249.91.104.80       SYN_SENT

2番目のソケットは私のtelnetプログラムに属しています。最初のものはより疑わしいです。 SYN_RCVDは、SYNパケットがファイアウォールによって正しくキャプチャされ、カーネルによって取り込まれたことを意味しますが、SYNACKはまだSYN_SENTにあるため、telnetに返送されなかったようです。

一方、ncサーバーを強制終了すると、次のようになります。

$ telnet google.com 80
Trying 66.249.81.104...
telnet: connect to address 66.249.81.104: Connection refused
telnet: Unable to connect to remote Host

...これは予想どおりです。プロキシサーバーが実行されていないため、ipfwは接続をポート12300にリダイレクトします。ポート12300には、誰もリッスンしていません。接続拒否。

私のunameはこれを言います:

$ uname -a
Darwin mean.local 10.2.0 Darwin Kernel Version 10.2.0: Tue Nov  3 10:37:10 PST 2009; root:xnu-1486.2.11~1/RELEASE_I386 i386

誰かが別の結果を見ていますか? (Snow Leopardバージョンではトランスプロキシが壊れているというインターネットの噂があるようですので、Snow LeopardとLeopardの結果に特に興味があります)修正方法について何かアドバイスはありますか?

1
apenwarr

とった! Snow Leopardのバグなのか、それとも新しいセキュリティ機能なのかはわかりません。しかし、誰か シャトルメーリングリストに投稿されました 問題の修正、これは単にこれです:

sysctl -w net.inet.ip.scopedroute=0

そのコマンドを実行すると、上記の一連のコマンド(上記の質問)がMacOS10.5の場合と同じように正しく機能します。したがって、透過的なプロキシが再び機能します。

2
apenwarr

私ができる唯一のことはここで推測することです、ちょっとこじ開けるだけです:P

したがって、私の推測では、Averyの10.2にはまだバグのパッチが適用されていません: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/133732

Kerneltrap.org/mailarchive/freebsd-current/2007/11/20/431855でも説明されています

10.5はすでにですが。ダーウィンのリリース日を考えると、私には理にかなっています。 emasteが古いバージョンでもいつ実行するかがわかると思います。とにかく、私はBSDやDarwinを実行していません。エイブリーのブログの投稿からこれに入っただけです:P

0
eduardok

私はこのようなことをしているときにipfwであらゆる種類の奇妙な問題に遭遇しました、そして通常その理由はあなたが本当に1つだけを意味したときに物事が両方向に同じルールを通過するという事実に関連しています。流用ルール+ natdは、正しく理解するのが特に難しい場合があります。

今のところそれで遊ぶ時間はありませんが、telnet-> {everything}からのパケットがfwdルールにヒットするが、nc-> telnetパケットにはヒットしないルールセットを作成してみてください。

0
Adrian Dewhurst