Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| navody:server:firewall [2018/09/25 11:53] – [FirewallD] andrej | 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ží | ||
| + | čistý Debian nebo Ubuntu obvykle žádná vlastní omezující pravidla nemají. | ||
| - | Linuxové jádro obsahuje | + | Vlastní |
| + | a pravidelně aktualizované služby a ostatní vůbec nespouštět. Firewall přidává | ||
| + | další ochrannou vrstvu, ale nenahrazuje bezpečnou konfiguraci, aktualizace ani | ||
| + | přihlašování pomocí SSH klíčů. | ||
| - | Na našem VPS je v každém případě nejprve potřeba povolit podporu iptables. Pokud to neuděláte, | + | ===== Jak pravidla fungují ===== |
| - | {{:navody:vps:features.png?300|}} | + | 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 prvotních hrátkách s firewallem je možné, že si neopatrným zásahem odříznete cestu k VPS. Nepanikařte a přejděte na návod k [[navody:vps: | + | Při filtrování na samotné |
| - | ===== IPtables ===== | + | * **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 pro VPN, router nebo některé kontejnery. | ||
| - | Současný stav je možné zjistit pomocí | + | 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í. | ||
| - | iptables -L | + | IPv4 a IPv6 jsou dvě samostatné rodiny adres. Firewall musí chránit obě; |
| - | + | povolení služby jen pro IPv4 ji neschová na veřejné IPv6 adrese. | |
| - | Výstup bude vypadat pravděpodobně nějak takto | + | |
| - | < | + | 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í a jiných služeb, které si vytvářejí vlastní firewallová pravidla. | ||
| - | Chain FORWARD (policy ACCEPT) | + | <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ě. | ||
| + | </ | ||
| - | Chain OUTPUT (policy ACCEPT) | + | ===== Jednoduchý firewall pomocí iptables ===== |
| - | target | + | |
| - | + | ||
| - | Ve výpisu jsou zobrazeny tři řetězce (chain): vstup, průchod a výstup. V nich v současné době nejsou žádná pravidla, která by regulovala průchod paketů. V takovém případě se uplatňuje výchozí politika (policy), která je ve všech třech případech nastavena na „povol“ (ACCEPT). Všechny pakety tedy nyní projdou bez filtrace. | + | |
| - | < | + | Syntaxe '' |
| + | současném Debianu příkazy '' | ||
| + | to pomocí '' | ||
| + | '' | ||
| - | Je čas naučit náš firewall nějaká pravidla. Jejich syntaxe je následující: | + | 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: | ||
| - | řetězec pravidlo akce | + | <code bash> |
| + | # | ||
| + | set -eu | ||
| - | Každé pravidlo musí patřit do nějakého | + | # Nainstaluj nástroje pro příkazovou |
| + | apt update | ||
| + | apt install -y iptables iptables-persistent | ||
| - | | + | # Při nahrazování současných pravidel ponech provoz povolený. |
| + | iptables -P INPUT ACCEPT | ||
| + | iptables | ||
| + | iptables | ||
| + | ip6tables -P INPUT ACCEPT | ||
| + | ip6tables | ||
| + | ip6tables | ||
| - | Takto můžete ručně zapsat různá | + | # Odstraň současná pravidla |
| + | iptables -F | ||
| + | iptables -X | ||
| + | ip6tables -F | ||
| + | ip6tables -X | ||
| - | iptables -F | + | # 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 | ||
| - | Pokud naopak potřebujete | + | # Vstup IPv6: použij stejná |
| + | ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP | ||
| + | ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT | ||
| + | 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 | ||
| - | <note important> | + | # 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 | ||
| - | < | + | # Ulož pravidla a zobraz výslednou politiku vstupu. |
| + | netfilter-persistent save | ||
| + | iptables -L INPUT -n -v | ||
| + | ip6tables -L INPUT -n -v | ||
| + | </code> | ||
| - | # Pusť veškerý | + | **Výsledek: |
| - | -A INPUT -i lo -j ACCEPT | + | a nová TCP spojení na porty 22, 80 a 443. Ostatní příchozí a veškerý |
| - | -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT | + | předávaný |
| - | # Propusť všechen provoz už navázaných spojení | + | '' |
| - | -A INPUT -m state --state ESTABLISHED, | + | '' |
| + | '' | ||
| + | [[https:// | ||
| + | [[https:// | ||
| - | # Povol veškerý odchozí provoz | + | ===== Nativní nftables ===== |
| - | -A OUTPUT -j ACCEPT | + | |
| - | # Otevři příchozí porty pro HTTP a HTTPS | + | nftables spravuje IPv4 i IPv6 v jednom pravidlovém jazyce. Ulož následující |
| - | -A INPUT -p tcp --dport 80 -j ACCEPT | + | konfiguraci do ''/ |
| - | -A INPUT -p tcp --dport 443 -j ACCEPT | + | rodiny adres a pořadí pravidel odpovídá výkladu výše: |
| - | # Povol veškerá spojení na SSH | + | <code bash> |
| - | -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT | + | #!/ |
| - | # Povol spojení jen z mé IP adresy | + | |
| - | # -I INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT | + | |
| - | # Zakaž všechno ostatní, co prošlo až sem. | + | # Nahraď celou současnou sadu pravidel. |
| - | -A INPUT -j REJECT | + | flush ruleset |
| - | -A FORWARD -j REJECT | + | |
| - | COMMIT | + | 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; | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| - | Takový konfigurační soubor je možné získat | + | **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í. | ||
| - | iptables-save > / | + | Konfiguraci nejprve zkontroluj bez aplikování pomocí '' |
| + | službu, která ji načte nyní i při dalších startech: | ||
| - | Stejně tak je možné obsah souboru znovu načíst do jádra: | + | <code bash> |
| + | # | ||
| + | set -eu | ||
| - | iptables-restore < / | + | # Nainstaluj nftables. |
| + | apt update | ||
| + | apt install -y nftables | ||
| - | Pokud chcete, aby se tento příkaz spouštěl při startu systému a tedy aby se při startu VPS načetla všechna zadaná pravidla, zapište do souboru '' | + | # Před použitím zkontroluj celou konfiguraci. |
| + | nft -c -f /etc/nftables.conf | ||
| - | < | + | # Načti konfiguraci nyní i při startu a pak zobraz výsledek. |
| - | / | + | systemctl enable |
| + | nft list ruleset | ||
| + | </ | ||
| - | Soubor pak učiňte spustitelným: | + | Po úpravě soubor znovu ověř pomocí '' |
| + | ho příkazem '' | ||
| + | [[https:// | ||
| + | [[https:// | ||
| - | chmod +x / | + | ===== UFW na Debianu a Ubuntu ===== |
| - | Od této chvíle se při startu serveru aplikují firewallová | + | 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 | ||
| + | ''/ | ||
| - | ===== Shorewall ===== | + | <code bash> |
| + | # | ||
| + | set -eu | ||
| - | Nastavení firewallu se dělá pomocí balíku | + | 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 | ||
| + | </ | ||
| - | apt-get install shorewall | + | **Výsledek: |
| - | cd / | + | 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 ===== |
| - | Nastavení | + | 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: | ||
| - | #ZONE | + | <code bash> |
| - | # OPTIONS | + | #!/ |
| - | fw firewall | + | set -eu |
| - | net ipv4 | + | |
| - | | + | |
| + | 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:** Zóna '' |
| + | '' | ||
| + | provoz se dál řídí existujícími pravidly a cílem zóny. Toto nastavení neomezuje | ||
| + | odchozí provoz z VPS. | ||
| - | Tohle je nastaveni implicitních akcí (vyhodnocuje | + | Použij zónu, kterou pro rozhraní VPS ukáže '' |
| + | --get-active-zones''; | ||
| + | '' | ||
| + | změna se projeví až po '' | ||
| + | [[https:// | ||
| - | # | + | ===== NixOS ===== |
| - | # | + | |
| - | + | ||
| - | # povol spojeni "ze serveru na internet" | + | |
| - | $FW | + | |
| - | + | ||
| - | # zahod vsechno "z internetu na server" | + | |
| - | net | + | |
| - | + | ||
| - | # odmitni vsechno "z vpn na internet" | + | |
| - | vpn | + | |
| - | + | ||
| - | # povol vsechno ostatni "z vpn" | + | |
| - | vpn | + | |
| - | + | ||
| - | # The FOLLOWING POLICY MUST BE LAST | + | |
| - | all | + | |
| + | NixOS má '' | ||
| + | porty popiš deklarativně. Následující modul můžeš uložit jako | ||
| + | ''/ | ||
| + | '' | ||
| - | **/etc/ | + | <code nix> |
| + | { ... }: | ||
| + | { | ||
| + | networking.firewall = { | ||
| + | enable = true; | ||
| + | allowedTCPPorts = [ 22 80 443 ]; | ||
| + | }; | ||
| + | } | ||
| + | </code> | ||
| - | FORMAT 2 | + | **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 |
| - | net | + | 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í '' | ||
| - | Tady se nastavují jednotlivá pravidla, kterými se pak firewall řídí. V následujícím souboru jsou v komentářích vysvětleny jendotlivé příklady. | + | <code bash> |
| + | # | ||
| + | set -eu | ||
| - | # | + | nixos-rebuild test |
| - | # | + | </code> |
| - | #SECTION ALL | + | |
| - | #SECTION ESTABLISHED | + | |
| - | #SECTION RELATED | + | |
| - | SECTION NEW | + | |
| - | + | ||
| - | # povoleni SSH sluzby pro klienty z internetu | + | |
| - | + | ||
| - | ACCEPT | + | |
| - | # - pro urcitou IP adresu | + | |
| - | # | + | |
| - | # - pro skupinu IP adres (subnet) | + | |
| - | # | + | |
| - | + | ||
| - | # OpenVPN | + | |
| - | ACCEPT | + | |
| - | ACCEPT | + | |
| - | + | ||
| - | # WEB | + | |
| - | ACCEPT | + | |
| - | ACCEPT | + | |
| - | **/etc/default/shorewall** | + | Ověř nové SSH spojení. Teprve když funguje, ulož konfiguraci do nové bootovací |
| + | generace: | ||
| + | |||
| + | <code bash> | ||
| + | #!/usr/bin/env bash | ||
| + | set -eu | ||
| + | |||
| + | nixos-rebuild switch | ||
| + | </ | ||
| - | V tomto souboru je potřeba Shorewallu říci, že má začít pracovat a načítat konfigurační soubory. | + | Viz [[https:// |
| - | startup=1 | + | ===== 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 | ||
| + | '' | ||
| - | Poté můžeme nechat Shorewall zkontrolovat konfiguraci: | + | Podrobnosti a možnosti filtrování popisuje |
| + | [[https:// | ||
| - | shorewall check | + | ===== Když se odřízneš ===== |
| - | + | ||
| - | Pokud potvrdí '' | + | |
| - | shorewall start|stop|restart|... | + | Pokud nové SSH spojení po změně firewallu nefunguje, **nezavírej původní |
| + | relaci**. Z ní zkontroluj '' | ||
| + | '' | ||
| + | '' | ||
| - | Další | + | Když už žádné SSH spojení nemáš, návod ke [[navody: |
| - | + | ve vpsAdminu]] tě provede obnovením | |
| - | | + | menu]] nabízí záchranný postup nezávislý na funkční síti a povoleném portu SSH. |
| - | shorewall show | + | Položka **Run shell** při restartu zpřístupní shell přímo v souborovém systému |
| - | | + | VPS, odkud můžeš pravidla opravit. |
| - | shorewall safe-restart | + | |
| - | Odkazy: [[http:// | + | 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. | ||
| - | ===== FirewallD ===== | + | V prostředí **Run shell** neběží systemd ani správce firewallu. Obnov v něm |
| + | trvalou konfiguraci, | ||
| + | ''/ | ||
| + | spusť normálně. Na NixOS můžeš ve start menu místo toho vybrat předchozí | ||
| + | funkční generaci a pak konfiguraci opravit. | ||
| - | FirewallD v defaultním nastavení na CentOS7 na vpsFree nefunguje - pokud jej zapnete bez následujícího kroku, nejspíš se pak nebudete moct na svou VPS připojit přes SSH. Je potřeba v konfiguráku ''/ | + | 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ě. | ||
| - | IPv6_rpfilter=no | ||