server:pfsense

pfsense

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

  • AES-NI CPU-bases Acceleration
  • BSD-Crypto device (cryptodev)
  • AES-NI CPU-bases Acceleration and BSD-Crypto device (aesni, cryptodev)
  • Protocol → HTTPS (SSL/TLS)
  • SSL/TLS Certificate: im Certmanager hochladen oder einrichten
  • Alternate Hostnames: hier alle gültigen Hostnamen eingeben (auch cluster-Adressen!)z.B.
    fw.domain.tld fw1.domain.tld
  • Secure Shell Server
    • Enable Secure Shell
    • SSHd Key Only: → Pubkey Only is sicherer
    • Allow Agent Forwarding: Enables ssh-agent forwarding support: wenn benötigt
  • Console Options → Console menu → Password protect the console menu

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"
  1. Paket „acme“ installieren (über System → Package Manager)
  2. Account anlegen: Services → Acme → Certificates
  3. Certificates → Add
    1. Domain eintragen
    2. bei webroot Verzeichnis definieren UND anlegen (via SSH): mkdir -p /usr/local/www/.well-known/acme-challenge

bei haproxy

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:

  • backends:
    • acme: be_acme
    • Anwendung: be_application
  • $LAN_IP: Cluster-IP aus dem LAN 1.2.3.4
  • $STANDALONE_PORT z.B. 8080

new backend for the standalone server:

  • Server list
    • Name: be_acme
    • mode: active
    • Name: acme
    • Forwardto: Address+Port
    • Address: $LAN_IP
    • Port: $STANDALONE_PORT
    • Encrypt(SSL): No
    • SSL checks: NO
  • Health checking → Health check method: None

Frontend ändern:

Default backend, access control lists and actions

Access Control lists:

  • letsencrypt/ACME:
    • Name: ACME
    • Expression: „Path contains within slashes:“
    • CS: No
    • Not: No
    • Value: .well-known/acme-challenge/
  • Application:
    • Name: Application
    • Expression: „Path contains within slashes:“
    • CS: No
    • Not: YES
    • Value: .well-known/acme-challenge/

Actions:

  • Use Backend, Condition acl names: ACME (Name der ACL von oben!), backend: be_acme
  • Use Backend, Condition acl names: Application (Name der 2. ACL von oben!), backend: be_application

Services → Acme Certificates:

Domain SAN list:

  • Domainanme: $FQDN
  • Method: Standalone HTTP Server
  • Port: $PORT (HTTP listen port for stand-alone server. Must be 80 or have port 80 on WAN forwarded to this port. Firewall rules must allow traffic to reach this port.)
  • IPv6: Optional (Bind to IPv6 instead of IPv4)

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.

Troubleshooting Upgrades

Ä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):

  • Beliebige gültige IPv6-Adressen zuweisen (configuration type to Static IPv6 z.B. ::1 /128)
  • Services → DHCPv6 Server & RA → Router Advertisements → Router mode → Disabled
  • v6-Adressen wieder löschen

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“).