OS X 10.8: redirecionando conexões ssh iniciadas localmente para localhost:22

OS X 10.8: redirecionando conexões ssh iniciadas localmente para localhost:22

Preciso hackear o OS X PF para redirecionar todas as conexões ssh de um usuário para esta máquina. Eu quero, ao fazer

$ ssh google.com

para obter os mesmos resultados que com

$ ssh localhost

ou seja, uma conexão com meu sshd em execução localmente.

Em um Linux recente, isso seria simplesmente:

# iptables -t nat -A OUTPUT -p tcp --dport 22 -m owner --uid-owner theuser -j REDIRECT

No OS X 10.8, parece haver 2 métodos - ipfw e pf. Nenhum dos dois funciona. Ipfw:

# ipfw flush
# ipfw add 50 fwd 127.0.0.1,22 tcp from any to any 22 uid theuser

Se eu largar a uid theuserparte, o redirecionamento funciona, sem a coisa do usuário. Se eu deixar a uiddiretiva lá, a pilha da rede morre e o sistema logo fica inutilizável; não mais ipfw, não mais ps, não mais kill.

De acordo com as páginas de manual, o ipfw está obsoleto, então o filtro de pacotes deve ser usado:

# sysctl -w net.inet.ip.forwarding=1

Então eu adicionei

anchor "910.Custom/*"
load anchor "910.Custom" from "/etc/pf.anchors/910.Custom"

dentro /etc/pf.anchors/com.applee

rdr on en1 proto TCP from any to any port 22 -> 127.0.0.1 port 22

in /etc/pf.anchors/910.Custom(observe como não estou mencionando nada sobre um usuário aqui, já que os documentos do pf não listam essa opção para regras de rdr).

Depois de correr # pfctl -ef /etc/pf.anchors/com.applenada acontece. Se eu adicionar lixo /etc/pf.anchors/910.Customou mesmo ousar adicionar user theuserdepois da rdrregra, o firewall reclamará da sintaxe incorreta.

O kernel do OS X ainda pode executar o roteamento NAT ou a Apple retirou essa funcionalidade? Se puder, estou faltando alguma coisa?

LE. iptablessintaxe fixa

Responder1

Você também pode fazer isso com PF. No entanto, rdraceita apenas pacotes recebidos. Portanto, você deve primeiro rotear esses pacotes para lo0 e, em seguida, adicionar uma rdr-rule lá (que irá capturá-los, pois serão roteados de "algum lugar") para enviá-los ao seu servidor SSH local.

A ordem é necessariamente: rdrencher, depois filtrar coisas (como passar), mas cronologicamente a 2ª regra atingirá primeiro (on $Out), que então ativará a primeira regra (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

informação relacionada