Мне нужно взломать 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
синтаксис
Вы также можете сделать это с помощью PF. Тем не мение, rdr
принимает только входящие пакеты. Таким образом, вы должны сначала направить эти пакеты в lo0, а затем добавить rdr
-правило там (которое поймает их, поскольку они будут перенаправлены "откуда-то"), чтобы отправить их на ваш локальный SSH-сервер.
Порядок обязательно: rdr
материал, затем фильтруйте материал (например, проход), но в хронологическом порядке второе правило сработает первым (на $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