# Vatrozid za web-poslužitelje: otvoriti samo nužne portove

> Vatrozid za web-poslužitelje: provjerite otvorene portove, odobrite samo 80 i 443, ograničite SSH i suzite odlazne veze. S nftables i ufw.

Izvor: https://phpsos.de/hr/blog/firewall-fuer-webserver/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**Ukratko:** Vatrozid za web-poslužitelje dopušta dolazno samo TCP 80 i 443, kod HTTP/3 dodatno UDP 443, i SSH samo iz poznatih mreža. Sve ostalo se odbacuje: baze podataka, predmemorije, PHP-FPM i administratorska sučelja ne pripadaju na internet. Najprije pomoću `ss -tulpn` provjerite što sluša, zatim izgradite skup pravila sa zadanim „odbaciti“ i testirajte rezultat izvana. Ograničavanje odlaznih veza dodatno ograničava posljedice provale.

## Zaboravljena vrata pokraj ulaznih

Kod PHP2Shella pogled je bio usmjeren na sam web-poslužitelj, na portove 80 i 443. Oni moraju biti otvoreni, inače nema web-stranice. Kod inventura nakon takvih ranjivosti često se ipak primijeti nešto drugo: pokraj ulaznih vrata stoje otvorena i druga vrata. Baza podataka sluša na svim mrežnim sučeljima, PHP-FPM pool na portu 9000, usluga predmemorije bez lozinke, administratorsko sučelje iz faze postavljanja.

Svaka od tih vrata zasebna je napadna površina s vlastitim ranjivostima. Vatrozid koji dopušta samo nužno zatvara ih s nekoliko pravila. To je jedna od najdjelotvornijih mjera pri osiguravanju vlastitog poslužitelja, kako opisuje i stranica [Samostalno osigurati root poslužitelj i vServer](https://phpsos.de/hr/server/root-server-vserver/).

## Što pripada otvoreno, a što ne?

Načelo je popis dopuštenog: sve je zatvoreno, a dostupne su samo svjesno odobrene usluge. Sljedeći pregled pomaže pri svrstavanju.

| Usluga | Tipičan port | Dostupno izvana? |
|---|---|---|
| HTTP i HTTPS | TCP 80, TCP 443 | da |
| HTTP/3 (QUIC) | UDP 443 | samo ako se koristi |
| SSH | TCP 22 | samo iz poznatih mreža ili putem VPN-a |
| Hosting panel | ovisno o proizvodu | samo iz poznatih mreža |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | ne |
| Redis, Memcached | TCP 6379, TCP 11211 | ne |
| PHP-FPM | TCP 9000 ili Unix socket | ne, bolje samo socket |
| Poslužitelj e-pošte | TCP 25, 465, 587, 993 | samo ako poslužitelj prima ili pruža e-poštu |

Usluga koja ne mora prema van trebala bi uz to slušati samo na `127.0.0.1` ili Unix socketu. Tada ostaje nedostupna čak i pri kvaru vatrozida. Za administratorske pristupe prikladne su IP dozvole ili VPN; pojedinosti su u članku [Zaštititi administratorska područja IP-om, VPN-om ili dodatnom zaštitom](https://phpsos.de/hr/blog/admin-bereiche-abschirmen/).

## Korak 1: utvrditi što sluša

Prije nego napišete pravila, steknite pregled. Sljedeće naredbe samo čitaju:

```bash
# Svi portovi TCP i UDP koji slušaju, s procesom
sudo ss -tulpn
# Trenutačni skup pravila nftablesa
sudo nft list ruleset
# Status ufw-a, ako se koristi
sudo ufw status verbose
```

U ispisu naredbe `ss` pazite na adresu ispred porta. `0.0.0.0` ili `[::]` znači: usluga sluša na svim sučeljima. `127.0.0.1` znači: samo lokalno. Za svaku uslugu zabilježite mora li biti dostupna izvana. Taj je popis ujedno dio Vašeg inventara poslužitelja.

## Vatrozid za web-poslužitelje s nftables

nftables je aktualni filtar paketa pod Linuxom. Sljedeći skup pravila oslanja se na primjer u službenom nftables wikiju i dodaje odobrenje za SSH samo iz administrativne mreže. Adrese su primjeri iz dokumentacije i moraju se zamijeniti.

```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 treba otkrivanje susjeda
        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-stranica
        tcp dport { 80, 443 } accept
        # samo kod HTTP/3:
        # udp dport 443 accept

        # SSH samo iz administrativne mreže
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}
```

Skup pravila prije učitavanja provjerite naredbom `nft -c -f /etc/nftables.conf`. Prvi redak `flush ruleset` briše sva postojeća pravila, i ona koja su upisali Docker ili Fail2ban. Na poslužiteljima s Dockerom ili drugim uslugama koje postavljaju vlastita pravila skup pravila stoga prilagodite umjesto da ga paušalno zamijenite. Kako Fail2ban surađuje s vatrozidom, piše u članku [Postaviti Fail2ban za web-poslužitelje](https://phpsos.de/hr/blog/fail2ban-fuer-webserver/).

Tko želi jednostavnije, pod Ubuntuom koristi `ufw`. Važan je redoslijed: najprije odobrenje za SSH, zatim uključivanje.

```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
```

> **Važno:**
> Pravila vatrozida na udaljenim poslužiteljima mijenjajte samo uz drugi pristupni put, primjerice konzolu Vašeg pružatelja. Pogrešno SSH pravilo inače zaključava Vas same.

## Odlazne veze: podcijenjena polovica

Većina vatrozida odlazno dopušta sve. Za web-poslužitelj to je velikodušno. Nakon provale napadači koriste odlazne veze za učitavanje alata, izvlačenje podataka ili primanje naredbi. Procesi web-poslužitelja ili PHP-a koji uspostavljaju neočekivane veze stoga se smatraju znakom upozorenja.

Ograničavanje odlaznih veza zahtjevnije je jer svaka legitimna veza mora biti poznata: izvori paketa za ažuriranja, usluge plaćanja, sučelja, slanje e-pošte, vremenski poslužitelji. Pragmatičan je put najprije zapisivati odlazne veze, zatim sastaviti popis dopuštenog i tek nakon toga blokirati. Kako provjeriti postojeće veze, opisuje članak [Provjeriti odlazne veze poslužitelja](https://phpsos.de/hr/blog/ausgehende-verbindungen-pruefen/); koji drugi tragovi upućuju na provalu, piše na stranici [Jesam li već kompromitiran?](https://phpsos.de/hr/php2shell/bin-ich-gehackt-anzeichen/).

Za kraj testirajte izvana, s drugog računala i samo prema vlastitim sustavima, koji su portovi doista dostupni. Tek taj test pokazuje daju li Docker, vatrozid pružatelja i pravila poslužitelja zajedno željenu sliku.

## Zaključak: malo pravila, velik učinak

Vatrozid web-poslužitelja ne mora biti složen. Web portovi otvoreni, administracija samo iz poznatih mreža, sve ostalo odbačeno: s tim osnovnim pravilima baze podataka, predmemorije i zaboravljene usluge nestaju s interneta. To je jedna od mjera s najboljim omjerom truda i koristi.

Protiv ranjivosti u web-poslužitelju ili u samom PHP-u vatrozid ne pomaže jer upravo ti portovi moraju ostati otvoreni. Njegova je snaga u tome da ostatak napadne površine drži malim i da ograničenjem odlaznih veza ublaži posljedice provale.

Odlučujuća je njega. Svaka nova usluga, svaki kontejner i svaka izmjena kod pružatelja može pomaknuti sliku. Provjeru izvana stoga ponavljajte nakon svake veće izmjene i u fiksnim razmacima, primjerice jednom kvartalno.

## Kako PHP SOS konkretno pomaže?

- **Zabilježiti stanje:** bilježimo sve usluge koje slušaju i izvana provjeravamo što je doista dostupno.
- **Izgraditi skup pravila:** izrađujemo popis dopuštenog za dolazne i, gdje je smisleno, odlazne veze, usklađen s Dockerom, Fail2banom i vatrozidom pružatelja.
- **Sigurno prijeći:** izmjene provodimo uz drugi pristupni put i plan povratka.
- **Dokumentirati:** portove, odobrenja i razloge bilježimo u sklopu [ojačavanja poslužitelja](https://phpsos.de/hr/leistungen/server-haertung/).


## Česta pitanja

**Koji portovi trebaju web-poslužitelju?**  
Za posjetitelje u pravilu samo TCP 80 i 443, kod HTTP/3 dodatno UDP 443. SSH i administratorska sučelja trebala bi biti dostupna samo iz poznatih mreža ili putem VPN-a. Portovi baze podataka, predmemorije i PHP-FPM-a ne pripadaju na internet.

**Štiti li vatrozid od PHP2Shella?**  
Ne. PHP2Shell se iskorištava preko web-poslužitelja, dakle preko upravo onih portova koji moraju biti otvoreni. Vatrozid ipak smanjuje ostatak napadne površine, a ograničenje odlaznih veza može ublažiti posljedice provale.

**Zašto ufw prikazuje portove kao zatvorene, a oni su ipak dostupni?**  
Poznat slučaj su Docker kontejneri: Docker objavljene portove upisuje izravno u pravila filtriranja paketa, mimo ufw-a. Otvorene portove stoga uvijek dodatno provjerite izvana.

**Je li dovoljan vatrozid mog hosting pružatelja?**  
Vatrozid pružatelja ispred poslužitelja dobar je drugi sloj. Ipak ne zamjenjuje vatrozid na poslužitelju jer ne djeluje pri pogrešci u konfiguraciji pružatelja ili kod internih veza. Najbolje je koristiti oba s istim osnovnim pravilima.

## Izvori

- [nftables wiki: jednostavan skup pravila za poslužitelj](https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server)
- [Ubuntu Server: vatrozid (ufw)](https://ubuntu.com/server/docs/how-to/security/firewalls/)
- [BSI (njemački Savezni ured za informacijsku sigurnost) 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)
