EQVPS
DasborMulai

Cara memeriksa port terbuka di VPS: apa yang mendengarkan, apa yang dilihat internet, dan kejutan dari Docker

Lihat setiap port yang didengarkan server Anda, temukan proses di baliknya, pindai server dari luar seperti yang dilakukan penyerang, lalu tutup yang tidak diperlukan. Termasuk port Docker yang tetap terbuka meski firewall aktif. Setiap angka diukur di server Ubuntu 24.04 yang baru.

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:

AlamatSiapa yang bisa menjangkau
127.0.0.1:… atau 127.0.0.53Hanya 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

  1. sudo ss -tulpn: apakah setiap baris 0.0.0.0 atau [::] memang ingin Anda buka?
  2. nmap ip-server dari laptop: apakah port terbuka cocok?
  3. Database, cache, atau panel admin di alamat publik: pindahkan ke 127.0.0.1 atau ke balik firewall hari ini.
  4. Setiap entri ports: Docker: apakah diawali 127.0.0.1: jika bukan port web publik?
  5. 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.

FAQ

Port apa saja yang terbuka di VPS baru?

Di image Ubuntu 24.04 kami, satu: SSH di port 22. Selain itu hanya resolver DNS lokal di 127.0.0.53 dan 127.0.0.54 yang mendengarkan, dan internet tidak bisa menjangkaunya. Pemindaian seluruh 65.535 port TCP dari mesin lain menemukan tepat satu port terbuka.

Apa beda port closed dan filtered?

Closed berarti server menjawab bahwa tidak ada yang mendengarkan di sana, jadi pemindai langsung tahu. Filtered berarti tidak ada jawaban sama sekali, itulah yang dilakukan firewall saat membuang paket. Keduanya menahan penyusup, tetapi filtered juga menyembunyikan layanan apa saja yang ada dan membuat pemindaian penuh sekitar dua belas kali lebih lambat di server kami.

Kenapa ss menampilkan port yang menurut nmap closed?

Layanan hanya mendengarkan di 127.0.0.1, alamat loopback. Program di server itu sendiri bisa terhubung, dari luar tidak ada. Di ss, lihat kolom Local Address: 127.0.0.1:8080 bersifat privat, 0.0.0.0:8080 atau [::]:8080 bisa dijangkau dari internet jika firewall mengizinkan.

Saya sudah mengaktifkan ufw, kenapa port Docker masih terbuka?

Docker menulis aturan firewall sendiri yang dievaluasi sebelum aturan ufw. Container yang dijalankan dengan -p 8081:80 bisa dijangkau dari luar di server kami dengan ufw aktif dan tanpa aturan untuk 8081. Publikasikan ke localhost saja, -p 127.0.0.1:8081:80, dan pasang nginx atau Caddy di depannya untuk sisi publik.

Bagaimana memeriksa port dari komputer saya sendiri?

Jalankan nc -zv ip-server 443 untuk satu port, atau pasang nmap dan jalankan nmap ip-server untuk seribu port paling umum. Di paket NAT hanya port SSH yang diteruskan untuk Anda yang menjawab dari internet; sisanya memang tidak bisa dijangkau.

Komentar

Belum ada komentar. Jadilah yang pertama.

Tinggalkan komentar

Komentar dimoderasi sebelum muncul.