Necesito hackear OS X pf para redirigir todas las conexiones ssh de un usuario a esta máquina. quiero, al hacer
$ ssh google.com
para obtener los mismos resultados que con
$ ssh localhost
es decir, una conexión a mi sshd que se ejecuta localmente.
En un Linux reciente, esto sería simplemente:
# iptables -t nat -A OUTPUT -p tcp --dport 22 -m owner --uid-owner theuser -j REDIRECT
En OS X 10.8, parece haber dos métodos: ipfw y pf. Ninguno de los dos funciona. Ipfw:
# ipfw flush
# ipfw add 50 fwd 127.0.0.1,22 tcp from any to any 22 uid theuser
Si dejo caer la uid theuser
parte, la redirección funciona, menos el problema del usuario. Si dejo la uid
directiva ahí, la pila de red muere y el sistema pronto queda inutilizable; No más ipfw
, no más ps
, no más kill
.
Según las páginas de manual, ipfw está en desuso, por lo que se debe utilizar un filtro de paquetes en su lugar:
# sysctl -w net.inet.ip.forwarding=1
Luego agregué
anchor "910.Custom/*"
load anchor "910.Custom" from "/etc/pf.anchors/910.Custom"
/etc/pf.anchors/com.apple
y en
rdr on en1 proto TCP from any to any port 22 -> 127.0.0.1 port 22
en /etc/pf.anchors/910.Custom
(observe cómo no menciono nada sobre un usuario aquí, ya que los documentos de pf no incluyen dicha opción para las reglas de rdr).
Después de ejecutar # pfctl -ef /etc/pf.anchors/com.apple
no pasa nada. Si agrego basura a la regla /etc/pf.anchors/910.Custom
o incluso si me atrevo a agregarla user theuser
después rdr
, el firewall se queja ocasionalmente de la mala sintaxis.
¿Puede el kernel de OS X seguir realizando enrutamiento NAT, o Apple eliminó esa funcionalidad? Si es posible, ¿me falta algo?
LE. iptables
sintaxis fija
Respuesta1
Puedes hacerlo con PF también. Sin embargo, rdr
sólo acepta paquetes entrantes. Por lo tanto, primero debe enrutar esos paquetes a lo0, luego agregar una rdr
regla allí (que los detectará ya que serán enrutados desde "algún lugar") para enviarlos a su servidor SSH local.
El orden es necesariamente: rdr
cosas, luego filtrar cosas (como pasar), pero cronológicamente la segunda regla aparecerá primero (en $Out
), lo que luego activará la primera regla (en 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