UFW Firewall na VPS — konfiguracja i reguły portów
Opublikowano: 8 kwietnia 2026 · Kategoria: Bezpieczeństwo VPS
UFW (Uncomplicated Firewall) to nakładka na iptables dostępna domyślnie w Ubuntu i Debian. Świeżo postawiony VPS bez firewalla akceptuje połączenia na wszystkich portach — skanery botnetów znajdą otwarty port MySQL, Redis czy inny serwis w ciągu minut. Prawidłowo skonfigurowany UFW blokuje cały ruch z wyjątkiem wyraźnie dozwolonych portów.
Instalacja i pierwsze uruchomienie
Krytyczne: zawsze dodaj regułę SSH przed włączeniem UFW, inaczej zablokujesz sobie dostęp.
# Instalacja (Ubuntu/Debian) sudo apt update && sudo apt install ufw -y # NAJPIERW dodaj SSH (zanim włączysz UFW!) sudo ufw allow ssh # lub konkretny port: sudo ufw allow 22/tcp # Włącz UFW (teraz bezpiecznie) sudo ufw enable # Sprawdź status sudo ufw status verbose
Podstawowe reguły dla serwera web
# HTTP i HTTPS sudo ufw allow 80/tcp sudo ufw allow 443/tcp # Lub użyj profilu (jeśli nginx/apache jest zainstalowany) sudo ufw allow 'Nginx Full' sudo ufw allow 'Apache Full' # Domyślna polityka: blokuj przychodzące, zezwalaj wychodzące sudo ufw default deny incoming sudo ufw default allow outgoing
Reguły dla baz danych i serwisów wewnętrznych
Bazy danych powinny być dostępne TYLKO z localhost lub konkretnych IP — nigdy publicznie:
# MySQL/MariaDB — tylko z konkretnej podsieci sudo ufw allow from 10.0.0.0/8 to any port 3306 # PostgreSQL — tylko localhost (domyślnie nie jest potrzebna reguła UFW) # PostgreSQL słucha tylko na localhost w /etc/postgresql/*/main/postgresql.conf # Jeśli jednak potrzebujesz z innego IP: sudo ufw allow from 192.168.1.100 to any port 5432 # Redis — NIGDY nie otwieraj publicznie! # Redis domyślnie bind 127.0.0.1 — jeśli zmieniłeś, przywróć lub dodaj regułę: sudo ufw deny 6379 # Elasticsearch — tylko wewnętrzna sieć sudo ufw allow from 10.0.0.0/8 to any port 9200
Rate limiting SSH — ochrona przed brute-force
# Rate limiting: blokuj IP po 6 próbach w 30 sekund sudo ufw limit ssh # lub dla niestandardowego portu: sudo ufw limit 2222/tcp # Sprawdź reguły z numerami sudo ufw status numbered # Usuń regułę po numerze sudo ufw delete 3
Zmiana portu SSH — procedura bezpieczna
# Krok 1: Otwórz nowy port w UFW sudo ufw allow 2222/tcp # Krok 2: Zmień Port w konfiguracji SSH sudo nano /etc/ssh/sshd_config # Znajdź i zmień: Port 22 -> Port 2222 # Krok 3: Restart SSH sudo systemctl restart sshd # Krok 4: TEST — otwórz NOWĄ sesję SSH na port 2222 # ssh -p 2222 user@server_ip # Krok 5 (tylko po potwierdzeniu że działa): usuń stary port sudo ufw delete allow ssh sudo ufw delete allow 22/tcp
Whitelist konkretnych IP
# Zezwól na wszystko z konkretnego IP (np. biuro) sudo ufw allow from 203.0.113.10 # Zezwól na SSH tylko z konkretnego IP sudo ufw allow from 203.0.113.10 to any port 22 # Zablokuj konkretne IP (np. po ataku) sudo ufw deny from 198.51.100.0/24 # Zezwól na wszystko z podsieci prywatnej sudo ufw allow from 10.0.0.0/8
Logowanie UFW
# Włącz logowanie (domyślnie low)
sudo ufw logging on
# Poziomy: off, low, medium, high, full
sudo ufw logging medium
# Logi w /var/log/ufw.log
sudo tail -f /var/log/ufw.log
# Filtruj zablokowane połączenia
sudo grep "BLOCK" /var/log/ufw.log | tail -20
# Top IP atakujące port 22
sudo grep "BLOCK.*DPT=22" /var/log/ufw.log | awk '{print $13}' | sort | uniq -c | sort -rn | head -10 | Port / Serwis | Rekomendacja | Polecenie |
|---|---|---|
| 22 (SSH) | Ogranicz do konkretnych IP lub użyj rate limiting | ufw limit ssh |
| 80 (HTTP) | Otwórz publicznie | ufw allow 80/tcp |
| 443 (HTTPS) | Otwórz publicznie | ufw allow 443/tcp |
| 3306 (MySQL) | Tylko z konkretnych IP lub localhost | ufw allow from IP to any port 3306 |
| 5432 (PostgreSQL) | Tylko localhost lub konkretne IP | ufw allow from IP to any port 5432 |
| 6379 (Redis) | NIGDY publicznie — tylko localhost | ufw deny 6379 |
| 8080 (aplikacja) | Opcjonalnie — tylko jeśli potrzebne | ufw allow 8080/tcp |