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の結果に特に興味があります)修正方法について何かアドバイスはありますか?
とった! Snow Leopardのバグなのか、それとも新しいセキュリティ機能なのかはわかりません。しかし、誰か シャトルメーリングリストに投稿されました 問題の修正、これは単にこれです:
sysctl -w net.inet.ip.scopedroute=0
そのコマンドを実行すると、上記の一連のコマンド(上記の質問)がMacOS10.5の場合と同じように正しく機能します。したがって、透過的なプロキシが再び機能します。
私ができる唯一のことはここで推測することです、ちょっとこじ開けるだけです: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
私はこのようなことをしているときにipfwであらゆる種類の奇妙な問題に遭遇しました、そして通常その理由はあなたが本当に1つだけを意味したときに物事が両方向に同じルールを通過するという事実に関連しています。流用ルール+ natdは、正しく理解するのが特に難しい場合があります。
今のところそれで遊ぶ時間はありませんが、telnet-> {everything}からのパケットがfwdルールにヒットするが、nc-> telnetパケットにはヒットしないルールセットを作成してみてください。