Uživatelské nástroje

Nástroje pro tento web


navody:server:firewall

Firewall

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é 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íčů.

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.

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 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 a blokující politiky zapne až nakonec:

#!/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é 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,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 -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: 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 iptables(8) a 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:

#!/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;
  }
}

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:

#!/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
 
# 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í nft -c -f /etc/nftables.conf a načti ho příkazem systemctl reload nftables. Podrobnosti najdeš na wiki Debianu a v manuálu nft(8).

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 /etc/default/ufw obsahuje IPV6=yes:

#!/usr/bin/env bash
set -eu
 
apt update
apt install -y ufw
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

Výsledek: UFW na IPv4 i IPv6 povolí navázaná spojení a nová TCP spojení 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 IPV6=yes selže, UFW se nezapne a nejprve musíš nastavení opravit. Pravidlo smažeš například příkazem ufw delete allow 80/tcp. Číslovaný seznam zobrazí ufw status numbered. Podrobnosti najdeš v dokumentaci firewallu pro Ubuntu.

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 public, trvale v ní povolí SSH a web a pak trvalou konfiguraci načte:

#!/usr/bin/env 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: 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.

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 dokumentace firewalld.

NixOS

NixOS má networking.firewall.enable ve výchozím nastavení zapnuté. Otevřené porty popiš deklarativně. Následující modul můžeš uložit jako /etc/nixos/firewall.nix a přidat ./firewall.nix do existujícího seznamu imports v /etc/nixos/configuration.nix:

{ ... }:
{
  networking.firewall = {
    enable = true;
    allowedTCPPorts = [ 22 80 443 ];
  };
}

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.

Některé služby mají vlastní volbu openFirewall, která potřebné porty otevře automaticky. Před změnou si ověř, co daný modul nastavuje. První aktivaci proveď pomocí nixos-rebuild test:

#!/usr/bin/env bash
set -eu
 
nixos-rebuild test

Ověř nové SSH spojení. Teprve když funguje, ulož konfiguraci do nové bootovací generace:

#!/usr/bin/env bash
set -eu
 
nixos-rebuild switch

Viz firewall v manuálu NixOS.

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 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.

Podrobnosti a možnosti filtrování popisuje dokumentace firewallu Docker Engine.

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.

Když už žádné SSH spojení nemáš, návod ke vzdálené konzoli ve vpsAdminu tě provede obnovením přístupu. 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.

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 iptables nejdřív nastav politiku INPUT pro IPv4 i IPv6 na ACCEPT a teprve potom pravidla opravuj.

V prostředí Run shell neběží systemd ani správce firewallu. Obnov v něm trvalou konfiguraci, například /etc/iptables/rules.v4 a /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.

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ě.

navody/server/firewall.txt · Poslední úprava: autor: aither