Port yang terbuka lalu terlupakan adalah jalan masuk klasik ke server: database di alamat publik, dasbor debug, container yang memublikasikan port yang tidak diinginkan siapa pun. Pemeriksaannya hanya semenit jika Anda tahu dua perintah dan satu jebakan. Kami menjalankan semua langkah di bawah di server Ubuntu 24.04 baru dari image kami dan memindainya dari mesin kedua, jadi keluarannya sama dengan yang akan Anda lihat di server Anda sendiri.
1. Apa yang mendengarkan
Perintahnya ss. Huruf-hurufnya berarti TCP, UDP, socket yang mendengarkan, nomor port, dan nama proses:
sudo ss -tulpn
Di server baru, perintah ini mencetak enam baris:
Netid State Local Address:Port Process
udp UNCONN 127.0.0.54:53 systemd-resolve
udp UNCONN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 127.0.0.54:53 systemd-resolve
tcp LISTEN 127.0.0.53%lo:53 systemd-resolve
tcp LISTEN 0.0.0.0:22 sshd
tcp LISTEN [::]:22 sshd
Kolom yang penting adalah Local Address. Kolom ini memberi tahu siapa yang bisa terhubung:
| Alamat | Siapa yang bisa menjangkau |
|---|---|
127.0.0.1:… atau 127.0.0.53 | Hanya program di server ini |
0.0.0.0:… | Siapa saja lewat IPv4, kecuali diblokir firewall |
[::]:… | Siapa saja lewat IPv6 (biasanya IPv4 juga) |
10.0.0.5:… (alamat tertentu) | Siapa saja yang bisa menjangkau alamat itu |
Jadi server baru hanya membuka satu hal: SSH di port 22, lewat IPv4 dan IPv6. Resolver DNS di 127.0.0.53 bersifat privat.
Untuk menampilkan hanya yang bisa dilihat internet, saring alamat loopback:
sudo ss -tlnp | awk 'NR>1 && $4 !~ /^(127\.|\[::1\])/ {print $4, $6}'
Jalankan ini setelah setiap instalasi. Kami memasang nginx, Docker, dan satu aplikasi Python kecil, dan daftarnya bertambah dari 2 baris menjadi 10, termasuk docker-proxy di 0.0.0.0:8081 dan socket containerd di port localhost acak.
2. Proses mana yang memakai port
Saat port terpakai dan Anda ingin tahu oleh siapa:
sudo lsof -i :80 -P -n
sudo fuser 80/tcp
sudo ss -tlnp 'sport = :80'
lsof paling mudah dibaca. Untuk nginx, ia menampilkan satu proses master sebagai root dan worker sebagai www-data, keduanya di *:80, untuk IPv4 dan IPv6. fuser hanya mencetak PID, berguna dalam skrip. Jika perlu mengosongkan port, hentikan layanannya alih-alih membunuh PID, karena kalau tidak systemd akan menjalankannya lagi: sudo systemctl stop nginx.
3. Apa yang dilihat internet
ss menunjukkan sudut pandang server. Sudut pandang internet bisa berbeda karena ada firewall di antaranya atau karena layanan terikat ke 127.0.0.1. Untuk melihat gambaran sebenarnya, pindai server dari mesin lain, laptop Anda atau server kedua. Alatnya nmap (apt install nmap, atau installer dari nmap.org di Windows dan macOS).
nmap your-server-ip
nmap -p- your-server-ip
nmap -p 22,80,443,3306 your-server-ip
Bentuk pertama memeriksa 1.000 port paling umum, yang kedua seluruh 65.535, yang ketiga sebuah daftar. Di server baru kami, sebelum ada firewall:
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 6.83 seconds
Pemindaian penuh 65.535 port memakan 8,9 detik dan menemukan satu port yang sama. Port tertutup langsung menjawab dengan reset, karena itu memindainya cepat.
Ada tiga status yang penting:
- open: sebuah program menerima koneksi. Inilah permukaan serangan Anda.
- closed: server menjawab bahwa tidak ada yang mendengarkan di sana. Aman, tetapi memastikan server itu ada dan apa yang tidak dijalankannya.
- filtered: tidak ada jawaban. Firewall membuang paketnya. Pemindai tidak bisa tahu apakah ada layanan di baliknya.
Untuk satu port tanpa memasang apa pun, nc -zv ip-server 443 melaporkan succeeded atau refused, dan menunggu sampai batas waktu di port yang difilter. Untuk UDP, tambahkan -sU ke nmap dan bersiaplah menunggu; di server kami tiga port UDP umum, 53, 123, dan 161, berstatus closed.
Catatan untuk paket NAT: dari internet hanya port SSH yang kami teruskan untuk Anda yang bisa dijangkau. Pemindaian alamat bersama menampilkan tepi jaringan kami, bukan server Anda, dan port lain tidak bisa dijangkau apa pun yang mendengarkan di sana. Pada paket dengan alamat IPv4 sendiri, setiap port terbuka Anda kelola sendiri.
4. Tutup yang tidak diperlukan
Tiga cara, dari yang terbaik sampai yang paling luas.
Ikat ke localhost. Jika hanya program di server yang memakai sebuah layanan, buat ia mendengarkan di 127.0.0.1. Kami menjalankan aplikasi web kecil dengan --bind 127.0.0.1 8080: ss menampilkannya di 127.0.0.1:8080, dan nmap dari luar melaporkan 8080/tcp closed. Untuk database, ini bawaan yang tepat: Redis, MySQL, dan PostgreSQL di Ubuntu langsung mendengarkan di localhost, dan panduan Redis serta MySQL kami membiarkannya begitu.
Hentikan layanan. sudo systemctl disable --now nama menghapus listener untuk seterusnya. Periksa dengan ss bahwa ia sudah hilang.
Aktifkan firewall. Izinkan SSH dulu, lalu yang Anda sajikan, lalu aktifkan:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status verbose
Pemindaian dari luar berubah sepenuhnya:
Not shown: 997 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
8081/tcp open blackice-icecap
Nmap done: 1 IP address (1 host up) scanned in 10.18 seconds
Setiap port yang tidak diizinkan berubah dari closed menjadi filtered, dan pemindaian penuh 65.535 port kini memakan 110 detik, bukan 8,9. Lebih banyak waktu per port bagi pemindai, lebih sedikit informasi tentang server Anda. Panduan UFW kami membahas pembatasan laju, mengizinkan satu IP, dan IPv6.
Tapi lihat baris ketiga.
5. Kejutan dari Docker
Port 8081 tetap terbuka meski firewall aktif dan tanpa aturan yang mengizinkannya. Port itu milik container yang kami jalankan dengan docker run -p 8081:80 nginx:alpine. Docker menambahkan aturannya sendiri ke firewall kernel, dan aturan itu dievaluasi sebelum aturan ufw. Aturan yang ditulisnya di server kami:
-A DOCKER ! -i docker0 -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:80
Setiap paket ke port 8081 diteruskan ke container sebelum ufw sempat ikut menentukan. Setiap container dengan -p atau entri ports: melakukan ini, dan ss jujur menampilkannya sebagai docker-proxy di 0.0.0.0:8081.
Perbaikannya: publikasikan ke localhost saja:
docker rm -f web
docker run -d --name web -p 127.0.0.1:8081:80 nginx:alpine
Di Compose, tulis "127.0.0.1:8081:80" di bawah ports:. Setelah perubahan, ss menampilkan 127.0.0.1:8081, aturan Docker mendapat -d 127.0.0.1/32, dan pemindaian dari luar melaporkan 8081/tcp filtered. Pasang nginx sebagai reverse proxy di depan untuk sisi publik, dengan HTTPS, sehingga satu-satunya port terbuka di server adalah 22, 80, dan 443.
Daftar periksa setelah setiap perubahan
sudo ss -tulpn: apakah setiap baris0.0.0.0atau[::]memang ingin Anda buka?nmap ip-serverdari laptop: apakah port terbuka cocok?- Database, cache, atau panel admin di alamat publik: pindahkan ke
127.0.0.1atau ke balik firewall hari ini. - Setiap entri
ports:Docker: apakah diawali127.0.0.1:jika bukan port web publik? - SSH terbuka untuk semua: tambahkan fail2ban atau login hanya dengan kunci.
Di Windows Server, pemeriksaan yang sama adalah Get-NetTCPConnection -State Listen, dan aturannya ada di Windows Firewall. Setiap paket Linux, mulai dari Nano $3, punya versi dengan alamat IPv4 sendiri, dan di sana apa yang Anda lihat di ss itulah yang dilihat dunia, dikurangi firewall Anda.
Komentar
Belum ada komentar. Jadilah yang pertama.