Uživatelské nástroje

Nástroje pro tento web


navody:server:firewall

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
navody:server:firewall [2015/10/14 12:25] krcmarnavody: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:
 +<page>manuals:server:firewall</page>
 +
 +<kb-managed
 +  source="https://github.com/vpsfreecz/vpsfree-kb-contracts/blob/master/contract/pages/navody-server-firewall.txt"
 +  test="https://github.com/vpsfreecz/vpsfree-kb-contracts/blob/master/tests/suite/kb/firewall.nix"
 +/>
 +
 ====== Firewall ====== ====== Firewall ======
  
-Firewall slouží pro filtraci provozu na VPS z nějPomocí je možné nastavovat pravidla pro konkrétní pakety, které jsou propouštěny na základe různých parametrů jako jsou zdrojová cílová IP adresazdrojový či cílový port podobně.+Firewall rozhoduje, který síťový provoz smí projít do VPS, z VPS nebo přes 
 +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é 
 +pravidelně aktualizované služby a ostatní vůbec nespouštětFirewall přidává 
 +další ochrannou vrstvu, ale nenahrazuje bezpečnou konfiguraci, aktualizace ani 
 +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 
 +''ss -lntup'' ukáže, které služby právě naslouchají. Adresa ''0.0.0.0'' znamená 
 +všechny IPv4 adresy, ''[::]'' všechny IPv6 adresy a ''127.0.0.1'' nebo ''[::1]'' 
 +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 pro VPN, router nebo některé kontejnery. 
 + 
 +Pravidla v řetězci se vyhodnocují shora dolů. Jakmile paket odpovídá pravidlu 
 +s konečnou akcí, například ''ACCEPT'', ''DROP'' nebo ''REJECT'', další pravidla 
 +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á na veřejné IPv6 adrese. 
 + 
 +Vyber si **jeden** způsob správy firewallu. Nekombinuj ruční pravidla 
 +''iptables'' nebo ''nftables'' s UFW či firewalld, pokud přesně nevíš, jak se 
 +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. 
 + 
 +<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é 
 +tší změně. 
 +</note> 
 + 
 +===== Jednoduchý firewall pomocí iptables ===== 
 + 
 +Syntaxe ''iptables'' bývá pro první nízkoúrovňové nastavení přehledná. Na 
 +současném Debianu příkazy ''iptables'' běžně používají backend nftables; ověříš 
 +to pomocí ''iptables -V'', kde je uvedeno ''nf_tables''. IPv4 obsluhuje 
 +''iptables'' a IPv6 samostatný příkaz ''ip6tables''
 + 
 +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 ''DROP'', 
 +OUTPUT zůstává ''ACCEPT''. Skript nejprve nastaví přijímající politiky, pak 
 +vytvoří pravidla blokující politiky zapne až nakonec: 
 + 
 +<code bash> 
 +#!/usr/bin/env 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é paketyzachovej navázaný provoz a otevři služby. 
 +iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 
 +iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
 +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,RELATED -j ACCEPT 
 +ip6tables -A INPUT -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í 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 
 +</code> 
 + 
 +**Výsledek:** Na IPv4 i IPv6 projde loopback, ICMP, provoz navázaných spojení 
 +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ý. 
 + 
 +''iptables-persistent'' uloží pravidla pro obě rodiny adres a služba 
 +''netfilter-persistent'' je znovu načte při startu. Při další změně spusť 
 +''netfilter-persistent save'' znovu. Další možnosti popisují manuály 
 +[[https://manpages.debian.org/trixie/iptables/iptables.8.en.html|iptables(8)]] a 
 +[[https://manpages.debian.org/trixie/netfilter-persistent/netfilter-persistent.8.en.html|netfilter-persistent(8)]]. 
 + 
 +===== Nativní nftables ===== 
 + 
 +nftables spravuje IPv4 i IPv6 v jednom pravidlovém jazyce. Ulož následující 
 +konfiguraci do ''/etc/nftables.conf''. Tabulka rodiny ''inet'' obslouží obě 
 +rodiny adres a pořadí pravidel odpovídá výkladu výše: 
 + 
 +<code bash> 
 +#!/usr/sbin/nft -f 
 + 
 +# 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,related accept 
 +    iifname "lo" accept 
 +    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; 
 +  } 
 +
 +</code> 
 + 
 +**Výsledek:** Jedna tabulka ''inet'' uplatní pro IPv4 i IPv6 stejnou politiku 
 +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í ''nft -c''. Pak zapni 
 +službu, která ji načte nyní i při dalších startech: 
 + 
 +<code bash> 
 +#!/usr/bin/env bash 
 +set -eu 
 + 
 +# Nainstaluj nftables. 
 +apt update 
 +apt install -y nftables 
 + 
 +# Před použitím zkontroluj celou konfiguraci. 
 +nft -c -f /etc/nftables.conf
  
-Linuxové jádro obsahuje firewall zvaný Netfilter, který je obsluhován pomocí utility ''iptables''. Tento ístup je nízkoúrovňový umožňuje nastavit velké množství různých parametrů a variant. Pohodlnější variantou je například nadstavba Shorewall, což je sada skriptů, které dovolují pravidla pro Netfilter z jednodušších konfiguračních souborů.+# Načti konfiguraci nyní i i startu pak zobraz výsledek. 
 +systemctl enable --now nftables 
 +nft list ruleset 
 +</code>
  
-Na našem VPS je v každém případě nejprve potřeba povolit podporu iptablesV detailu VPS je potřeba zapnout podporu iptables potvrditDojde k restartu VPS podpora je zapnutá.+Po úpravě soubor znovu ověř pomocí ''nft -c -f /etc/nftables.conf'' načti 
 +ho příkazem ''systemctl reload nftables''Podrobnosti najdeš na 
 +[[https://wiki.debian.org/nftables|wiki Debianu]] v manuálu 
 +[[https://manpages.debian.org/trixie/nftables/nft.8.en.html|nft(8)]].
  
-{{:navody:vps:features.png?300|}}+===== UFW na Debianu a Ubuntu =====
  
-===== IPtables =====+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 
 +''/etc/default/ufw'' obsahuje ''IPV6=yes'':
  
-Současný stav je možné zjistit pomocí+<code bash> 
 +#!/usr/bin/env bash 
 +set -eu
  
-  iptables -L +apt update 
-   +apt install -y ufw 
-Výstup bude vypadat pravděpodobně nějak takto+ufw default deny incoming 
 +ufw default allow outgoing 
 +ufw allow 22/tcp comment 'SSH' 
 +ufw allow 80/tcp comment 'HTTP' 
 +ufw allow 443/tcp comment 'HTTPS' 
 +ufw show added 
 +grep -Fx 'IPV6=yes' /etc/default/ufw 
 +ufw --force enable 
 +ufw status verbose 
 +</code>
  
-<code>  Chain INPUT (policy ACCEPT) +**Výsledek:** UFW na IPv4 i IPv6 povolí navázaná spojení a nová TCP spojení 
-  target     prot opt source               destination+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.
  
-  Chain FORWARD (policy ACCEPT) +Pokud kontrola ''IPV6=yes'' selže, UFW se nezapne a nejprve musíš nastavení 
-  target     prot opt source               destination+opravit. Pravidlo smažeš například příkazem ''ufw delete allow 80/tcp''
 +Číslovaný seznam zobrazí ''ufw status numbered''. Podrobnosti najdeš v 
 +[[https://documentation.ubuntu.com/server/how-to/security/firewalls/|dokumentaci firewallu pro Ubuntu]].
  
-  Chain OUTPUT (policy ACCEPT) +===== firewalld na Fedořdistribucích rodiny RHEL =====
-  target     prot opt source               destination</code> +
-   +
-Ve výpisu jsou zobrazeny tři řetězce (chain): vstup, průchod 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.+
  
-<note>Všechny tři řetězce jsou oddělené, paket prochází vždy jen jedním z nich. Pokud je zdrojem náš server, dostane se paket do řetězce OUTPUTPokud je naopak náš server cílempaket přichází do INPUT. Pokud jsou zdroj i cíl mimo náš stroj paket tedy jen prochází skrz, dostane se do FORWARD.</note> +firewalld sdružuje rozhraní a pravidla do zón a umí služby pojmenovat. 
-   +Následující nastavení použije výchozí zónu ''public''trvale v ní povolí SSH 
-===== Shorewall =====+web a pak trvalou konfiguraci načte:
  
-Nastavení firewallu se dělá pomocí balíku //shorewall//.+<code bash> 
 +#!/usr/bin/env bash 
 +set -eu
  
-  apt-get install shorewall +dnf install -y firewalld 
-  cd /etc/shorewall+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 
 +</code>
  
 +**Výsledek:** Zóna ''public'' na IPv4 i IPv6 povolí služby ''ssh'', ''http'' a
 +''https'' vedle služeb a pravidel, které už v zóně máš. Veškerý další příchozí
 +provoz se dál řídí existujícími pravidly a cílem zóny. Toto nastavení neomezuje
 +odchozí provoz z VPS.
  
-**/etc/shorewall/zones**+Použij zónu, kterou pro rozhraní VPS ukáže ''firewall-cmd 
 +--get-active-zones''; nemusí se vždy jmenovat ''public''. Změna bez 
 +''--permanent'' platí jen do restartu nebo načtení konfigurace, zatímco trvalá 
 +změna se projeví až po ''firewall-cmd --reload''. Více příkladů obsahuje 
 +[[https://firewalld.org/documentation/howto/open-a-port-or-service.html|dokumentace firewalld]].
  
-Nastavení zón ($FW v ostatních souborech se automaticky nahrazuje "fw").+===== NixOS =====
  
-  #ZONE   TYPE            OPTIONS         IN                      OUT +NixOS má ''networking.firewall.enable'' ve výchozím nastavení zapnuté. Otevřené 
-  #                                       OPTIONS                 OPTIONS +porty popiš deklarativně. Následující modul můžeš uložit jako 
-  fw      firewall +''/etc/nixos/firewall.nix'' a přidat ''./firewall.nix'' do existujícího seznamu 
-  net     ipv4 +''imports'' v ''/etc/nixos/configuration.nix'':
-  vpn     ipv4+
  
 +<code nix>
 +{ ... }:
 +{
 +  networking.firewall = {
 +    enable = true;
 +    allowedTCPPorts = [ 22 80 443 ];
 +  };
 +}
 +</code>
  
-**/etc/shorewall/policy**+**Výsledek:** Modul na IPv4 i IPv6 přidá mezi povolené nové TCP porty 22, 80 
 +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.
  
-Tohle je nastaveni implicitních akcí (vyhodnocuje se v zadaném pořadí!).+Některé služby mají vlastní volbu ''openFirewall'', která potřebné porty 
 +otevře automaticky. Před změnou si ověř, co daný modul nastavujePrvní 
 +aktivaci proveď pomocí ''nixos-rebuild test'':
  
-  #SOURCE         DEST            POLICY          LOG     LIMIT:    CONNLIMIT: +<code bash> 
-  #                                               LEVEL   BURST           MASK +#!/usr/bin/env bash 
-   +set -eu
-  # povol spojeni "ze serveru na internet" +
-  $FW             net             ACCEPT +
-   +
-  # zahod vsechno "z internetu na server" +
-  net             all             DROP            info +
-   +
-  # odmitni vsechno "z vpn na internet" (aby si vpn klienti nebrouzdali pres server) +
-  vpn             net             REJECT          info +
-   +
-  # povol vsechno ostatni "z vpn" +
-  vpn             all             ACCEPT +
-   +
-  The FOLLOWING POLICY MUST BE LAST +
-  all             all             REJECT          info+
  
 +nixos-rebuild test
 +</code>
  
-**/etc/shorewall/interfaces**+Ověř nové SSH spojení. Teprve když funguje, ulož konfiguraci do nové bootovací 
 +generace:
  
-  FORMAT 2 +<code bash> 
-  ############################################################################### +#!/usr/bin/env bash 
-  #ZONE           INTERFACE               OPTIONS +set -eu
-  net             venet0                  tcpflags,logmartians,nosmurfs +
-  vpn             tun0+
  
-**/ets/shorewall/rules**+nixos-rebuild switch 
 +</code>
  
-Tady se nastavují jednotlivá pravidla, kterými se pak firewall řídíV následujícím souboru jsou komentářích vysvětleny jendotlivé příklady.+Viz [[https://nixos.org/manual/nixos/stable/#sec-firewall|firewall manuálu NixOS]].
  
-  #ACTION   SOURCE            DEST         PROTO  DEST    SOURCE    ORIGINAL   RATE    USER/   MARK   CONNLIMIT   TIME    HEADERS     SWITCH +===== Docker a jiné kontejnery =====
-  #                                               PORT    PORT(S)   DEST       LIMIT   GROUP +
-  #SECTION ALL +
-  #SECTION ESTABLISHED +
-  #SECTION RELATED +
-  SECTION NEW +
-   +
-  # povoleni SSH sluzby pro klienty z internetu  +
-   +
-  ACCEPT    net               $FW          tcp    ssh +
-  # - pro urcitou IP adresu +
-  #ACCEPT    net:78.80.8.27    $FW          tcp    ssh +
-  # - pro skupinu IP adres (subnet) +
-  #ACCEPT    net:81.25.21.0/24 $FW          tcp    ssh +
-   +
-  # OpenVPN +
-  ACCEPT    net               $FW          udp    1194 +
-  ACCEPT    $FW               net          udp    -       1194 +
-   +
-  # WEB +
-  ACCEPT    all               all          tcp    80 +
-  ACCEPT    all               all          tcp    443+
  
-**/etc/default/shorewall**+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 ''deny 
 +incoming'' samo o sobě za ochranu všech kontejnerů. Publikuj jen porty, které 
 +mají být opravdu veřejné; službu pro místní reverzní proxy navaž například na 
 +''127.0.0.1:8080:80''. Po nasazení ověř dostupnost také z jiného stroje.
  
-V tomto souboru je potřeba Shorewallu říci, že má začít pracovat načítat konfigurační soubory.+Podrobnosti možnosti filtrování popisuje 
 +[[https://docs.docker.com/engine/network/packet-filtering-firewalls/|dokumentace firewallu Docker Engine]].
  
-  startup=1+===== Když se odřízneš =====
  
 +Pokud nové SSH spojení po změně firewallu nefunguje, **nezavírej původní
 +relaci**. Z ní zkontroluj ''ss -lntp'' a stav správce, který sis vybral:
 +''iptables -L -n'', ''nft list ruleset'', ''ufw status verbose'' nebo
 +''firewall-cmd --get-active-zones''.
  
-Poté můžeme nechat Shorewall zkontrolovat konfiguraci:+Když už žádné SSH spojení nemáš, návod ke [[navody:vps:konzole|vzdálené konzoli 
 +ve vpsAdminu]] tě provede obnovením přístupu. [[navody:vps:start_menu|Start 
 +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.
  
-  /etc/init.d/shorewall check +V normálně spuštěném systému UFW dočasně vypne ''ufw disable'', firewalld 
-   +''systemctl stop firewalld'' a nftables ''systemctl stop nftables''U ručních 
-Pokud potvrdí ''Configuration Validated'', můžeme ho spustit+iptables nejdřív nastav politiku INPUT pro IPv4 i IPv6 na ''ACCEPT'' a teprve 
 +potom pravidla opravuj.
  
-  /etc/init.d/shorewall start|stop|restart|...+V prostředí **Run shell** neběží systemd ani správce firewallu. Obnov v něm 
 +trvalou konfiguraci, například ''/etc/iptables/rules.v4''
 +''/etc/iptables/rules.v6'' nebo ''/etc/nftables.conf'', ukonči shell a systém 
 +spusť normálně. Na NixOS můžeš ve start menu místo toho vybrat předchozí 
 +funkční generaci a pak konfiguraci opravit.
  
-Další užitečné příkazy: +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 
-  shorewall status +Dockeru, VPN nebo jiné službě.
-  shorewall show +
-  shorevall safe-start +
-  shorewall safe-restart+
  
-Odkazy: [[http://shorewall.net/ | shorewall.net/]] , [[https://wiki.debian.org/HowTo/shorewall | wiki.debian.org/HowTo/shorewall]]  
navody/server/firewall.1444825510.txt.gz · Poslední úprava: autor: krcmar