我需要破解 OS X pf 以將所有 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 下,似乎有 2 種方法 - ipfw 和 pf。兩者都不起作用。 IP位址:
# ipfw flush
# ipfw add 50 fwd 127.0.0.1,22 tcp from any to any 22 uid theuser
如果我刪除該uid theuser
部分,重定向就會起作用,減去用戶的東西。如果我將uid
指令留在那裡,網路堆疊就會崩潰,系統很快就會變得無法使用;沒有了ipfw
,沒有了ps
,沒有了kill
。
根據手冊頁,ipfw 已被棄用,因此應使用資料包過濾器:
# 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
,或者即使我敢在規則user theuser
之後添加rdr
,防火牆也會斷斷續續地抱怨語法錯誤。
OS X 核心是否可以再執行 NAT 路由,或者 Apple 是否取消了該功能?如果可以的話,我是不是錯過了什麼?
LE。固定iptables
語法
答案1
你也可以用 PF 來做到這一點。但是,rdr
僅接受傳入資料包。因此,您必須先將這些資料包路由到 lo0,然後rdr
在那裡新增一個 -rule(它將捕獲它們,因為它們將從「某個地方」路由進來)以將它們發送到本地 SSH 伺服器。
順序必然是:rdr
內容,然後過濾內容(例如通過),但按時間順序,第二條規則將首先命中(on $Out
),然後激活第一條規則(on lo0
)。
# Output interface
Out = en0
# A macro to shorten rules below
Packets = "proto tcp from" $Out "to any port 22"
# Rule 1: Redirect those connections _after_ they were routed to lo0 below
rdr pass log on lo0 $Packets -> 127.0.0.1
# Rule 2: Route _first_ new IPv4 TCP connections leaving $Out to lo0
pass out on $Out route-to lo0 inet $Packets