Jaké služby na Vašem VPS naslouchají a co je dostupné zvenčí?
Každý program, který přijímá spojení, naslouchá na portu: SSH na 22, webový server na 80 a 443, MariaDB na 3306. Každý port dostupný zvenčí představuje dveře do Vašeho serveru. Webová stránka obvykle potřebuje zvenčí pouze porty 22, 80 a 443. Zde se dozvíte, jak zjistit, co naslouchá a na jaké adrese, a jak ověřit, co vidí zbytek internetu.
Zjištění, co naslouchá
Spusťte na svém VPS:
sudo ss -tulpn
Volby znamenají: TCP (-t), UDP (-u), pouze naslouchající (-l), který program (-p) a čísla místo názvů (-n). Příklad:
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",...))
Důležitý je sloupec Local Address, tedy adresa, na které program naslouchá:
| Adresa | Význam |
|---|---|
0.0.0.0 | Všechny adresy IPv4, tedy i Vaše veřejná adresa: dostupné zvenčí, pokud to nezablokuje firewall |
[::] | Všechny adresy IPv6: totéž pro IPv6 |
127.0.0.1 nebo [::1] | Pouze samotný server (loopback): zvenčí nikdy nedostupné |
127.0.0.53 nebo 127.0.0.54 | Také loopback: lokální pomocník DNS ze systemd-resolved |
V příkladu je MariaDB v pořádku: přistupovat k ní mohou pouze programy na samotném serveru. Redis naslouchá na všech adresách, a to je přesně ta chyba, o kterou jde.
Uzavření přímo ve službě
Databáze, cache nebo administrační rozhraní by téměř nikdy neměly být dostupné zvenčí. Nejlepším prvním krokem je, aby služba naslouchala pouze na loopbacku. Na Debianu a Ubuntu:
| Program | Nastavení | Soubor |
|---|---|---|
| MariaDB nebo MySQL | bind-address = 127.0.0.1 | /etc/mysql/mariadb.conf.d/50-server.cnf |
| PostgreSQL | listen_addresses = 'localhost' | /etc/postgresql/<verze>/main/postgresql.conf |
| Redis | bind 127.0.0.1 -::1 a protected-mode yes | /etc/redis/redis.conf |
Poté službu restartujte (viz Správa služeb pomocí systemctl na Vašem VPS) a znovu zkontrolujte pomocí ss -tulpn. Pokud se chcete k databázi připojit ze svého notebooku, použijte místo otevřeného portu tunel SSH, viz Konfigurace SSH: přihlášení pomocí krátkého názvu.
Firewall jako druhá vrstva
Firewall zablokuje to, co omylem přece jen naslouchá na všech adresách. Jak nastavit ufw, najdete v článku Firewall s ufw (nebo nftables). Nespoléhejte na jedinou vrstvu: firewall může být vypnutý nebo může být některé pravidlo příliš volné.
ports:), obcházejí ufw. Databáze s "3306:3306" je pak dostupná zvenčí, i když ufw tvrdí, že je port zavřený. Přidejte před něj 127.0.0.1:, nebo port nepublikujte. Viz Docker a firewall: bezpečné publikování portů.Kontrola zvenčí
ss ukazuje, co na serveru naslouchá, ale ne to, co propustí Váš firewall. Skutečnou kontrolu proveďte z jiného počítače, ne ze samotného serveru. Pomocí nc (netcat) na Macu nebo Linuxu:
nc -vz -w 3 203.0.113.10 6379 nc -6 -vz -w 3 2001:db8::10 6379
Ve Windows totéž provede PowerShell příkazem Test-NetConnection 203.0.113.10 -Port 6379. Doplňte svou vlastní adresu IPv4 a IPv6; najdete je na obrazovce VPS. Výsledek čtěte takto:
- Otevřený (succeeded): něco naslouchá a je to dostupné zvenčí.
- Zavřený (Connection refused): nic nenaslouchá, nebo firewall spojení aktivně odmítá.
- Filtrovaný (time-out): firewall provoz tiše zahazuje.
U databáze jsou zavřený i filtrovaný stav v pořádku. Otestujte také IPv6: častou chybou je firewall pouze s pravidly pro IPv4, zatímco služba naslouchá i na [::]. Skener portů, jako je nmap, kontroluje více portů najednou; takový skener používejte pouze na svém vlastním serveru.
Váš VPS je plně ve Vaší správě: které služby naslouchají a jak je nastaven firewall, si řídíte sami. My Vám pomůžeme s částí WebOké, jako je obrazovka VPS, síť a snapshoty.
Chcete se dozvědět více? Absolvujte bezplatný kurz VPS a správa linuxových serverů, lekci 5.1 Porty a naslouchající služby nebo lekci 5.2 Firewall s ufw a nftables.
