有一个很酷的实用程序,称为 sshuttle。过去一直依靠
ipfw
来转发数据包。看起来 ipfw
在 Mavericks 中大部分都被破坏了,建议现在使用 PacketFilter。
我花了大半天的时间研究 PacketFilter,发现
ipfw
有一个 PacketFilter 不支持的功能(希望我是错的)。
以下规则:
ipfw -q add 12300 fwd 127.0.0.1,12300 tcp from any to any not ipttl 42 keep-state setup
会将所有流量转发到 127.0.0.1 (localhost) 端口 12300。但是,它不会更改 TCP 数据包中的目标 IP 或端口。这对于 sshuttle 很重要,因为它使用有关原始目的地的信息将数据包转发到另一个网络。
我在 PacketFilter 世界中能找到的最接近的规则是:
rdr pass proto tcp from any to any -> 127.0.0.1 port 12300
此规则确实将流量发送到 127.0.0.1(本地主机)端口 12300,但它也将目标地址重写为 127.0.0.1。
关于如何在 OS X 中获取行为 sshuttle 需求有什么想法吗?
为什么不尝试一下
Loopback Alias
:
127.0.0.2
。127.0.0.2:12300
。这样即使
pf
将目的IP改写为127.0.0.2,也会和127.0.0.1
不同。这或许可以让您区分 IP 地址之间的流量。
ifconfig lo0 alias 127.0.0.2
那么对于你的
pf
规则,你可以这样做:
rdr pass proto tcp from any to any -> 127.0.0.2 port 12300
如果这不起作用,是否可以使用像redsocks这样的第三方软件包?请记住,这不会是确切的
ipfw
功能的直接替代品,但是,通过一些配置和可能的一些脚本,也许这可以用于实现类似的目的。
如果您的主要目标是专门使用
sshuttle
,我建议您研究该项目可能出现的任何更新或分支,以解决 macOS 的更改,如前所述。