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では、ipfwとpfの2つの方法があるようです。どちらも機能しません。 Ipfw:
# 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
in /etc/pf.anchors/910.Custom
(pf docsにはrdrルールのそのようなオプションがリストされていないため、ここではユーザーについて何も言及していないことに注意してください)。
# pfctl -ef /etc/pf.anchors/com.Apple
を実行した後、何も起こりません。 /etc/pf.anchors/910.Custom
にガベージを追加した場合、またはrdr
ルールの後にuser theuser
をあえて追加した場合でも、ファイアウォールは構文の誤りについて適切に文句を言います。
OS XカーネルはNATルーティングをもう実行できますか、それともAppleはその機能を無効にしましたか?可能であれば、何かが足りませんか?
LE。修正されたiptables
構文
PFでもできます。ただし、rdr
は着信パケットのみを受け入れます。したがって、最初にこれらのパケットをlo0にルーティングしてから、そこにrdr
-ルールを追加して(「どこか」からルーティングされるときにパケットをキャッチします)、ローカルのSSHサーバーに送信する必要があります。
順序は必然的に次のようになります。rdr
スタッフ、次にフィルタースタッフ(パスなど)ですが、時系列で2番目のルールが最初にヒットします($Out
)、これにより最初のルールがアクティブになります(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