# Firewall pre webové servery: otvárať len potrebné porty

> Firewall pre webový server: skontrolujte otvorené porty, uvoľnite len 80 a 443, obmedzte SSH, zúžte odchádzajúce spojenia. S nftables a ufw.

Zdroj: https://phpsos.de/sk/blog/firewall-fuer-webserver/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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](https://phpsos.de/sk/server/root-server-vserver/).

## Č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](https://phpsos.de/sk/blog/admin-bereiche-abschirmen/).

## Krok 1: zistiť, čo počúva

Skôr než napíšete pravidlá, urobte si prehľad. Nasledujúce príkazy len čítajú:

```bash
# 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ť.

```nft
#!/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](https://phpsos.de/sk/blog/fail2ban-fuer-webserver/).

Kto to chce jednoduchšie, použije pod Ubuntu `ufw`. Dôležité je poradie: najprv povolenie SSH, potom zapnúť.

```bash
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](https://phpsos.de/sk/blog/ausgehende-verbindungen-pruefen/); ktoré stopy inak naznačujú vlámanie, je pri [Som už kompromitovaný?](https://phpsos.de/sk/php2shell/bin-ich-gehackt-anzeichen/).

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](https://phpsos.de/sk/leistungen/server-haertung/).


## Č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

- [Wiki nftables: jednoduchý súbor pravidiel pre server](https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server)
- [Ubuntu Server: firewall (ufw)](https://ubuntu.com/server/docs/how-to/security/firewalls/)
- [BSI IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
- [CIS Benchmarks](https://www.cisecurity.org/cis-benchmarks)
