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 theuser
Teil weglasse, funktioniert die Umleitung, abzüglich des Benutzerdings. Wenn ich die uid
Direktive 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.apple
und
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.apple
passiert nichts. Wenn ich Müll hinzufüge /etc/pf.anchors/910.Custom
oder es sogar wage, user theuser
nach der rdr
Regel 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 iptables
Syntax
Antwort1
Sie können dies auch mit PF tun. Allerdings rdr
werden nur eingehende Pakete akzeptiert. Sie müssen diese Pakete also zuerst an lo0 weiterleiten und dann rdr
dort 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: rdr
Zeug, 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