OS X 10.8: перенаправление локально инициированных ssh-соединений на localhost:22
Мне нужно взломать 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. Ни то, ни другое не работает. 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
в /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 (которое будет перехватывать их, когда они будут "откуда-то"), чтобы отправить их на ваш локальный ssh-сервер.
Порядок обязательно rdr stuff, затем фильтрует материал (например, pass), но в хронологическом порядке первое правило будет первым (on $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