Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Firewall pre webové servery: otvárať len potrebné porty

Webový server potrebuje smerom von spravidla len dva porty. Napriek tomu na mnohých serveroch v internete počúvajú databázy, PHP-FPM alebo správcovské rozhrania. Takto nájdete otvorené služby a zatvoríte, čo sa nepoužíva.

Stav 5 min čítaniaHardening a konfigurácia

Stručne: Firewall pre webové servery povoľuje prichádzajúce len TCP 80 a 443, pri HTTP/3 navyše UDP 443, a SSH len zo známych sietí. Všetko ostatné sa zahadzuje: databázy, cache, PHP-FPM a správcovské rozhrania nepatria do internetu. Najprv pomocou ss -tulpn zistite, čo počúva, potom zostavte súbor pravidiel so štandardom „zahodiť“ a výsledok otestujte zvonka. Obmedzenie odchádzajúcich spojení navyše zmierňuje následky vlámania.

Zabudnuté dvere vedľa vchodových

Pri PHP2Shell sa pohľad upriamil na samotný webový server, na porty 80 a 443. Tie musia byť otvorené, inak neexistuje web. Pri inventúrach po takýchto zraniteľnostiach však často upúta niečo iné: vedľa vchodových dverí stoja otvorené ďalšie dvere. Databáza počúva na všetkých sieťových rozhraniach, pool PHP-FPM na porte 9000, cache služba bez hesla, správcovské rozhranie z fázy nastavovania.

Každé z týchto dverí je samostatná útočná plocha s vlastnými zraniteľnosťami. Firewall, ktorý pripúšťa len nevyhnutné, ich zatvorí niekoľkými pravidlami. Je to jedno z najúčinnejších opatrení pri zabezpečovaní vlastného servera, ako ho opisuje aj stránka Zabezpečenie root servera a vServera vlastnými silami.

Čo patrí otvorené a čo nie?

Zásadou je zoznam povolených: všetko je zatvorené a dostupné sú len vedome uvoľnené služby. Nasledujúci prehľad pomáha pri zaradení.

Služba Typický port Dostupná zvonka?
HTTP a HTTPS TCP 80, TCP 443 áno
HTTP/3 (QUIC) UDP 443 len ak sa používa
SSH TCP 22 len zo známych sietí alebo cez VPN
Hostingový panel podľa produktu len zo známych sietí
MySQL/MariaDB, PostgreSQL TCP 3306, TCP 5432 nie
Redis, Memcached TCP 6379, TCP 11211 nie
PHP-FPM TCP 9000 alebo socket Unix nie, lepšie len socket
Poštový server TCP 25, 465, 587, 993 len ak server prijíma alebo poskytuje poštu

Služba, ktorá nemusí ísť smerom von, by navyše mala počúvať len na 127.0.0.1 alebo na sockete Unix. Potom zostane nedostupná aj pri poruche vo firewalle. Pre správcovské prístupy sa hodia povolenia podľa IP alebo VPN; podrobnosti sú v príspevku Odtienenie administrátorských oblastí podľa IP, VPN alebo dodatočnou ochranou.

Krok 1: zistiť, čo počúva

Skôr než napíšete pravidlá, urobte si prehľad. Nasledujúce príkazy len čítajú:

# Všetky počúvajúce porty TCP a UDP s procesom
sudo ss -tulpn
# Aktuálny súbor pravidiel nftables
sudo nft list ruleset
# Stav ufw, ak sa používa
sudo ufw status verbose

Vo výstupe ss si všímajte adresu pred portom. 0.0.0.0 alebo [::] znamená: služba počúva na všetkých rozhraniach. 127.0.0.1 znamená: len lokálne. Pri každej službe si zapíšte, či musí byť dostupná zvonka. Tento zoznam je zároveň súčasťou inventára vášho servera.

Firewall pre webový server s nftables

nftables je aktuálny paketový filter v Linuxe. Nasledujúci súbor pravidiel sa pridŕža príkladu v oficiálnej wiki nftables a dopĺňa povolenie SSH len zo správcovskej siete. Adresy sú dokumentačné príklady a musia sa nahradiť.

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set verwaltung_v4 {
        type ipv4_addr
        flags interval
        elements = { 203.0.113.0/28 }
    }

    chain input {
        type filter hook input priority 0; policy drop;

        ct state vmap { established : accept, related : accept, invalid : drop }
        iifname lo accept

        # IPv6 potrebuje zisťovanie susedov
        icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
        icmp type echo-request limit rate 5/second accept
        icmpv6 type echo-request limit rate 5/second accept

        # Web
        tcp dport { 80, 443 } accept
        # len pri HTTP/3:
        # udp dport 443 accept

        # SSH len zo správcovskej siete
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}

Súbor pravidiel pred načítaním skontrolujte pomocou nft -c -f /etc/nftables.conf. Prvý riadok flush ruleset maže všetky existujúce pravidlá, aj tie, ktoré zapísal Docker alebo Fail2ban. Na serveroch s Dockerom alebo inými službami, ktoré nastavujú vlastné pravidlá, súbor pravidiel preto prispôsobte, namiesto toho, aby ste ho plošne nahradili. Ako Fail2ban spolupracuje s firewallom, uvádza Nastavenie Fail2ban pre webové servery.

Kto to chce jednoduchšie, použije pod Ubuntu ufw. Dôležité je poradie: najprv povolenie SSH, potom zapnúť.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow proto tcp from 203.0.113.0/28 to any port 22
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Dôležité

Pravidlá firewallu na vzdialených serveroch meňte len s druhou cestou prístupu, napríklad konzolou vášho poskytovateľa. Nesprávne pravidlo SSH vás inak vylúči samých.

Odchádzajúce spojenia: podceňovaná polovica

Väčšina firewallov povoľuje odchádzajúce všetko. Pre webový server je to štedré. Po vlámaní útočníci využívajú odchádzajúce spojenia na dosťahovanie nástrojov, odčerpávanie údajov alebo príjem príkazov. Procesy webového servera alebo PHP, ktoré nadväzujú neočakávané spojenia, preto platia za varovný signál.

Obmedzenie odchádzajúcich spojení je náročnejšie, pretože sa musí poznať každé legitímne spojenie: zdroje balíkov pre aktualizácie, platobné služby, rozhrania, odosielanie pošty, časové servery. Pragmatickou cestou je najprv odchádzajúce spojenia zapisovať do protokolu, potom zostaviť zoznam povolených a až potom blokovať. Ako skontrolovať existujúce spojenia, opisuje Kontrola odchádzajúcich spojení servera; ktoré stopy inak naznačujú vlámanie, je pri Som už kompromitovaný?.

Na záver otestujte zvonka, z iného počítača a len proti vlastným systémom, ktoré porty sú skutočne dostupné. Až tento test ukáže, či Docker, firewall poskytovateľa a pravidlá servera spolu dávajú požadovaný obraz.

Záver: málo pravidiel, veľký účinok

Firewall webového servera nemusí byť zložitý. Webové porty otvorené, správa len zo známych sietí, všetko ostatné zahodené: s týmito základnými pravidlami zmiznú databázy, cache a zabudnuté služby z internetu. Je to jedno z opatrení s najlepším pomerom námahy a úžitku.

Proti zraniteľnostiam vo webovom serveri alebo v samotnom PHP firewall nepomáha, pretože práve tieto porty musia zostať otvorené. Jeho sila spočíva v tom, že udržiava zvyšnú útočnú plochu malú a obmedzením odchádzajúcich spojení zmierňuje následky vlámania.

Rozhodujúca je starostlivosť. Každá nová služba, každý kontajner a každá zmena u poskytovateľa môže obraz posunúť. Kontrolu zvonka preto opakujte po každej väčšej zmene a v pevných intervaloch, napríklad raz za štvrťrok.

Ako konkrétne pomáha PHP SOS?

  • Zachytiť stav: zistíme všetky počúvajúce služby a zvonka overíme, čo je skutočne dostupné.
  • Zostaviť súbor pravidiel: vytvoríme zoznam povolených pre prichádzajúce a, kde je to zmysluplné, aj odchádzajúce spojenia, zosúladený s Dockerom, Fail2ban a firewallom poskytovateľa.
  • Bezpečne prestaviť: zmeny zavádzame s druhou cestou prístupu a plánom návratu.
  • Zdokumentovať: porty, povolenia a dôvody zaznamenáme v rámci sprísnenia servera.

Časté otázky

Aké porty potrebuje webový server?

Pre návštevníkov spravidla len TCP 80 a 443, pri HTTP/3 navyše UDP 443. SSH a správcovské rozhrania by mali byť dostupné len zo známych sietí alebo cez VPN. Porty databáz, cache a PHP-FPM nepatria do internetu.

Chráni firewall pred PHP2Shell?

Nie. PHP2Shell sa zneužíva cez webový server, teda cez práve tie porty, ktoré musia byť otvorené. Firewall však zmenšuje zvyšnú útočnú plochu a obmedzenie odchádzajúcich spojení môže zmierniť následky vlámania.

Prečo ufw ukazuje porty ako zatvorené, hoci sú dostupné?

Známym prípadom sú kontajnery Docker: Docker zapisuje zverejnené porty priamo do pravidiel paketového filtra, mimo ufw. Otvorené porty preto vždy dodatočne overte zvonka.

Stačí firewall môjho poskytovateľa hostingu?

Predradený firewall poskytovateľa je dobrá druhá vrstva. Firewall na serveri však nenahrádza, pretože pri chybe v konfigurácii poskytovateľa alebo pri interných spojeniach nezaberá. Najlepšie je používať oba s rovnakými základnými pravidlami.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc