Hvilke tjenester lytter på din VPS, og hvad kan nås udefra?
Ethvert program, der modtager forbindelser, lytter på en port: SSH på 22, en webserver på 80 og 443, MariaDB på 3306. Hver port, der kan nås udefra, er en dør ind til din server. En hjemmeside har som regel kun brug for 22, 80 og 443 udefra. Her kan du læse, hvordan du ser, hvad der lytter, og på hvilken adresse, og hvordan du tjekker, hvad resten af internettet ser.
Se, hvad der lytter
Kør på din VPS:
sudo ss -tulpn
Valgmulighederne betyder: TCP (-t), UDP (-u), kun lyttende (-l), hvilket program (-p) og numre i stedet for navne (-n). Et eksempel:
tcp LISTEN 0.0.0.0:22 users:(("sshd",...))
tcp LISTEN 0.0.0.0:443 users:(("nginx",...))
tcp LISTEN 127.0.0.1:3306 users:(("mariadbd",...))
tcp LISTEN 0.0.0.0:6379 users:(("redis-server",...))
tcp LISTEN [::]:22 users:(("sshd",...))
Det vigtige er kolonnen Local Address, altså den adresse, programmet lytter på:
| Adresse | Betydning |
|---|---|
0.0.0.0 | Alle IPv4-adresser, altså også din offentlige adresse: kan nås udefra, medmindre en firewall blokerer det |
[::] | Alle IPv6-adresser: det samme for IPv6 |
127.0.0.1 eller [::1] | Kun selve serveren (loopback): kan aldrig nås udefra |
127.0.0.53 eller 127.0.0.54 | Også loopback: den lokale DNS-hjælper i systemd-resolved |
I eksemplet er MariaDB i orden: kun programmer på selve serveren kan komme til den. Redis lytter på alle adresser, og det er netop den fejl, det handler om.
Luk den i selve tjenesten
En database, en cache eller et administrationspanel skal næsten aldrig kunne nås udefra. Det bedste første skridt er, at tjenesten kun lytter på loopback. På Debian og Ubuntu:
| Program | Indstilling | Fil |
|---|---|---|
| MariaDB eller MySQL | bind-address = 127.0.0.1 | /etc/mysql/mariadb.conf.d/50-server.cnf |
| PostgreSQL | listen_addresses = 'localhost' | /etc/postgresql/<version>/main/postgresql.conf |
| Redis | bind 127.0.0.1 -::1 og protected-mode yes | /etc/redis/redis.conf |
Genstart derefter tjenesten (se Administrer tjenester med systemctl på din VPS), og tjek igen med ss -tulpn. Vil du selv tilgå databasen fra din laptop, så brug en SSH-tunnel i stedet for en åben port, se En SSH-config: log ind med et kort navn.
Firewallen som andet lag
En firewall blokerer det, der alligevel ved en fejl lytter på alle adresser. Hvordan du sætter ufw op, kan du læse i En firewall med ufw (eller nftables). Stol ikke på ét lag: en firewall kan være slået fra, eller en regel kan være for bred.
ports:), går uden om ufw. En database med "3306:3306" kan så nås udefra, også selvom ufw siger, at porten er lukket. Sæt 127.0.0.1: foran, eller lad være med at udgive porten. Se Docker og firewallen: udgiv porte sikkert.Tjek udefra
ss viser, hvad der lytter på serveren, men ikke hvad din firewall lukker igennem. Det rigtige tjek laver du fra en anden computer, ikke fra selve serveren. Med nc (netcat) på Mac eller Linux:
nc -vz -w 3 203.0.113.10 6379 nc -6 -vz -w 3 2001:db8::10 6379
På Windows gør PowerShell det samme med Test-NetConnection 203.0.113.10 -Port 6379. Indsæt din egen IPv4- og IPv6-adresse; dem finder du i VPS-skærmbilledet. Sådan læser du resultatet:
- Åben (succeeded): noget lytter, og det kan nås udefra.
- Lukket (Connection refused): intet lytter, eller firewallen afviser aktivt.
- Filtreret (time-out): en firewall smider trafikken stille væk.
For en database er både lukket og filtreret godt. Test også IPv6: en almindelig fejl er en firewall med kun IPv4-regler, mens tjenesten også lytter på [::]. En portscanner som nmap tjekker flere porte på én gang; brug kun sådan en scanner på din egen server.
Din VPS er fuldt selvadministreret: hvilke tjenester der lytter, og hvordan din firewall er sat op, styrer du selv. Vi hjælper med WebOké-delen, såsom VPS-skærmbilledet, netværket og snapshots.
Vil du lære mere? Tag det gratis kursus VPS og Linux-serveradministration, lektion 5.1 Porte og lyttende tjenester eller lektion 5.2 En firewall med ufw og nftables.
