Vilka tjänster lyssnar på din VPS, och vad går att nå utifrån?
Varje program som tar emot anslutningar lyssnar på en port: SSH på 22, en webbserver på 80 och 443, MariaDB på 3306. Varje port som går att nå utifrån är en dörr in till din server. En webbplats behöver oftast bara 22, 80 och 443 utifrån. Här ser du hur du tar reda på vad som lyssnar, på vilken adress, och hur du kontrollerar vad resten av internet ser.
Se vad som lyssnar
Kör på din VPS:
sudo ss -tulpn
Flaggorna betyder: TCP (-t), UDP (-u), bara lyssnande (-l), vilket program (-p) och nummer i stället för namn (-n). Ett exempel:
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 viktiga är kolumnen Local Address, adressen som programmet lyssnar på:
| Adress | Betydelse |
|---|---|
0.0.0.0 | Alla IPv4-adresser, alltså även din publika adress: nåbar utifrån, om inte en brandvägg stoppar det |
[::] | Alla IPv6-adresser: samma sak för IPv6 |
127.0.0.1 eller [::1] | Bara servern själv (loopback): aldrig nåbar utifrån |
127.0.0.53 eller 127.0.0.54 | Också loopback: den lokala DNS-hjälpen i systemd-resolved |
I exemplet är MariaDB i ordning: bara program på servern själv kommer åt den. Redis lyssnar på alla adresser, och det är precis det felet det handlar om.
Stäng i själva tjänsten
En databas, cache eller administrationspanel ska nästan aldrig vara nåbar utifrån. Det bästa första steget är att tjänsten bara lyssnar på loopback. På Debian och Ubuntu:
| Program | Inställning | 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 och protected-mode yes | /etc/redis/redis.conf |
Starta sedan om tjänsten (se Hantera tjänster med systemctl på din VPS) och kontrollera igen med ss -tulpn. Vill du själv nå databasen från din laptop använder du en SSH-tunnel i stället för en öppen port, se En SSH-config: logga in med ett kort namn.
Brandväggen som andra lager
En brandvägg stoppar det som ändå råkar lyssna på alla adresser. Hur du ställer in ufw står i En brandvägg med ufw (eller nftables). Lita inte på ett enda lager: en brandvägg kan vara avstängd eller en regel kan vara för generös.
ports:) går förbi ufw. En databas med "3306:3306" blir då nåbar utifrån, även om ufw säger att porten är stängd. Lägg till 127.0.0.1: framför, eller publicera inte porten. Se Docker och brandväggen: publicera portar säkert.Kontrollera utifrån
ss visar vad som lyssnar på servern, men inte vad din brandvägg släpper igenom. Den riktiga kontrollen gör du från en annan dator, inte från servern själv. 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 samma sak med Test-NetConnection 203.0.113.10 -Port 6379. Fyll i din egen IPv4- och IPv6-adress; de finns i VPS-panelen. Så här läser du resultatet:
- Öppen (succeeded): något lyssnar och det är nåbart utifrån.
- Stängd (Connection refused): inget lyssnar, eller brandväggen nekar aktivt.
- Filtrerad (time-out): en brandvägg kastar trafiken i tysthet.
För en databas är både stängd och filtrerad bra. Testa även IPv6: ett vanligt misstag är en brandvägg med bara IPv4-regler, medan tjänsten också lyssnar på [::]. En portskanner som nmap kontrollerar fler portar på en gång; använd en sådan skanner bara på din egen server.
Din VPS är helt egenförvaltad: vilka tjänster som lyssnar och hur din brandvägg är inställd sköter du själv. Vi hjälper till med WebOké-delen, som VPS-panelen, nätverket och snapshots.
Vill du lära dig mer? Gå den kostnadsfria kursen VPS och Linux-serveradministration, lektion 5.1 Portar och lyssnande tjänster eller lektion 5.2 En brandvägg med ufw och nftables.
