# Ugniasienė žiniatinklio serveriui: atverti tik reikalingus prievadus

> Ugniasienė žiniatinklio serveriui: patikrinkite atvirus prievadus, atverkite tik 80 ir 443, apribokite SSH ir išeinančius ryšius. Su nftables ir ufw.

Šaltinis: https://phpsos.de/lt/blog/firewall-fuer-webserver/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** žiniatinklio serverio ugniasienė įeinantiems ryšiams leidžia tik TCP 80 ir 443, su HTTP/3 papildomai UDP 443, o SSH tik iš žinomų tinklų. Viskas kita atmetama: duomenų bazės, talpyklos, PHP-FPM ir valdymo sąsajos internete neturi būti. Pirmiausia su `ss -tulpn` patikrinkite, kas klausosi, tada sudarykite taisyklių rinkinį su numatytuoju „atmesti“ ir rezultatą išbandykite iš išorės. Išeinančių ryšių apribojimas papildomai riboja įsilaužimo pasekmes.

## Pamirštos durys šalia pagrindinių

Dėl PHP2Shell žvilgsnis nukrypo į patį žiniatinklio serverį, į prievadus 80 ir 443. Jie turi būti atviri, kitaip nebus svetainės. Tačiau po tokių spragų atliekant inventorizaciją dažnai krinta į akis kas kita: šalia pagrindinių durų atviros dar kitos durys. Duomenų bazė klausosi visose tinklo sąsajose, PHP-FPM baseinas prievade 9000, talpyklos paslauga be slaptažodžio, valdymo sąsaja iš įrengimo fazės.

Kiekvienos tokios durys yra atskiras atakos paviršius su savomis spragomis. Ugniasienė, leidžianti tik būtiną, jas uždaro keliomis taisyklėmis. Tai viena veiksmingiausių priemonių saugant savo serverį, kaip aprašo ir puslapis [Root serverio ir vServer apsauga savo jėgomis](https://phpsos.de/lt/server/root-server-vserver/).

## Kas turi būti atviras, o kas ne?

Principas yra leidžiamųjų sąrašas: viskas uždaryta, ir pasiekiamos tik sąmoningai atvertos paslaugos. Toliau pateikta apžvalga padeda suskirstyti.

| Paslauga | Tipinis prievadas | Ar pasiekiama iš išorės? |
|---|---|---|
| HTTP ir HTTPS | TCP 80, TCP 443 | taip |
| HTTP/3 (QUIC) | UDP 443 | tik jei naudojama |
| SSH | TCP 22 | tik iš žinomų tinklų arba per VPN |
| Hostingo valdymo skydelis | pagal produktą | tik iš žinomų tinklų |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | ne |
| Redis, Memcached | TCP 6379, TCP 11211 | ne |
| PHP-FPM | TCP 9000 arba Unix lizdas | ne, geriau tik lizdas |
| Pašto serveris | TCP 25, 465, 587, 993 | tik jei serveris gauna ar teikia laiškus |

Paslauga, kuriai nereikia būti pasiekiamai iš išorės, papildomai turėtų klausytis tik `127.0.0.1` arba Unix lizdo. Tada ji lieka nepasiekiama net ugniasienei sugedus. Valdymo prieigoms tinka IP leidimai arba VPN; detales rasite straipsnyje [Administravimo sričių apsauga per IP, VPN ar papildomą apsaugą](https://phpsos.de/lt/blog/admin-bereiche-abschirmen/).

## 1 žingsnis: nustatyti, kas klausosi

Prieš rašydami taisykles, susidarykite vaizdą. Šios komandos tik skaito:

```bash
# Visi klausomi TCP ir UDP prievadai su procesu
sudo ss -tulpn
# Dabartinis nftables taisyklių rinkinys
sudo nft list ruleset
# ufw būsena, jei naudojamas
sudo ufw status verbose
```

Išvestyje `ss` atkreipkite dėmesį į adresą prieš prievadą. `0.0.0.0` arba `[::]` reiškia: paslauga klausosi visose sąsajose. `127.0.0.1` reiškia: tik lokaliai. Kiekvienai paslaugai užsirašykite, ar ji turi būti pasiekiama iš išorės. Šis sąrašas kartu yra jūsų serverio inventoriaus dalis.

## Ugniasienė žiniatinklio serveriui su nftables

nftables yra dabartinis Linux paketų filtras. Toliau pateiktas taisyklių rinkinys remiasi oficialaus nftables wiki pavyzdžiu ir papildo SSH leidimu tik iš valdymo tinklo. Adresai yra dokumentacijos pavyzdžiai ir turi būti pakeisti.

```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 reikia kaimynų aptikimo
        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

        # Svetainė
        tcp dport { 80, 443 } accept
        # tik esant HTTP/3:
        # udp dport 443 accept

        # SSH tik iš valdymo tinklo
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}
```

Taisyklių rinkinį prieš įkeldami patikrinkite su `nft -c -f /etc/nftables.conf`. Pirmoji eilutė `flush ruleset` ištrina visas esamas taisykles, taip pat tas, kurias įrašė Docker ar Fail2ban. Todėl serveriuose su Docker ar kitomis paslaugomis, kurios nustato savas taisykles, taisyklių rinkinį pritaikykite, užuot jį pakeitę visiškai. Kaip Fail2ban sąveikauja su ugniasiene, aprašyta skyriuje [Fail2ban žiniatinklio serveriams: diegimas](https://phpsos.de/lt/blog/fail2ban-fuer-webserver/).

Kas mėgsta paprasčiau, Ubuntu naudoja `ufw`. Svarbi eilės tvarka: pirmiausia SSH leidimas, tada įjungimas.

```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
```

> **Svarbu:**
> Ugniasienės taisykles nuotoliniuose serveriuose keiskite tik turėdami antrą prieigos kelią, pavyzdžiui, teikėjo konsolę. Neteisinga SSH taisyklė kitaip jus pačius užblokuoja.

## Išeinantys ryšiai: nepakankamai įvertinta pusė

Dauguma ugniasienių leidžia viską išeinančiais ryšiais. Žiniatinklio serveriui tai dosnu. Po įsilaužimo užpuolikai išeinančius ryšius naudoja įrankiams atsisiųsti, duomenims ištraukti ar komandoms gauti. Žiniatinklio serverio ar PHP procesai, kurie užmezga netikėtus ryšius, todėl laikomi įspėjamuoju ženklu.

Išeinančių ryšių apribojimas sudėtingesnis, nes turi būti žinomas kiekvienas teisėtas ryšys: paketų šaltiniai atnaujinimams, mokėjimo paslaugos, sąsajos, laiškų siuntimas, laiko serveriai. Pragmatiškas kelias yra pirmiausia registruoti išeinančius ryšius, tada sudaryti leidžiamųjų sąrašą ir tik po to blokuoti. Kaip patikrinti esamus ryšius, aprašo [Serverio išeinančių ryšių patikra](https://phpsos.de/lt/blog/ausgehende-verbindungen-pruefen/); kokie kiti pėdsakai rodo įsilaužimą, rasite skyriuje [Ar jau esu pažeistas?](https://phpsos.de/lt/php2shell/bin-ich-gehackt-anzeichen/).

Galiausiai iš išorės, iš kito kompiuterio ir tik prieš savo sistemas išbandykite, kurie prievadai iš tikrųjų pasiekiami. Tik šis bandymas parodo, ar Docker, teikėjo ugniasienė ir serverio taisyklės kartu duoda norimą vaizdą.

## Išvada: kelios taisyklės, didelis poveikis

Žiniatinklio serverio ugniasienė neturi būti sudėtinga. Žiniatinklio prievadai atviri, valdymas tik iš žinomų tinklų, viskas kita atmesta: su šiomis pagrindinėmis taisyklėmis iš interneto išnyksta duomenų bazės, talpyklos ir pamirštos paslaugos. Tai viena iš priemonių su geriausiu darbo ir naudos santykiu.

Nuo spragų žiniatinklio serveryje ar pačiame PHP ugniasienė nepadeda, nes būtent šie prievadai turi likti atviri. Jos stiprybė yra likusį atakos paviršių išlaikyti mažą ir išeinančių ryšių apribojimu sušvelninti įsilaužimo pasekmes.

Lemia priežiūra. Kiekviena nauja paslauga, kiekvienas konteineris ir kiekvienas pakeitimas teikėjo pusėje gali pakeisti vaizdą. Todėl patikrą iš išorės kartokite po kiekvieno didesnio pakeitimo ir nustatytais intervalais, pavyzdžiui, kartą per ketvirtį.

## Kaip PHP SOS padeda konkrečiai?

- **Aprėpti esamą būklę:** surenkame visas klausomas paslaugas ir iš išorės patikriname, kas iš tikrųjų pasiekiama.
- **Sukurti taisyklių rinkinį:** sudarome leidžiamųjų sąrašą įeinantiems ir, kur prasminga, išeinantiems ryšiams, suderintą su Docker, Fail2ban ir teikėjo ugniasiene.
- **Saugiai perjungti:** pakeitimus įgyvendiname su antru prieigos keliu ir atsarginiu planu.
- **Dokumentuoti:** prievadus, leidimus ir priežastis užfiksuojame [serverio sutvirtinimo](https://phpsos.de/lt/leistungen/server-haertung/) rėmuose.


## Dažni klausimai

**Kokių prievadų reikia žiniatinklio serveriui?**  
Lankytojams paprastai tik TCP 80 ir 443, su HTTP/3 papildomai UDP 443. SSH ir valdymo sąsajos turėtų būti pasiekiamos tik iš žinomų tinklų arba per VPN. Duomenų bazių, talpyklų ir PHP-FPM prievadai internete neturi būti.

**Ar ugniasienė apsaugo nuo PHP2Shell?**  
Ne. PHP2Shell išnaudojamas per žiniatinklio serverį, taigi per tuos pačius prievadus, kurie turi būti atviri. Tačiau ugniasienė sumažina likusį atakos paviršių, o išeinančių ryšių apribojimas gali sušvelninti įsilaužimo pasekmes.

**Kodėl ufw rodo prievadus kaip uždarytus, nors jie vis tiek pasiekiami?**  
Žinomas atvejis yra Docker konteineriai: Docker paskelbtus prievadus įrašo tiesiai į paketų filtravimo taisykles, aplenkdamas ufw. Todėl atvirus prievadus visada papildomai tikrinkite iš išorės.

**Ar pakanka mano hostingo teikėjo ugniasienės?**  
Teikėjo prieš tai esanti ugniasienė yra geras antras sluoksnis. Tačiau ji nepakeičia ugniasienės serveryje, nes neveikia esant klaidai teikėjo konfigūracijoje ar vidiniams ryšiams. Geriausia naudoti abi su tomis pačiomis pagrindinėmis taisyklėmis.

## Šaltiniai

- [nftables wiki: paprastas taisyklių rinkinys serveriui](https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server)
- [Ubuntu Server: ugniasienė (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)
