Firewall-Beispiele mit Firewalld
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