Кои услуги слушат на Вашия VPS и какво е достъпно отвън?
Всяка програма, която приема връзки, слуша на даден порт: SSH на 22, уеб сървър на 80 и 443, MariaDB на 3306. Всеки порт, достъпен отвън, е врата към Вашия сървър. На един уебсайт отвън обикновено са нужни само 22, 80 и 443. Тук ще научите как да видите какво слуша и на кой адрес, както и как да проверите какво вижда останалата част от интернет.
Преглед на това какво слуша
Изпълнете на Вашия VPS:
sudo ss -tulpn
Опциите означават: TCP (-t), UDP (-u), само слушащи (-l), коя програма (-p) и числа вместо имена (-n). Пример:
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",...))
Важна е колоната Local Address, адресът, на който програмата слуша:
| Адрес | Значение |
|---|---|
0.0.0.0 | Всички IPv4 адреси, включително Вашият публичен адрес: достъпен отвън, освен ако firewall не го блокира |
[::] | Всички IPv6 адреси: същото за IPv6 |
127.0.0.1 или [::1] | Само самият сървър (loopback): никога не е достъпен отвън |
127.0.0.53 или 127.0.0.54 | Също loopback: локалният DNS помощник на systemd-resolved |
В примера MariaDB е наред: достъп до нея имат само програми на самия сървър. Redis слуша на всички адреси и точно това е грешката, за която става дума.
Затваряне в самата услуга
База данни, кеш или административен панел почти никога не бива да са достъпни отвън. Най-добрата първа стъпка е услугата да слуша само на loopback. В Debian и Ubuntu:
| Програма | Настройка | Файл |
|---|---|---|
| MariaDB или MySQL | bind-address = 127.0.0.1 | /etc/mysql/mariadb.conf.d/50-server.cnf |
| PostgreSQL | listen_addresses = 'localhost' | /etc/postgresql/<версия>/main/postgresql.conf |
| Redis | bind 127.0.0.1 -::1 и protected-mode yes | /etc/redis/redis.conf |
След това рестартирайте услугата (вижте Управление на услуги със systemctl на Вашия VPS) и проверете отново с ss -tulpn. Ако искате сами да достъпвате базата данни от Вашия лаптоп, използвайте SSH тунел вместо отворен порт, вижте SSH config: вход с кратко име.
Firewall като втори слой
Firewall блокира онова, което по невнимание все пак слуша на всички адреси. Как да настроите ufw, е описано в Firewall с ufw (или nftables). Не разчитайте само на един слой: firewall може да е изключен или дадено правило може да е твърде широко.
ports:), заобикалят ufw. База данни с "3306:3306" тогава е достъпна отвън, дори ufw да показва, че портът е затворен. Поставете пред него 127.0.0.1: или не публикувайте порта. Вижте Docker и firewall: безопасно публикуване на портове.Проверка отвън
ss показва какво слуша на сървъра, но не и какво пропуска Вашият firewall. Истинската проверка правите от друг компютър, а не от самия сървър. С nc (netcat) на Mac или Linux:
nc -vz -w 3 203.0.113.10 6379 nc -6 -vz -w 3 2001:db8::10 6379
В Windows PowerShell прави същото с Test-NetConnection 203.0.113.10 -Port 6379. Въведете Вашия собствен IPv4 и IPv6 адрес; те са посочени в екрана на VPS. Резултатът се тълкува така:
- Отворен (succeeded): нещо слуша и е достъпно отвън.
- Затворен (Connection refused): нищо не слуша или firewall активно отказва връзката.
- Филтриран (time-out): firewall тихо отхвърля трафика.
За база данни и затворен, и филтриран резултат са добри. Проверете и IPv6: честа грешка е firewall само с IPv4 правила, докато услугата слуша и на [::]. Скенер на портове като nmap проверява много портове наведнъж; използвайте такъв скенер само за собствения си сървър.
Вашият VPS е изцяло самостоятелно управляван: кои услуги слушат и как е настроен Вашият firewall, решавате Вие. Ние помагаме с частта на WebOké, като екрана на VPS, мрежата и snapshots.
Искате да научите повече? Запишете се за безплатния курс VPS и администриране на Linux сървъри, урок 5.1 Портове и слушащи услуги или урок 5.2 Firewall с ufw и nftables.
