OS X 10.8: Umleitung lokal initiierter SSH-Verbindungen auf localhost:22

OS X 10.8: Umleitung lokal initiierter SSH-Verbindungen auf localhost:22

Ich muss das OS X pf hacken, um alle SSH-Verbindungen von einem Benutzer auf diesen Rechner umzuleiten. Ich möchte dabei

$ ssh google.com

um die gleichen Ergebnisse zu erzielen wie mit

$ ssh localhost

also eine Verbindung zu meinem lokal laufenden SSHD.

Unter einem aktuellen Linux würde dies einfach lauten:

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

Unter OS X 10.8 gibt es anscheinend zwei Methoden – ipfw und pf. Keine von beiden funktioniert. Ipfw:

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

Wenn ich den uid theuserTeil weglasse, funktioniert die Umleitung, abzüglich des Benutzerdings. Wenn ich die uidDirektive dort lasse, stirbt der Netzwerkstapel und das System wird kurzzeitig unbrauchbar; nicht mehr ipfw, nicht mehr ps, nicht mehr kill.

Laut den Manpages ist ipfw veraltet, stattdessen sollte daher ein Paketfilter verwendet werden:

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

Dann fügte ich hinzu

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

in /etc/pf.anchors/com.appleund

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

in /etc/pf.anchors/910.Custom(beachten Sie, dass ich hier nichts über einen Benutzer erwähne, da die PF-Dokumente eine solche Option für RDR-Regeln nicht auflisten).

Nach dem Ausführen # pfctl -ef /etc/pf.anchors/com.applepassiert nichts. Wenn ich Müll hinzufüge /etc/pf.anchors/910.Customoder es sogar wage, user theusernach der rdrRegel etwas hinzuzufügen, beschwert sich die Firewall sporadisch über die schlechte Syntax.

Kann der OS X-Kernel überhaupt noch NAT-Routing durchführen oder hat Apple diese Funktion entfernt? Wenn ja, übersehe ich dann etwas?

LE. feste iptablesSyntax

Antwort1

Sie können dies auch mit PF tun. Allerdings rdrwerden nur eingehende Pakete akzeptiert. Sie müssen diese Pakete also zuerst an lo0 weiterleiten und dann rdrdort eine Regel hinzufügen (die sie abfängt, da sie von „irgendwo“ hergeleitet werden), um sie an Ihren lokalen SSH-Server zu senden.

Die Reihenfolge ist zwingend: rdrZeug, dann Zeug filtern (wie Passieren), aber chronologisch wird die 2. Regel zuerst zuschlagen (am $Out), die dann die erste Regel aktiviert (am 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

verwandte Informationen