# Palomuuri verkkopalvelimelle: avatkaa vain tarvittavat portit

> Verkkopalvelimen palomuuri: tarkistakaa avoimet portit, sallikaa vain 80 ja 443, rajatkaa SSH ja rajoittakaa lähtevät yhteydet. nftablesilla ja ufw:lla.

Lähde: https://phpsos.de/fi/blog/firewall-fuer-webserver/  
Tilanne: 25.10.2026  
Palveluntarjoaja: PHP SOS, PHP-hätäapu ja palvelimen tietoturva. Pikaapu WhatsAppilla: https://wa.me/491736494914?text=Hei%20PHP%20SOS%2C%20tarvitsemme%20apua%20PHP-palvelimemme%20kanssa.%20Yritys%3A%20%E2%80%A6%20Verkkosivusto%3A%20%E2%80%A6

**Lyhyesti:** Verkkopalvelimen palomuuri päästää sisään vain TCP 80 ja 443, HTTP/3:n kanssa lisäksi UDP 443, ja SSH:n vain tunnetuista verkoista. Kaikki muu hylätään: tietokantojen, välimuistien, PHP-FPM:n ja hallintakäyttöliittymien paikka ei ole internetissä. Tarkistakaa ensin komennolla `ss -tulpn`, mikä kuuntelee, rakentakaa sitten sääntöjoukko oletuksella ”hylkää” ja testatkaa tulos ulkopuolelta. Lähtevien yhteyksien rajaaminen rajaa lisäksi murron seurauksia.

## Unohdetut ovet etuoven vieressä

PHP2Shellin kohdalla katse kohdistui itse verkkopalvelimeen, portteihin 80 ja 443. Niiden täytyy olla auki, muuten ei ole verkkosivustoa. Tällaisten aukkojen jälkeisissä inventaarioissa huomataan kuitenkin usein jotain muuta: etuoven vieressä on muitakin ovia auki. Tietokanta kuuntelee kaikilla verkkoliitännöillä, PHP-FPM-pooli portissa 9000, välimuistipalvelu ilman salasanaa, hallintakäyttöliittymä käyttöönottovaiheesta.

Jokainen näistä ovista on oma hyökkäyspintansa omine aukkoineen. Palomuuri, joka sallii vain tarpeellisen, sulkee ne muutamalla säännöllä. Se on yksi tehokkaimmista toimenpiteistä oman palvelimen suojaamisessa, kuten myös sivu [Root-palvelimen ja vServerin suojaaminen itse](https://phpsos.de/fi/server/root-server-vserver/) kuvaa.

## Mikä kuuluu olla auki, mikä ei?

Periaate on sallittujen lista: kaikki on kiinni, ja vain tietoisesti sallitut palvelut ovat saavutettavissa. Seuraava yleiskatsaus auttaa luokittelussa.

| Palvelu | Tyypillinen portti | Saavutettavissa ulkopuolelta? |
|---|---|---|
| HTTP ja HTTPS | TCP 80, TCP 443 | kyllä |
| HTTP/3 (QUIC) | UDP 443 | vain jos käytössä |
| SSH | TCP 22 | vain tunnetuista verkoista tai VPN:llä |
| Hosting-paneeli | tuotteen mukaan | vain tunnetuista verkoista |
| MySQL/MariaDB, PostgreSQL | TCP 3306, TCP 5432 | ei |
| Redis, Memcached | TCP 6379, TCP 11211 | ei |
| PHP-FPM | TCP 9000 tai Unix-socket | ei, mieluummin vain socket |
| Postipalvelin | TCP 25, 465, 587, 993 | vain jos palvelin vastaanottaa tai tarjoaa sähköpostia |

Palvelun, jonka ei tarvitse olla ulkopuolelta tavoitettavissa, pitäisi lisäksi kuunnella vain osoitteessa `127.0.0.1` tai Unix-socketissa. Silloin se pysyy tavoittamattomana myös palomuurin vikatilanteessa. Hallintayhteyksiin sopivat IP-sallinnat tai VPN; yksityiskohdat ovat kirjoituksessa [Ylläpitoalueiden suojaus IP:llä, VPN:llä tai lisäsuojalla](https://phpsos.de/fi/blog/admin-bereiche-abschirmen/).

## Vaihe 1: selvittäkää, mikä kuuntelee

Ennen kuin kirjoitatte sääntöjä, hankkikaa yleiskuva. Seuraavat komennot vain lukevat:

```bash
# Kaikki kuuntelevat TCP- ja UDP-portit prosesseineen
sudo ss -tulpn
# nftablesin nykyinen sääntöjoukko
sudo nft list ruleset
# ufw:n tila, jos käytössä
sudo ufw status verbose
```

Kiinnittäkää `ss`-tulosteessa huomiota portin edellä olevaan osoitteeseen. `0.0.0.0` tai `[::]` tarkoittaa: palvelu kuuntelee kaikilla liitännöillä. `127.0.0.1` tarkoittaa: vain paikallisesti. Kirjatkaa jokaisesta palvelusta, onko sen oltava tavoitettavissa ulkopuolelta. Tämä lista on samalla osa palvelinluetteloanne.

## Verkkopalvelimen palomuuri nftablesilla

nftables on Linuxin nykyinen pakettisuodatin. Seuraava sääntöjoukko noudattaa virallisen nftables-wikin esimerkkiä ja lisää SSH:n sallinnan vain hallintaverkosta. Osoitteet ovat dokumentaatioesimerkkejä ja ne on korvattava.

```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 tarvitsee naapurintunnistuksen
        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

        # Verkkosivusto
        tcp dport { 80, 443 } accept
        # vain HTTP/3:n kanssa:
        # udp dport 443 accept

        # SSH vain hallintaverkosta
        ip saddr @verwaltung_v4 tcp dport 22 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}
```

Tarkistakaa sääntöjoukko ennen lataamista komennolla `nft -c -f /etc/nftables.conf`. Ensimmäinen rivi `flush ruleset` poistaa kaikki olemassa olevat säännöt, myös ne, jotka Docker tai Fail2ban on kirjannut. Palvelimilla, joilla on Docker tai muita omia sääntöjä asettavia palveluja, mukauttakaa sääntöjoukkoa siksi sen sijaan, että korvaisitte sen kokonaan. Miten Fail2ban toimii yhdessä palomuurin kanssa, kerrotaan kohdassa [Fail2banin käyttöönotto verkkopalvelimille](https://phpsos.de/fi/blog/fail2ban-fuer-webserver/).

Joka haluaa yksinkertaisemman tavan, käyttää Ubuntulla `ufw`-työkalua. Tärkeää on järjestys: ensin SSH-sallinta, sitten käyttöönotto.

```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
```

> **Tärkeää:**
> Muuttakaa palomuurisääntöjä etäpalvelimilla vain toisen pääsytien kanssa, esimerkiksi palveluntarjoajanne konsolin. Väärä SSH-sääntö sulkee muuten teidät itsenne ulos.

## Lähtevät yhteydet: aliarvostettu puolikas

Useimmat palomuurit sallivat lähtevästi kaiken. Verkkopalvelimelle se on antelias. Murron jälkeen hyökkääjät käyttävät lähteviä yhteyksiä työkalujen lataamiseen, tietojen siirtämiseen tai komentojen vastaanottamiseen. Verkkopalvelimen tai PHP:n prosessit, jotka muodostavat odottamattomia yhteyksiä, ovat siksi varoitusmerkki.

Lähtevien yhteyksien rajaus on työläämpää, koska jokaisen oikeutetun yhteyden on oltava tiedossa: pakettilähteet päivityksille, maksupalvelut, rajapinnat, sähköpostin lähetys, aikapalvelimet. Käytännöllinen tapa on kirjata lähtevät yhteydet ensin lokiin, muodostaa sitten sallittujen lista ja estää vasta sen jälkeen. Miten nykyiset yhteydet tarkistetaan, kuvaa [Palvelimen lähtevien yhteyksien tarkistus](https://phpsos.de/fi/blog/ausgehende-verbindungen-pruefen/); mitkä muut jäljet viittaavat murtoon, kerrotaan kohdassa [Olenko jo vaarantunut?](https://phpsos.de/fi/php2shell/bin-ich-gehackt-anzeichen/).

Lopuksi testaatte ulkopuolelta, toiselta koneelta ja vain omia järjestelmiänne vastaan, mitkä portit ovat todella tavoitettavissa. Vasta tämä testi näyttää, tuottavatko Docker, palveluntarjoajan palomuuri ja palvelimen säännöt yhdessä halutun kuvan.

## Yhteenveto: vähän sääntöjä, suuri vaikutus

Verkkopalvelimen palomuurin ei tarvitse olla monimutkainen. Verkkoportit auki, hallinta vain tunnetuista verkoista, kaikki muu hylätty: näillä perussäännöillä tietokannat, välimuistit ja unohdetut palvelut katoavat internetistä. Se on yksi toimenpiteistä, joilla on paras vaivan ja hyödyn suhde.

Verkkopalvelimen tai itse PHP:n aukkoja vastaan palomuuri ei auta, sillä juuri nämä portit on pidettävä auki. Sen vahvuus on muun hyökkäyspinnan pitämisessä pienenä ja lähtevien yhteyksien rajauksella murron seurausten hillitsemisessä.

Ratkaisevaa on ylläpito. Jokainen uusi palvelu, jokainen kontti ja jokainen muutos palveluntarjoajalla voi siirtää kuvaa. Toistakaa tarkistus ulkopuolelta siksi jokaisen suuremman muutoksen jälkeen ja kiinteinä väleinä, esimerkiksi kerran neljännesvuodessa.

## Miten PHP SOS auttaa konkreettisesti?

- **Nykytilan kartoitus:** Kartoitamme kaikki kuuntelevat palvelut ja tarkistamme ulkopuolelta, mikä on todella tavoitettavissa.
- **Sääntöjoukon rakentaminen:** Laadimme sallittujen listan sisääntuleville ja tarpeen mukaan lähteville yhteyksille, sovitettuna Dockeriin, Fail2baniin ja palveluntarjoajan palomuuriin.
- **Turvallinen siirtymä:** Toteutamme muutokset toisen pääsytien ja varasuunnitelman kanssa.
- **Dokumentointi:** Kirjaamme portit, sallinnat ja perustelut [palvelimen koventamisen](https://phpsos.de/fi/leistungen/server-haertung/) yhteydessä.


## Usein kysytyt kysymykset

**Mitä portteja verkkopalvelin tarvitsee?**  
Kävijöille yleensä vain TCP 80 ja 443, HTTP/3:n kanssa lisäksi UDP 443. SSH:n ja hallintakäyttöliittymien pitäisi olla saavutettavissa vain tunnetuista verkoista tai VPN:n kautta. Tietokanta-, välimuisti- ja PHP-FPM-porttien paikka ei ole internetissä.

**Suojaako palomuuri PHP2Shelliltä?**  
Ei. PHP2Shelliä hyödynnetään verkkopalvelimen kautta, siis juuri niiden porttien kautta, joiden on oltava auki. Palomuuri kuitenkin pienentää muuta hyökkäyspintaa, ja lähtevien yhteyksien rajaus voi hillitä murron seurauksia.

**Miksi ufw näyttää portteja suljetuiksi, vaikka ne ovat silti saavutettavissa?**  
Tunnettu tapaus ovat Docker-kontit: Docker kirjaa julkaistut portit suoraan pakettisuodatussääntöihin, ufw:n ohi. Tarkistakaa avoimet portit siksi aina lisäksi ulkopuolelta.

**Riittääkö hosting-palveluntarjoajani palomuuri?**  
Palveluntarjoajan edessä oleva palomuuri on hyvä toinen kerros. Se ei kuitenkaan korvaa palvelimen omaa palomuuria, koska se ei toimi palveluntarjoajan asetusvirheessä tai sisäisissä yhteyksissä. Parasta on käyttää molempia samoilla perussäännöillä.

## Lähteet

- [nftables-wiki: yksinkertainen sääntöjoukko palvelimelle](https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server)
- [Ubuntu Server: palomuuri (ufw)](https://ubuntu.com/server/docs/how-to/security/firewalls/)
- [BSI (Saksan liittovaltion tietoturvavirasto): 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)
