(Linux) Firewall

Aus TippvomTibb
Version vom 4. Februar 2024, 08:33 Uhr von Chris T. Ludwig (Diskussion | Beiträge) (→‎Nachtrag 2023-12-21)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Allgemeines

Viele Jahre habe ich mich an iptables gewoehnt, aber die Zeit scheint reif fuer einen Wechsel auf den "Nachfolger". Ab OpenSuSE 15.x ist firewalld mit an Board. Bei den anderen Distros kuendigt sich der Wechsel auch an. Damit mir die Umstellung nicht ganz so schwer faellt, habe ich mir hier die wichtigsten Befehle zusammengestellt.

Firewalld Wiki

Vordefinierte Zone-Configs

  • block Alle eingehenden Netzwerkverbindungen (Versuche) werden abgewiesen. Nur Netzwerkverbindungen die vom eigenen System kommen sind moeglich.
  • dmz – Klassische DMZ, die begrenzten Zugriff auf das LAN und nur bestimmte eingehende Ports erlaubt.
  • drop – Alle eingehenden Netzwerkverbindeungen (Versuche) werden verworfen und nur ausgehende Netzwerkverbindeungen sind erlaubt.
  • external – Nuetzlich fuer Router-Verbindungen. Man benoetigt sowohl ein LAN als auch ein WAN Interface damit das Masquerading (NAT) richtig funktioniert.
  • home – Nuetzlich fure Home-Computer und Laptops im eigenen LAN, in dem sich alle COmputer gegenseitig vertrauen. Es sind nur ausgewaehlte TCP/IP-Ports erlaubt.
  • internal – Zur Verwendung in internen Netzwerken, wenn Sie den anderen Servern oder Computer im LAN größtenteils vertrauen.
  • public – Sie vertrauen keinen anderen Computern und Servern im Netzwerk. Sie vertrauen keinen anderen Computern und Servern im Netzwerk. Sie lassen nur die erforderlichen Ports und Dienste zu. Verwenden Sie für Cloud-Server oder Server, die bei Ihnen gehostet werden, immer die öffentliche Zone.
  • trusted – Alle Netzwerkverbindunegn sind erlaubt. Ich empfehle diese Zone nicht für dedizierte Server oder VMs, die mit dem WAN verbunden sind.
  • work – Zur Verwendung an Ihrem Arbeitsplatz, an dem Sie Ihren Kollegen und anderen Servern vertrauen.

Die Beschreibungen der Zonen dient nur einer groben Einschaetzung. Es bleibt einem wohl nicht erspart in die Zonen-Configs hineinzuschauen.

cat zones

tibb:~ # cat /usr/lib/firewalld/zones/block.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone target="%%REJECT%%">
  <short>Block</short>
  <description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/dmz.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>DMZ</short>
  <description>For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/docker.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
  <short>docker</short>
  <description>All network connections are accepted.</description>
  <interface name="docker0"/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/external.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>External</short>
  <description>For use on external networks. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <masquerade/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/home.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Home</short>
  <description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="samba-client"/>
  <service name="dhcpv6-client"/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/internal.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Internal</short>
  <description>For use on internal networks. You mostly trust the other computers on the networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="samba-client"/>
  <service name="dhcpv6-client"/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/public.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/trusted.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
  <short>Trusted</short>
  <description>All network connections are accepted.</description>
</zone>

tibb:~ # cat /usr/lib/firewalld/zones/work.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Work</short>
  <description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
</zone>

Befehle

ls -l /usr/lib/firewalld/zones/
ls -l /usr/lib/firewalld/services/
cat /usr/lib/firewalld/zones/public.xml
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --zone=public
sudo firewall-cmd --remove-service=dhcpv6-client --permanent --zone=public
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=public --add-port=9009/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --zone=internal --list-ports
sudo firewall-cmd --list-services
sudo firewall-cmd --list-services --zone=public
sudo firewall-cmd --list-services --permanent
firewall-cmd --zone=public --list-all --permanent
sudo firewall-cmd --get-services | grep nfs3
sudo firewall-cmd --state
sudo firewall-cmd --list-services --zone=home
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --zone=public --add-masquerade
sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent 
sudo firewall-cmd --zone=public --remove-masquerade
sudo firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent
sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.3.5" port port=22 protocol=tcp accept'
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="11211" accept'
sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.3.5" port port=22 protocol=tcp accept' --permanent
sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" port port="11211" protocol="tcp" accept' --permanent
 sudo firewall-cmd --list-rich-rules --permanent

Nachtrag 2023-12-21

Je mehr ich firewalld nutze, desto verwirrender wird die Nutzung, bzw. das Ergebnis. Jetzt kommt auch noch nftables in Spiel.

In der firewalld.conf unter /etc/firewalld werden nftables und iptables als Backends bezeichnet und nftables als default eingestellt. Unklar ist mir nach wie vor, ob eine Installation/Nutzung von iptables die Kombi nftables/firewalld stoert.

# FirewallBackend
# Selects the firewall backend implementation.
# Choices are:
#       - nftables (default)
#       - iptables (iptables, ip6tables, ebtables and ipset)
FirewallBackend=nftables

Ebenfalls steht in der Config folgendes.

# FlushAllOnReload
# Flush all runtime rules on a reload. In previous releases some runtime
# configuration was retained during a reload, namely; interface to zone
# assignment, and direct rules. This was confusing to users. To get the old
# behavior set this to "no".
# Default: no
FlushAllOnReload=no

Um zu verstehen wie Netzwerkpakete behandelt werden lohnt es sich nach Grafiken zu suchen, die den 'Netfilter Packet Traversal' des Linux-Kernels zeigen. (z.B. hier)

Hier kommt man der Sache schon naeher.

As stated by Netfilter organization, Netfilter is a packet filtering framework inside the Linux 2.4.x and later kernel series. To do its jobs, Netfilter provides an application named Iptables a common packet filtering  application that is associated with Netfilter in Linux kernel. Iptables is a tabled-based system for providing the ability to define firewall rules for filtering and monitoring incoming and outgoing packets. Technically , Netfilter provides some network operations or a set of hooks inside the Linux kernel that allow iptables control and monitor all network packets traversing the network stack in Linux. Every program that works with these hooks will be enabled to interact with traffic flow when a packet triggers a specific hook (2014). Gradually, however, due to the limitations of iptables, high complexity, and less scalability, a new framework was introduced named nftables with the newer command-line tool called nft, based on Netfilter infrastructure including the hook infrastructure.

Nachdem ich auch den Artikel gelesen habe, komme ich zu folgendem Zwischenergebnis.

  • Mit iptables sieht man nicht (mehr) alle gueltigen Regeln.
  • Mit nftables als Backend kann man mit 'nft list tables' die Verbindung zu firewalld sehen
  • Mit 'nft list ruleset' kann man die Regeln im Ueberblick sehen

Nach den Kommandos (siehe hier)

firewall-cmd --permanent --add-port=10000/tcp
firewall-cmd --reload

konnte ich Webmin auf dem Rechner erreichen.

Nachtrag 2024-01-01

Jetzt wird's haarig. Docker scheint (noch) keine nftables zu unterstützen, sondern nutzt nach wie vor iptables. Dummerweise loescht der firewalld beim Starten die Iptables und damit sind die DockerContainer vom Netzwerk (NAT) abgeschnitten.

Workaround: Docker (re)starten

iptables-save > docker_iptables.dump

Firewall re(starten)

iptables-restore docker_iptables.dump

[1]

[2]

...to be continued

Quellen

[3]

[4]

Request for Comments


Kommentar hinzufügen
TippvomTibb freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, registriere dich bitte oder melde dich an.