pfsense ist eine auf freeBSD basierende Firewall-Distribution.
https://docs.netgate.com/pfsense/en/latest/routing/static.html#figure-asymmetric-routing
„Usually, the „TCP:SA“ gets blocked by the firewall because the package took a different path on its way back. Pfsense being a stateful firewall needs to know the full path before letting the package go in. The package path should be the same to the network destination and from the network destination any discrepancy in the path the firewall will block it.“
Static route filtering → Bypass firewall rules for traffic on the same interface This option only applies if one or more static routes have been defined. If it is enabled, traffic that enters and leaves through the same interface will not be checked by the firewall. This may be desirable in some situations where multiple subnets are connected to the same interface.
Alternativ eine Regel auf loating und Sloppy State.
System → Advanced → Miscellaneous → Cryptographic Hardware
fw.domain.tld fw1.domain.tld
siehe auch: https://github.com/opoplawski/ansible-pfsense
ansible-galaxy collection install pfsensible.core
im inventory:
$hostname ansible_python_interpreter="/usr/local/bin/python3.8"
mkdir -p /usr/local/www/.well-known/acme-challenge
Bei haproxy-frontends kann der acme-client nicht eingreifen. Standardweg wäre eine DNS-challenge, alternativ können wir das mit dem folgenden Setup via http-challenge lösen:
Wir behelfen uns mit einem extra backend das den acme-client im http-standalone-mode anspricht, bei der Quelle gibt es auch Screenshots.
Beispiel:
new backend for the standalone server:
Frontend ändern:
Default backend, access control lists and actions
Access Control lists:
Actions:
Services → Acme Certificates:
Domain SAN list:
der folgende Befehlt wird intern in der pfsense aufgerufen:
/usr/local/pkg/acme/acme.sh --issue --domain '$FQDN' --standalone --listen-v4 --httpport '$STANDALONE_PORT' --home '/tmp/acme/$FQDN/' --accountconf '/tmp/acme/$FQDN/accountconf.conf' --force --reloadCmd '/tmp/acme/$FQDN/reloadcmd.sh' --log-level 3 --log '/tmp/acme/$FQDN/acme_issuecert.log'
netstat -an sockstat -l
Idealerweise nutzt man drei öffentliche Adressen (2x nodes, 1x cluster), wenn dies nicht möglich ist kann nur eine der beiden Firewalls zur gleichen Zeit geupdated werden. Die cluster Adresse zeigt immer auf den aktuellen master und es werden private Adressen benutzt.
Dazu fängt man auf dem master an (direkt auf der Startseite ist ein Link), lässt diesen durchlaufen und rebooten. Anschließend loggt man sich auf der neuen Version ein und schaltet das System in den Wartungsmodus ein:
Status → Carp (failover) → Enter persistent CARP maintenace modus
Anschließend loggt man sich neu ein (nun die die fw2 der aktive master) und wiederholt die Update-prozedur. Nach dem reboot von fw2 muss man den Wartungsmodus auf fw1 wieder abschalten. Da diese nicht über die öffentliche IP erreichbar ist, muss man mit SSH-Forwarding (oder VPN) behelfen.
ssh root@$Cluster_FQDN -L 8443:$IP_fw1_intern:443 -N -g
Erklärung: 8443 ist der Port auf localhost, Ziel ist $IP_fw1_intern (fw1 mit https).
Die Weboberfläche von fw1 ist nun lokal unter: https://127.0.0.1:8443 erreichbar.
oft sind es NAT-Probleme (die zweite Node kann die Paketliste nicht laden) oder nur eine public-IP.
Änderungen eines Interfaces gehen nicht, folgende Fehlermeldung:
**The following input errors were detected:**The Router Advertisements Server is active on this interface and it can be used only with a static IPv6 configuration. Please disable the Router Advertisements Server service on this interface first, then change the interface configuration.
Lösung (Fehler scheint bei Version 2.5):
Die „Hybrid outbound NAT rule generation“ ist großer Mist (das gilt sogar für opnsense), die automatisch generierten Regeln gehen aus unerfindlichen Grünen kaputt und sind nicht mehr wirksam. Abhilfe: man muss die gleichen Regeln manuell anlegen („Manual outbound NAT rule generation“).