Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Následující verze | Předchozí verze | ||
| navody:server:firewall [2015/10/14 12:11] – vytvořeno krcmar | navody:server:firewall [2026/08/16 18:56] (aktuální) – Přirozenější znění návodů, lokalizace ukázek a doplnění týdenního vyzkoušení VPS aither | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| + | < | ||
| + | |||
| + | < | ||
| + | source=" | ||
| + | test=" | ||
| + | /> | ||
| + | |||
| ====== Firewall ====== | ====== Firewall ====== | ||
| - | Firewall | + | Firewall |
| + | VPS. vpsFree před VPS žádný společný firewall nezapíná. Výchozí stav proto | ||
| + | záleží na distribuci: například NixOS má firewall standardně zapnutý, zatímco | ||
| + | čistý Debian nebo Ubuntu obvykle žádná vlastní omezující pravidla nemají. | ||
| + | |||
| + | Vlastní firewall **není povinný**. Může být rozumné provozovat jen potřebné | ||
| + | a pravidelně aktualizované služby a ostatní vůbec nespouštět. Firewall přidává | ||
| + | další ochrannou vrstvu, ale nenahrazuje bezpečnou konfiguraci, | ||
| + | přihlašování pomocí SSH klíčů. | ||
| + | |||
| + | ===== Jak pravidla fungují ===== | ||
| + | |||
| + | Síťový program naslouchá na kombinaci adresy, protokolu (nejčastěji TCP nebo | ||
| + | UDP) a portu. Web běžně používá TCP porty 80 a 443, SSH TCP port 22. Příkaz | ||
| + | '' | ||
| + | všechny IPv4 adresy, '' | ||
| + | je dostupná jen uvnitř VPS. | ||
| + | |||
| + | Při filtrování na samotné VPS se setkáš se třemi základními řetězci: | ||
| + | |||
| + | * **INPUT** zpracovává příchozí pakety určené VPS. | ||
| + | * **OUTPUT** zpracovává pakety odesílané z VPS. | ||
| + | * **FORWARD** zpracovává pakety směrované přes VPS, například | ||
| + | |||
| + | Pravidla v řetězci se vyhodnocují shora dolů. Jakmile paket odpovídá pravidlu | ||
| + | s konečnou akcí, například '' | ||
| + | se už nezkoušejí. Pokud žádné pravidlo nerozhodne, použije se výchozí politika | ||
| + | řetězce. Stavový firewall navíc pozná pakety patřící k navázanému spojení, takže | ||
| + | odpovědi může povolit dříve než pravidla pro nová spojení. | ||
| + | |||
| + | IPv4 a IPv6 jsou dvě samostatné rodiny adres. Firewall musí chránit obě; | ||
| + | povolení služby jen pro IPv4 ji neschová | ||
| + | |||
| + | Vyber si **jeden** způsob správy firewallu. Nekombinuj ruční pravidla | ||
| + | '' | ||
| + | budou ovlivňovat. Jednoduchá pravidla níže počítají s VPS bez Dockeru, VPN, | ||
| + | směrování | ||
| + | |||
| + | <note important> | ||
| + | Než zapneš blokující politiku, povol TCP port 22, nech otevřené současné SSH | ||
| + | spojení a přihlášení ověř v druhém terminálu. Stejný postup opakuj po každé | ||
| + | větší změně. | ||
| + | </ | ||
| + | |||
| + | ===== Jednoduchý firewall pomocí iptables ===== | ||
| + | |||
| + | Syntaxe '' | ||
| + | současném Debianu příkazy '' | ||
| + | to pomocí '' | ||
| + | '' | ||
| + | |||
| + | Tento skript pro čistou VPS povolí loopback, ICMP, navázaná spojení a nová TCP | ||
| + | spojení na porty 22, 80 a 443. INPUT a FORWARD mají nakonec politiku '' | ||
| + | OUTPUT zůstává '' | ||
| + | vytvoří pravidla a blokující politiky zapne až nakonec: | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | # Nainstaluj nástroje pro příkazovou řádku a trvalé ukládání pravidel. | ||
| + | apt update | ||
| + | apt install -y iptables iptables-persistent | ||
| + | |||
| + | # Při nahrazování současných pravidel ponech provoz povolený. | ||
| + | iptables -P INPUT ACCEPT | ||
| + | iptables -P FORWARD ACCEPT | ||
| + | iptables -P OUTPUT ACCEPT | ||
| + | ip6tables -P INPUT ACCEPT | ||
| + | ip6tables -P FORWARD ACCEPT | ||
| + | ip6tables -P OUTPUT ACCEPT | ||
| + | |||
| + | # Odstraň současná pravidla filtru a uživatelsky definované řetězce. | ||
| + | iptables -F | ||
| + | iptables -X | ||
| + | ip6tables -F | ||
| + | ip6tables -X | ||
| + | |||
| + | # Vstup IPv4: zahoď neplatné pakety, zachovej navázaný provoz a otevři služby. | ||
| + | iptables -A INPUT -m conntrack --ctstate INVALID -j DROP | ||
| + | iptables -A INPUT -m conntrack --ctstate ESTABLISHED, | ||
| + | iptables -A INPUT -i lo -j ACCEPT | ||
| + | iptables -A INPUT -p icmp -j ACCEPT | ||
| + | iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT | ||
| + | |||
| + | # Vstup IPv6: použij stejná pravidla a zachovej funkční řídicí provoz IPv6. | ||
| + | ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP | ||
| + | ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED, | ||
| + | ip6tables -A INPUT -i lo -j ACCEPT | ||
| + | ip6tables -A INPUT -p ipv6-icmp -j ACCEPT | ||
| + | ip6tables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT | ||
| + | |||
| + | # Zahoď ostatní vstupní a předávaný provoz, místní odchozí provoz ponech povolený. | ||
| + | iptables -P INPUT DROP | ||
| + | iptables -P FORWARD DROP | ||
| + | ip6tables -P INPUT DROP | ||
| + | ip6tables -P FORWARD DROP | ||
| + | |||
| + | # Ulož pravidla a zobraz výslednou politiku vstupu. | ||
| + | netfilter-persistent save | ||
| + | iptables -L INPUT -n -v | ||
| + | ip6tables -L INPUT -n -v | ||
| + | </ | ||
| + | |||
| + | **Výsledek: | ||
| + | a nová TCP spojení na porty 22, 80 a 443. Ostatní příchozí a veškerý | ||
| + | předávaný provoz se zahodí, odchozí provoz z VPS zůstane povolený. | ||
| + | |||
| + | '' | ||
| + | '' | ||
| + | '' | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | ===== Nativní nftables ===== | ||
| + | |||
| + | nftables spravuje IPv4 i IPv6 v jednom pravidlovém jazyce. Ulož následující | ||
| + | konfiguraci do ''/ | ||
| + | rodiny adres a pořadí pravidel odpovídá výkladu výše: | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | |||
| + | # Nahraď celou současnou sadu pravidel. | ||
| + | flush ruleset | ||
| + | |||
| + | table inet filter { | ||
| + | chain input { | ||
| + | type filter hook input priority filter; policy drop; | ||
| + | |||
| + | # Nejprve zpracuj stav, povol loopback, zachovej řídicí provoz a otevři služby. | ||
| + | ct state invalid drop | ||
| + | ct state established, | ||
| + | iifname " | ||
| + | meta l4proto { icmp, ipv6-icmp } accept | ||
| + | tcp dport { 22, 80, 443 } accept | ||
| + | } | ||
| + | |||
| + | chain forward { | ||
| + | # Tento jednoduchý firewall nepředává žádný provoz. | ||
| + | type filter hook forward priority filter; policy drop; | ||
| + | } | ||
| + | |||
| + | chain output { | ||
| + | # Povol veškerý provoz vytvořený na VPS. | ||
| + | type filter hook output priority filter; policy accept; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Výsledek: | ||
| + | jako předchozí příklad: povolí loopback, ICMP, navázaná spojení a nová TCP | ||
| + | spojení na porty 22, 80 a 443, ostatní vstup a předávání zahodí a odchozí | ||
| + | provoz povolí. | ||
| + | |||
| + | Konfiguraci nejprve zkontroluj bez aplikování pomocí '' | ||
| + | službu, která ji načte nyní i při dalších startech: | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | # Nainstaluj nftables. | ||
| + | apt update | ||
| + | apt install -y nftables | ||
| + | |||
| + | # Před použitím zkontroluj celou konfiguraci. | ||
| + | nft -c -f / | ||
| + | |||
| + | # Načti konfiguraci nyní i při startu a pak zobraz výsledek. | ||
| + | systemctl enable --now nftables | ||
| + | nft list ruleset | ||
| + | </ | ||
| + | |||
| + | Po úpravě soubor znovu ověř pomocí '' | ||
| + | ho příkazem '' | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | ===== UFW na Debianu a Ubuntu ===== | ||
| + | |||
| + | UFW nabízí jednodušší rozhraní ke stavovému firewallu. Tento příklad přidá | ||
| + | pravidla, která povolí SSH a web. Stávající uživatelská pravidla zůstanou | ||
| + | platná a vestavěná pravidla dál obslouží loopback a nezbytný síťový řídicí | ||
| + | provoz. Pro provoz, na který se žádné z těchto pravidel nevztahuje, výchozí | ||
| + | politiky zahodí nová příchozí spojení a povolí odchozí provoz. Výchozí | ||
| + | instalace spravuje IPv4 i IPv6; skript před zapnutím ověří, že | ||
| + | ''/ | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | apt update | ||
| + | apt install -y ufw | ||
| + | ufw default deny incoming | ||
| + | ufw default allow outgoing | ||
| + | ufw allow 22/tcp comment ' | ||
| + | ufw allow 80/tcp comment ' | ||
| + | ufw allow 443/tcp comment ' | ||
| + | ufw show added | ||
| + | grep -Fx ' | ||
| + | ufw --force enable | ||
| + | ufw status verbose | ||
| + | </ | ||
| + | |||
| + | **Výsledek: | ||
| + | na porty 22, 80 a 443. Stávající uživatelská pravidla i vestavěná pravidla UFW | ||
| + | zůstanou platná. Pro provoz, na který se žádné pravidlo nevztahuje, výchozí | ||
| + | politiky zahodí nová příchozí spojení a povolí odchozí provoz. | ||
| + | |||
| + | Pokud kontrola '' | ||
| + | opravit. Pravidlo smažeš například příkazem '' | ||
| + | Číslovaný seznam zobrazí '' | ||
| + | [[https:// | ||
| + | |||
| + | ===== firewalld na Fedoře a distribucích rodiny RHEL ===== | ||
| + | |||
| + | firewalld sdružuje rozhraní a pravidla do zón a umí služby pojmenovat. | ||
| + | Následující nastavení použije výchozí zónu '' | ||
| + | web a pak trvalou konfiguraci načte: | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | dnf install -y firewalld | ||
| + | systemctl enable --now firewalld | ||
| + | firewall-cmd --set-default-zone=public | ||
| + | firewall-cmd --permanent --zone=public --add-service=ssh | ||
| + | firewall-cmd --permanent --zone=public --add-service=http | ||
| + | firewall-cmd --permanent --zone=public --add-service=https | ||
| + | firewall-cmd --reload | ||
| + | firewall-cmd --get-active-zones | ||
| + | firewall-cmd --zone=public --list-all | ||
| + | </ | ||
| + | |||
| + | **Výsledek: | ||
| + | '' | ||
| + | provoz se dál řídí existujícími pravidly a cílem zóny. Toto nastavení neomezuje | ||
| + | odchozí provoz z VPS. | ||
| + | |||
| + | Použij zónu, kterou pro rozhraní VPS ukáže '' | ||
| + | --get-active-zones''; | ||
| + | '' | ||
| + | změna se projeví až po '' | ||
| + | [[https:// | ||
| + | |||
| + | ===== NixOS ===== | ||
| + | |||
| + | NixOS má '' | ||
| + | porty popiš deklarativně. Následující modul můžeš uložit | ||
| + | ''/ | ||
| + | '' | ||
| + | |||
| + | <code nix> | ||
| + | { ... }: | ||
| + | { | ||
| + | networking.firewall = { | ||
| + | enable = true; | ||
| + | allowedTCPPorts = [ 22 80 443 ]; | ||
| + | }; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Výsledek: | ||
| + | a 443. Firewall dál povolí navázaná spojení a vestavěný síťový řídicí provoz. | ||
| + | Výchozí politika zahodí ostatní nový příchozí provoz, který nepovolí tento ani | ||
| + | jiný modul. Odchozí provoz modul neomezuje. | ||
| + | |||
| + | Některé služby mají vlastní volbu '' | ||
| + | otevře automaticky. Před změnou si ověř, co daný modul nastavuje. První | ||
| + | aktivaci proveď pomocí '' | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | nixos-rebuild test | ||
| + | </ | ||
| + | |||
| + | Ověř nové SSH spojení. Teprve když funguje, ulož konfiguraci do nové bootovací | ||
| + | generace: | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -eu | ||
| + | |||
| + | nixos-rebuild switch | ||
| + | </ | ||
| + | |||
| + | Viz [[https:// | ||
| + | |||
| + | ===== Docker a jiné kontejnery ===== | ||
| + | |||
| + | Port publikovaný Dockerem může procházet pravidly, která vytvoří Docker, a | ||
| + | nemusí se řídit očekáváním z UFW nebo firewalld. Nepovažuj proto '' | ||
| + | incoming'' | ||
| + | mají být opravdu veřejné; službu pro místní reverzní proxy navaž například na | ||
| + | '' | ||
| + | |||
| + | Podrobnosti | ||
| + | [[https:// | ||
| + | |||
| + | ===== Když se odřízneš ===== | ||
| + | |||
| + | Pokud nové SSH spojení po změně firewallu nefunguje, **nezavírej původní | ||
| + | relaci**. Z ní zkontroluj '' | ||
| + | '' | ||
| + | '' | ||
| + | |||
| + | Když už žádné SSH spojení nemáš, návod ke [[navody: | ||
| + | ve vpsAdminu]] tě provede obnovením přístupu. [[navody: | ||
| + | menu]] nabízí záchranný postup nezávislý na funkční síti a povoleném portu SSH. | ||
| + | Položka **Run shell** při restartu zpřístupní shell přímo v souborovém systému | ||
| + | VPS, odkud můžeš pravidla opravit. | ||
| + | |||
| + | V normálně spuštěném systému UFW dočasně vypne '' | ||
| + | '' | ||
| + | iptables nejdřív nastav politiku INPUT pro IPv4 i IPv6 na '' | ||
| + | potom pravidla opravuj. | ||
| - | Linuxové jádro obsahuje firewall zvaný Netfilter, který je obsluhován pomocí utility | + | V prostředí **Run shell** neběží systemd ani správce firewallu. Obnov v něm |
| + | trvalou konfiguraci, například | ||
| + | ''/ | ||
| + | spusť normálně. Na NixOS můžeš ve start menu místo toho vybrat předchozí | ||
| + | funkční generaci a pak konfiguraci opravit. | ||
| - | Na našem VPS je v každém případě nejprve potřeba povolit podporu iptables. V detailu VPS je potřeba zapnout podporu iptables a potvrdit. Dojde k restartu VPS a podpora je zapnutá. | + | Dočasné vypnutí odstraňuje ochrannou vrstvu. Firewall potom znovu zapni a nové |
| + | SSH spojení ověř. Nemaž naslepo nízkoúrovňová pravidla, pokud mohou patřit | ||
| + | Dockeru, VPN nebo jiné službě. | ||