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

5

Eu 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 o 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 dois 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 derrubar a parte uid theuser , o redirecionamento funcionará, menos a coisa do usuário. Se eu deixar a diretiva uid , a pilha de rede morre e o sistema logo se torna inutilizável; não mais ipfw , não mais ps , não mais kill .

De acordo com as man pages, o ipfw é obsoleto, então o filtro de pacotes deve ser usado em seu lugar:

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

Então eu adicionei

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

em /etc/pf.anchors/com.apple e

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

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

Depois de executar # pfctl -ef /etc/pf.anchors/com.apple , nada acontece. Se eu adicionar lixo a /etc/pf.anchors/910.Custom ou mesmo se eu ousar adicionar user theuser após a regra rdr , o firewall reclama da má sintaxe.

O kernel do OS X pode até mesmo executar o roteamento NAT, ou a Apple arrancou essa funcionalidade? Se puder, estou faltando alguma coisa?

LE. % de sintaxe fixaiptables

    
por foxx1337 26.08.2012 / 02:51

1 resposta

9

Você também pode fazer isso com o PF. No entanto, o rdr só aceita pacotes de entrada. Portanto, primeiro você deve rotear esses pacotes para lo0, depois adicionar uma regra rdr (que os pegará como eles serão roteados de "algum lugar") para enviá-los para o servidor ssh local.

A ordem é necessariamente rdr, então filtre o material (como pass), mas cronologicamente a segunda regra será a primeira (em $Out ), que ativará a primeira regra (em 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
    
por 21.04.2013 / 00:58