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
Другие вопросы по тегам