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 theuser
parte, o redirecionamento funciona, sem a coisa do usuário. Se eu deixar a uid
diretiva 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.apple
e
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.apple
nada acontece. Se eu adicionar lixo /etc/pf.anchors/910.Custom
ou mesmo ousar adicionar user theuser
depois da rdr
regra, 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. iptables
sintaxe fixa
Responder1
Você também pode fazer isso com PF. No entanto, rdr
aceita 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: rdr
encher, 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