OS X 10.8:将本地启动的ssh连接redirect到localhost:22

我需要破解OS X的pfredirect从用户到本机的所有SSH连接。 我想,当做

$ ssh google.com 

得到与之相同的结果

 $ ssh localhost 

即连接到我本地运行的sshd。

在最近的Linux下,这只是:

 # iptables -t nat -A OUTPUT -p tcp --dport 22 -m owner --uid-owner theuser -j REDIRECT 

在OS X 10.8下,似乎有两种方法 – ipfw和pf。 两者都行不通。 IPFW:

 # ipfw flush # ipfw add 50 fwd 127.0.0.1,22 tcp from any to any 22 uid theuser 

如果我放弃uid theuser部分,redirect工作,减去用户thingie。 如果我离开uid指令,那么networking堆栈就会死掉,系统很快就会变得不可用。 没有更多的ipfw ,没有更多的ps ,没有更多的kill

根据手册页,ipfw被弃用,所以应该使用包filter:

 # sysctl -w net.inet.ip.forwarding=1 

然后我补充说

 anchor "910.Custom/*" load anchor "910.Custom" from "/etc/pf.anchors/910.Custom" 

/etc/pf.anchors/com.apple

 rdr on en1 proto TCP from any to any port 22 -> 127.0.0.1 port 22 

/etc/pf.anchors/910.Custom (请注意我在这里没有提到有关用户的任何信息,因为pf文档没有列出rdr规则的这种选项)。

运行# pfctl -ef /etc/pf.anchors/com.apple没有任何反应。 如果我将垃圾添加到/etc/pf.anchors/910.Custom或者即使我敢于在rdr规则之后添加user theuser ,防火墙也会适当地抱怨语法错误。

OS X内核甚至可以执行NAT路由吗,还是苹果公司推出了这个function呢? 如果可以的话,我错过了什么?

LE。 修正了iptables语法

你也可以用PF来做。 但是,rdr只接受传入数据包。 因此,您必须首先将这些数据包路由到lo0,然后在那里添加一个rdr规则(这将捕获它们,因为它们将从“某处”路由),以将它们发送到本地ssh服务器。

顺序是必然的东西,然后过滤东西(如通过),但按时间顺序第二条规则将首先击中( $Out ),然后将激活第一条规则( lo0 )。

 # Output interface Out = en0 Packets = "proto tcp from $Out to any port 22" # Step "2". Rdr those same packets that were routed to lo0 below rdr pass log on lo0 $Packets -> 127.0.0.1 # Step "1". Route new IPv4 TCP connections leaving $Out to lo0 pass out on $Out route-to lo0 inet $Packets keep state