SolarCatcher
Well-Known Member
Hallo,
normalerweise kann ich in meiner pf.conf die aktuelle öffentliche IP-Adresse durch runde Klammern um das externe Netzwerk-Interface referenzieren, z.B. "(em0)".
Das geht auch für NAT. Die OpenBSD FAQs für die FreeBSD-Version von PF sagen dazu:
Mein externes Netzwerk-Interface hat nun eine IPv4- und eine IPv6-Adresse. Also wollte ich folgendes machen und damit IPv4 und IPv6 erschlagen, um Traffic von meinen Jails zu NAT'ten:
Das klappte aber nicht gut und eine "pfctl -sa" zeigte, dass an die Zeile automatisch noch ein "round-robin" angehängt wurde. PF hat die zwei unterschiedlichen Adressen also als Pool aufgefasst, die es reihum verwenden soll. Das war natürlich nicht mein Ziel!
Daher fällt mir nix anderes ein, als die beiden öffentlichen Adressen (IPv4 und IPv6) doch hart reinzuschreiben. Damit hatte ich mir jetzt fast schon ins Bein geschossen: Das ganze ist nämlich ein Droplet (VPS) bei DigitalOcean. Und wenn ich eine neue Instanz mit dieser Konfiguration starte, erhalte ich neue IP-Adressen und diese passen nicht mehr zur pf.conf. Und dann komme ich nicht einmal per SSH hinein!
Gibt es da eine elegantere Lösung?
Hier zur Verdeutlichung meine (deutlich verkürzte) pf.conf:
normalerweise kann ich in meiner pf.conf die aktuelle öffentliche IP-Adresse durch runde Klammern um das externe Netzwerk-Interface referenzieren, z.B. "(em0)".
Das geht auch für NAT. Die OpenBSD FAQs für die FreeBSD-Version von PF sagen dazu:
you can tell PF to automatically update the translation address by putting parentheses around the interface name:
nat on tl0 from dc0:network to any -> (tl0)
This method works for translation to both IPv4 and IPv6 addresses.
Mein externes Netzwerk-Interface hat nun eine IPv4- und eine IPv6-Adresse. Also wollte ich folgendes machen und damit IPv4 und IPv6 erschlagen, um Traffic von meinen Jails zu NAT'ten:
Code:
nat pass on $ext_if inet proto { tcp udp icmp } from $jails_ip4 to any -> ($ext_if)
nat pass on $ext_if inet6 proto { tcp udp icmp6 } from $jails_ip6 to any -> ($ext_if)
Das klappte aber nicht gut und eine "pfctl -sa" zeigte, dass an die Zeile automatisch noch ein "round-robin" angehängt wurde. PF hat die zwei unterschiedlichen Adressen also als Pool aufgefasst, die es reihum verwenden soll. Das war natürlich nicht mein Ziel!
Daher fällt mir nix anderes ein, als die beiden öffentlichen Adressen (IPv4 und IPv6) doch hart reinzuschreiben. Damit hatte ich mir jetzt fast schon ins Bein geschossen: Das ganze ist nämlich ein Droplet (VPS) bei DigitalOcean. Und wenn ich eine neue Instanz mit dieser Konfiguration starte, erhalte ich neue IP-Adressen und diese passen nicht mehr zur pf.conf. Und dann komme ich nicht einmal per SSH hinein!
Gibt es da eine elegantere Lösung?
Hier zur Verdeutlichung meine (deutlich verkürzte) pf.conf:
Code:
ext_if = "vtnet0" # externes Netzwerk-Interface
int_if = "lo1" # internes Netzwerk-Interface
ip4_pub = ... # öffentliche IPv4-Adresse
ip6_pub = ... # öffentliche IPv6-Adresse
jails_ip4 = "{ 10.0.0.0/28 }" # (privater) IPv4-Adressbereich der Jails
jails_ip6 = "{ fd0c:800b:c17d:b1f0::0/116 }" # (privater) IPv6-Adressbereich der Jails
(...)
nat pass on $ext_if inet proto { tcp udp icmp } from $jails_ip4 to any -> $ip4_pub
nat pass on $ext_if inet6 proto { tcp udp icmp6 } from $jails_ip6 to any -> $ip6_pub