在 MacOS X 10.6 Snow Leopard(可能还有 FreeBSD)中,透明代理使用 SYN_RCVD 留下套接字

在 MacOS X 10.6 Snow Leopard(可能还有 FreeBSD)中,透明代理使用 SYN_RCVD 留下套接字

我正在尝试在我的 MacOS 机器上创建一个透明代理,以便移植 sshuttle 基于 ssh 的 transproxy VPN来自 Linux。我认为我几乎让它工作,但遗憾的是,几乎没有达到 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

现在测试一下:

$ 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

...这与预期一致:我的代理服务器没有运行,因此 ipfw 将我的连接重定向到端口 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 与 Leopard 的结果特别感兴趣,因为网上似乎有传言说,Transproxy 在 Snow Leopard 版本中被破坏了)有什么修复建议吗?

答案1

明白了!我不确定这是 Snow Leopard 的一个错误,还是某个新的安全功能。但有人发布到 sshuttle 邮件列表问题的解决方案很简单:

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

运行该命令可使上述命令集(在上面发布的问题中)像在 MacOS 10.5 中一样正常工作。因此,透明代理再次起作用。

答案2

在执行此类操作时,我遇到了 ipfw 的各种奇怪问题,通常原因与以下事实有关:事情在两个方向上都通过相同的规则,而你实际上只想一个。转移规则 + natd 尤其难以正确实现。

我现在没有时间去玩它,但是你可能想尝试制定一个规则集,使来自 telnet -> {everything} 的数据包符合 fwd 规则,但不使 nc -> telnet 数据包符合。

答案3

我唯一能做的就是猜测,只是打探一下: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 已经是了。考虑到 Darwin 的发布日期,这对我来说很有意义。我想当 emaste 也运行在某个旧版本上时,我们就会知道。无论如何,我没有运行 BSD 或 Darwin,只是从 Avery 的博客帖子:P

相关内容