在MacOS X 10.6 Snow Leopard(也许是FreeBSD)中,透明代理使用SYN_RCVD插槽,

我试图在我的MacOS机器上创build一个透明代理,以便从Linux 移植基于sshuttle ssh的transproxy VPN 。 我觉得我差不多有这个工作,但可悲的是,几乎不是100%。

简短的版本是这样的。 在一个窗口中,启动在端口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 

现在testing一下:

 $ 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 

第二个套接字属于我的telnet程序; 第一个更可疑。 SYN_RCVD意味着我的SYN数据包已被防火墙正确捕获并被内核接收,但显然SYNACK从未被发送回telnet,因为它仍然在SYN_SENT中。

另一方面,如果我杀死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 

…这是预期的:我的代理服务器没有运行,所以ipfwredirect我的连接端口12300,没有人在监听,即。 拒绝连接。

我的昵称是这样的:

 $ 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 vs Leopard的结果特别感兴趣,因为似乎有一些networking传言说,在Snow Leopard版本中,transproxy被破坏了)任何有关如何修复的build议?

得到它了! 我不确定这是否是Snow Leopard中的错误,或者是一些新的安全function。 但是有人在sshuttle邮件列表上发布了这个问题的解决方法,简单地说就是:

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

运行该命令可以使上述命令(在上面提到的问题中)与MacOS 10.5中的命令一样正常工作。 因此,透明的代理再次工作。

在做这样的事情的时候,我碰到了各种各样的ipfw奇怪的问题,通常这个原因是事实是事物在两个方向上都经历了相同的规则,当你真的只是一个意思。 转移规则+ natd可以特别棘手得到正确的。

我现在没有时间去玩,但是你可能想尝试制作一个规则集,使得来自telnet – > {everything}的数据包能够达到fwd规则,而不是nc – > telnet数据包。

我能做的唯一事情就是在这里猜测,只是撬一下:P

所以,我的猜测是,艾利的10.2还没有补丁的错误: http ://www.freebsd.org/cgi/query-pr.cgi?pr=kern/ 133732

也在kerneltrap.org/mailarchive/freebsd-current/2007/11/20/431855中有描述

而10.5已经是了。 对于达尔文的发行date,我有意义。 我想我们会发现什么时候emaste也运行在一些旧版本。 无论如何,我不会运行一个BSD或达尔文,刚刚从艾利的博客文章:P