Zum Inhalt springen
PLUTEX
MENUMENU
  • Hos­ting
        • Hosting-Produkte im Überblick
        • Managed Server
        • Root Server
        • Backup & Storage
        • Web­hos­ting
        • CMS-Hosting
        • Shop-Hosting
        • Top­sel­ler
          • PLUT­EX­sto­rage
          • Plesk Ser­ver
          • Büro­ser­ver
          • Ser­ver­ma­nage­ment
          • PLUTEX Next­cloud
  • Colocation
        • Colocation im Überblick
        • 19″-Racks
        • Ser­ver-Housing
        • Top­sel­ler
          • PLUT­EX­sto­rage
          • Plesk Ser­ver
          • Büro­ser­ver
          • Ser­ver­ma­nage­ment
          • PLUTEX Next­cloud
  • Inter­net
        • Internet von PLUTEX
        • VPN
        • Internet per Richtfunk – PLUTEXwave
        • Internet für das HAG-Quartier in Bremen
        • Internet für das TABAKQUARTIER in Bremen
        • Webseite erstellen lassen
        • Top­sel­ler
          • PLUT­EX­sto­rage
          • Plesk Ser­ver
          • Büro­ser­ver
          • Ser­ver­ma­nage­ment
          • PLUTEX Next­cloud
  • Ser­vice
        • Service im Überblick
        • Consulting
        • Datenmanagement
        • Sup­port
        • Für Agen­tu­ren
        • Für vir­tu­elle Arbeitsplätze
        • Für Shell-Lieb­ha­ber
        • Top­sel­ler
          • PLUT­EX­sto­rage
          • Plesk Ser­ver
          • Büro­ser­ver
          • Ser­ver­ma­nage­ment
          • PLUTEX Next­cloud
  • Über PLUTEX
        • PLUTEX im Überblick
        • PLUTEX-Rechenzentren
        • Zer­ti­fi­zie­rung
        • Part­ner & Kooperationen
        • Aktu­el­les
        • Refe­ren­zen
        • Jobs
        • Anfrage
        • Kontakt
        • Top­sel­ler
          • PLUT­EX­sto­rage
          • Plesk Ser­ver
          • Büro­ser­ver
          • Ser­ver­ma­nage­ment
          • PLUTEX Next­cloud

Das PLUTEX Kern­netz — Teil 1: Rou­ting und Fire­wal­ling mit Linux

Wie Linux per­for­mant als Fire­wall mit sehr vie­len Inter­face-basier­ten Regeln benutzt wer­den kann, und wel­che Hard­ware-Tweaks dafür nötig sind.

Um Linux zum Rou­ting zu über­re­den bedarf es nicht viel:

sysctl net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1

Doch damit fan­gen die Pro­bleme erst an…

Per­for­mance von ipta­bles bei vie­len Interface-Regeln

Wie in der Über­sicht unse­rer Netz­struk­tur erwähnt benutz­ten unsere auf Linux basie­ren­den Kern­rou­ter frü­her das wohl allen Linux-Admins bekannte ipta­bles. Das lief so lange gut, bis Debian Bus­ter ipta­bles durch eine Kom­pa­ti­bi­li­täts­schicht von nfta­bles ersetzt hat. Plötz­lich kam es zu Packet Loss, weil das Abar­bei­ten der Fire­walls für jedes Paket schlicht zu lange dauerte.

Das ist ver­mut­lich der rich­tige Moment, etwas genauer dar­auf zu schauen, wie sich das Netz­werk aus Sicht des Ser­vers dar­stellt. Es han­delt sich natür­lich um “Rou­ter on a Stick”: Die Ser­ver ver­bin­den sich durch VLANs mit den Rou­tern, von denen sich am Rou­ter dann hun­derte auf ein und dem sel­ben phy­si­schen Inter­face sam­meln. Jedes die­ser Inter­faces hat eigene Regeln defi­niert, wel­che neuen Ver­bin­dun­gen in das VLAN auf­ge­baut wer­den dür­fen. Das heißt, dass die ipta­bles-Regeln im Wesent­li­chen so aussahen:

iptables -A FORWARD -o vlan1 -j vlan1
iptables -A FOWRARD -o vlan2 -j vlan2
...
iptables -A FORWARD -o vlan300 -j vlan300
iptables -A FORWARD -m state --state established -j ACCEPT

In den ein­zel­nen Chains ste­hen dann die Regeln des jewei­li­gen VLANs. Aber alleine diese Jump-Regeln für jedes ein­zelne Paket abzu­ar­bei­ten dau­erte mit der nfta­bles-Kom­pa­ti­bi­li­täts­schicht viel zu lang.

Nach viel Debug­ging, womit der Ker­nel eigent­lich seine Zeit ver­bringt, waren wir schlauer: Jede die­ser Regeln führt einen Ver­gleich der Inter­face-Namen durch, um her­aus­zu­fin­den, durch wel­ches Inter­face ein Paket den Rou­ter ver­las­sen würde. Da Namen Zei­chen­ket­ten sind ist das eher ineffizient.

Umstieg auf nftables

Also war es an der Zeit, sich nfta­bles anzu­se­hen. Es wurde schnell klar, dass ein Umstieg sich auch ange­sichts der Fea­tures loh­nen würde. Das am meis­ten gewünschte Fea­ture waren anonyme ad-hoc Sets von IP-Adres­sen, um etwa

iptables -A vlan1 -s 192.0.2.1 -p tcp --dport 80 -j ACCEPT
iptables -A vlan1 -s 198.51.100.2 -p tcp --dport 80 -j ACCEPT
iptables -A vlan1 -s 203.0.113.3 -p tcp --dport 80 -j ACCEPT

ein­fach erset­zen zu kön­nen durch

nft add rule inet vlan1 ip saddr { 192.0.2.1, 198.51.100.2, 203.0.113.3 } tcp dport 80 accept

ohne dafür ein neues ipset anle­gen zu müs­sen (was durch unsere Auto­ma­ti­sie­rung gar nicht mög­lich war). Auch ein­heit­li­che Regeln für IPv4 und IPv6 waren mit ipta­bles nicht möglich.

Also wurde das Sys­tem zum Kon­fi­gu­rie­ren der Ser­ver lang­wie­rig von ipta­bles auf nfta­bles umge­stellt. Alle Fire­wall-Regeln sind in einem zen­tra­len git-Repo­si­tory gespei­chert (mehr dazu in Teil 3). Dadurch muss­ten wir “nur” die Über­set­zung in Kon­fi­gu­ra­tion auf den Rou­tern neu schrei­ben, damit sie nfta­bles-Regeln statt ipta­bles-Regeln erzeugt.

nfta­bles sollte natür­lich nicht wie­der das selbe Pro­blem der Zei­chen­ket­ten­ver­glei­che haben. Also muss­ten wir die aus­ge­hen­den Inter­faces dort direkt mit ihrem Index in den Regeln hin­ter­le­gen anstatt als Namen. Und das ist leich­ter gesagt als getan, da sich die Inter­faces des Sys­tems ja ändern kön­nen, wenn wir ein neues Netz in Betrieb neh­men oder ein altes löschen. Der erste naive Ansatz war also, die Regeln alle neu zu laden wenn sich etwas an den Netz­werk Inter­faces des Sys­tems ändert. Doch gerade beim Start des gan­zen Sys­tems ist das zum Schei­tern ver­ur­teilt, da das Sys­tem in sehr kur­zer Zeit hun­derte Inter­faces anlegt.

nfta­bles-Regeln sinn­voll aufteilen

Wir haben uns also für einen geteil­ten Ansatz ent­schie­den: Das Gros der Regeln bleibt dau­er­haft gela­den, da sie ein­fach in einer nach dem Inter­face benann­ten Chain “vlan1” sit­zen, die­ser Name aber für nfta­bles kei­ner­lei Bedeu­tung hat. Den Teil der Regeln, der bei Ver­än­de­rung der Netz­werk­in­ter­faces ange­passt wer­den muss, lagern wir in eine extra Datei aus:

# cat /etc/nftables.d/interfaces/vlan1.conf
add element inet filter oif_jump {
    vlan1 : goto vlan1,
}
# nft list chain inet filter forward
table inet filter {
    chain forward {
        type filter hook forward priority filter; policy drop;
        oif vmap @oif_jump
    }
}

nfta­bles über­setzt beim Laden der ers­ten Datei den Inter­face-Namen “vlan1” in den Inter­face-Index (z.B. 42) und spei­chert nur den im Ker­nel. In der For­ward-Chain nut­zen wir dann die Map-Funk­tio­na­li­tät von nfta­bles aus und sprin­gen abhän­gig vom Index des aus­ge­hen­den Inter­faces direkt in die ent­spre­chende Chain – und zwar ohne linear alle Inter­faces durchzugehen!

Das Laden der Inter­face-Dateien (und noch eini­ges andere) über­nimmt dann udev für uns:

# cat /etc/udev/rules.d/99-load-nftables.rules
SUBSYSTEM=="net", ACTION=="add", RUN+="/usr/local/lib/udev/load-nftables.sh"
# cat /usr/local/lib/udev/load-nftables.sh
#!/bin/sh
nft -f "/etc/nftables.d/interfaces/${INTERFACE}.conf"

Als Übung für zu Hause muss noch das Init­script von nfta­bles ange­passt wer­den. Regeln für bereits exis­tente Inter­faces sol­len gleich mit gela­den wer­den (z.B. auch beim Rel­oad der Regeln), aber nicht die der noch nicht ange­leg­ten (da ansons­ten der ganze Lade­vor­gang abbricht).

Rou­ting und Fire­wal­ling mit Linux: Run­ter auf die Hardware-Ebene

In den Tests sah alles gut aus. Im Pro­duk­tiv­be­trieb kam es trotz­dem zu Paket­ver­lus­ten, die wir uns sehr lange nicht erklä­ren konn­ten. Immer­hin zeig­ten die Sta­tis­ti­ken auf der Netz­werk­karte, dass über­haupt Pakete ver­wor­fen wur­den. Wir hat­ten also ein mess­ba­res Phänomen!

Die Recher­che för­derte viele mög­li­che Ursa­che für sol­chen Paket­ver­lust zu Tage. Wir stell­ten also z.B. sicher, dass Pakete nicht erst zwi­schen den ver­schie­de­nen Pro­zes­so­ren eines Mehr­pro­zes­sor­sys­tems hin und her gereicht wer­den muss­ten, doch lei­der ohne Erfolg.

Inten­si­ves Moni­to­ring im Sekun­den­ab­stand zeigte dann irgend­wann einen Zusam­men­hang: Wenn plötz­lich viele Pakete ankom­men (ein “Burst”) und die CPU vor­her nicht auf vol­ler Leis­tung lief ist sie zu lang­sam im Hoch­tak­ten um den Ansturm zu ver­ar­bei­ten. Die Lösung war also ein­fach, sämt­li­che Ener­gie­spar­funk­tio­nen der Pro­zes­so­ren zu deaktivieren.

Und noch einen wei­te­ren Trick haben wir aus­ge­spielt: Anstatt die Absen­der­adres­sen der ein­ge­hen­den Pakete anhand der Rou­ting-Tabelle zu über­prü­fen (uRPF aka rp_filter) haben wir diese Infor­ma­tion mit in nfta­bles-Regeln ver­packt! Denn um den kür­zes­ten mög­li­chen Weg zu wäh­len haben alle Rou­ter eine voll­stän­dige Sicht der glo­ba­len Rou­ting­ta­belle. Und zusätz­lich zur Emp­fän­ger- auch noch die Absen­der­adresse jedes Paket gegen alle 800.000 Rou­ten zu prü­fen hat noch ein­mal ordent­lich Leis­tung geschluckt.

# nft list table netdev ingress
table netdev ingress {
        chain common {          
                meta pkttype { broadcast, multicast } accept                                                                            
                meta protocol arp accept       
                ip6 saddr fe80::/64 accept
        }

        chain vlan1 {
                type filter hook ingress device "vlan1" priority filter; policy drop;
                ip saddr 192.0.2.0/24 accept
                goto common
        }
}

nfta­bles bear­bei­tet diese Regeln der net­dev-Klasse sehr früh auf dem Weg des Pakets durch den Ker­nel. Er ver­wirft Pakete von ungül­ti­gen Adres­sen so bereits bevor ihre Emp­fän­ger­adres­sen in der Rou­ting­ta­belle auf­ge­löst wer­den. Außer­dem kön­nen wir so auch Adres­sen von einem Inter­face erlau­ben, die aktu­ell viel­leicht einen ande­ren Weg neh­men (asym­me­tri­sches Routing).

Aus­blick

Jetzt haben wir einen Linux-Ser­ver zum Rou­ten und Fire­wal­ling kon­fi­gu­riert. Aber so ein zen­tra­les Sys­tem kommt natür­lich nicht ohne Red­un­danz aus! Im nächs­ten Arti­kel (wird dem­nächst ver­öf­fent­licht) wer­den wir uns also um Red­un­danz via VRRP kümmern.

Firewalls, ipset, iptables, Linux-Server, nftables, Router, Routing, VLAN

Tags

  • Abhängigkeiten in Nagios
  • Asset Management
  • Catchall
  • Debian Buster
  • E-Mail
  • eBGP-Router
  • Firewalls
  • ipset
  • iptables
  • Konfiguration Netzwerk
  • Linux-Server
  • Mailserver
  • Monitoring
  • Nagios
  • Netzwerkadministration
  • nftables
  • Postfix
  • Router
  • Routing
  • Serverkonfiguration
  • Switch
  • VLAN
  • VLANs
  • VyOS

PLUTEX Ser­vices

  • Ser­ver­ma­nage­ment
  • Mana­ged Backup
  • Mana­ged Firewall
  • Mana­ged Monitoring
  • Update- und Patchmanagement
  • Con­sul­ting: Bera­tung auf Augenhöhe

Wei­tere Informationen

  • Kon­takt
  • Refe­ren­zen
  • Sta­tus Rechenzentren
  • PLUTEX Tech­Blog
  • PLUTEX Cus­to­mer-Cen­ter
  • PLUTEX Doku­Wiki & HowTos

Social

  • Face­book
  • Twit­ter
  • Lin­ke­dIn
  • Xing
  • Insta­gram

Foo­ter bottom

  • Impres­sum
  • Daten­schutz
  • AGBs
© 2025 PLUTEX • Erstellt mit GeneratePress