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íčů.
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:
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.
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).
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 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 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 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
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.
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ě.