Firewall-Beispiele mit Firewalld

Warning

Fehlerhafte Konfigurationen können zu Netzwerkstörungen führen!

Docker auf externe Netze beschränken

Zuerst wird ein IPSet angelegt. Dies kann als XML File passieren oder mittels Befehlen:

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
  <entry>10.0.0.0/8</entry>
  <entry>172.16.0.0/12</entry>
  <entry>192.168.0.0/16</entry>
</ipset>
# fügt ein neues IPSET der Konfiguration hinzu
firewall-cmd --permanent --new-ipset=RFC_1819 --type=hash:ip
# private IP-Adressen hinzufügen
firewall-cmd --permanent --ipset=RFC_1819 --add-entry=10.0.0.0/8
firewall-cmd --permanent --ipset=RFC_1819 --add-entry=172.16.0.0/12
firewall-cmd --permanent --ipset=RFC_1819 --add-entry=192.168.0.0/16

# oder entfernen / löschen
firewall-cmd --permanent --ipset=RFC_1819 --remove-entry=10.0.0.0/8
firewall-cmd --permanent --delete-ipset test

Nach der Konfiguration ist das Set noch nicht geladen. Also fügen wir noch die Firewall-Regel (Policy) hinzu.
Grundsätzlich können Rules viele Einstellungen abbilden, aber keine Ziel-Adressen mittels IPSETs, deshalb wird eine Firewalld Policy verwendet:

<?xml version="1.0" encoding="utf-8"?>
<!-- Standardverfahren ist REJECT, kann aber auch DROP gesetzt werden -->
<policy target="REJECT">
  <!-- IPAdressen von Docker werden maskiert (Source NAT) -->
  <masquerade/>
  <!-- falls ein lokaler DNS Resolver verwendet wird, sollte Port 53 erlaubt werden -->
  <rule family="ipv4">
    <destination ipset="RFC_1819"/>
    <port port="53" protocol="udp"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <destination ipset="RFC_1819"/>
    <port port="53" protocol="tcp"/>
    <accept/>
  </rule>
  <!-- IP-Adressen die nicht im IPSET RFC_1819 sind, werden erlaubt -->
  <rule family="ipv4">
    <destination ipset="RFC_1819" invert="True"/>
    <accept/>
  </rule>
  <!-- aus Zone docker -->
  <ingress-zone name="docker"/>
  <!-- an Zone public oder home -->
  <egress-zone name="public"/>
  <egress-zone name="home"/>
</policy>

Wichtig hierbei ist, dass die Docker Bridge (hier docker0) sich in der Zone docker befindet und das ausgehende Interface in home oder public. Dies dies nicht der Fall, muss die Konfiguration angepasst werden.

Die Zone docker kann angelegt werden:

<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
  <interface name="docker0"/>
  <source address="172.17.0.1/16"/>
</zone>

Grundsätzlich werden Verbindungen von diesem Interface verworfen (DROP), wodurch kein Container auf den Docker-Host selbst zugreifen kann.
Sollte dies nicht gewünscht sein, muss die Konfiguration angepasst werden…

Reload
firewall-cmd --reload