我正在尝试在我的 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