Setiap layanan yang menerima sambungan memakai sebuah port, sehingga daftar port yang sedang mendengarkan (listening) adalah daftar pintu yang terbuka pada mesin. Topik ini membahas cara membaca daftar tersebut dengan ss -tulpn, cara menilai layanan mana yang terjangkau dari luar, serta cara mengamati siklus hidup sebuah pendengar, dari mulai berjalan sampai berhenti.
Port dan socket#
Port adalah nomor 16-bit, yaitu 0 sampai 65535, yang menjadi alamat aplikasi di atas alamat IP. Ketika sebuah layanan ingin menerima sambungan, layanan itu mengikat (bind) sebuah socket, yaitu pasangan protokol, alamat IP, dan port, lalu menempatkannya dalam keadaan mendengarkan. Sambungan yang masuk ke port tanpa pendengar akan ditolak secara eksplisit, sedangkan sambungan ke port dengan pendengar diteruskan ke layanannya.
Nomor port 0 sampai 1023 disebut port istimewa (privileged port) karena pengikatannya membutuhkan hak root atau kapabilitas khusus, sehingga layanan sistem seperti SSH lazim memakai rentang ini. Port di atas 1023 bebas dipakai proses pengguna biasa, yang menjadi alasan server pengembangan memilih port seperti 8000 atau 8080.
Alamat pengikatan sama pentingnya dengan nomor portnya. Layanan yang mengikat 127.0.0.1 hanya terjangkau dari mesin itu sendiri, sedangkan layanan yang mengikat 0.0.0.0 menerima sambungan dari semua antarmuka IPv4. Padanan IPv6 untuk “semua antarmuka” ditulis ::. Dua layanan yang sama-sama mendengarkan di port 8080 pada alamat yang berbeda dapat berjalan berdampingan tanpa saling mengganggu.
Membaca daftar pendengar dengan ss#
Perintah ss mencetak daftar socket dari kernel, dan opsi -tulpn membatasinya pada socket TCP dan UDP yang sedang mendengarkan dengan tampilan numerik. Huruf-hurufnya masing-masing berarti -t untuk TCP, -u untuk UDP, -l untuk socket pendengar saja, -p untuk menampilkan proses pemiliknya, dan -n untuk mencetak alamat serta port sebagai angka tanpa resolusi nama.
# tampilkan socket TCP dan UDP yang mendengarkan beserta prosesnya
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
udp UNCONN 0 0 [::1]:323 [::]:*
tcp LISTEN 0 2048 127.0.0.1:12600 0.0.0.0:*
tcp LISTEN 0 5 0.0.0.0:3000 0.0.0.0:* users:(("python3",pid=936,fd=3))
tcp LISTEN 0 128 127.0.0.1:19001 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:12700 0.0.0.0:*
tcp LISTEN 0 1024 0.0.0.0:19005 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:19006 0.0.0.0:*
tcp LISTEN 0 4096 *:81 *:*Kolom Local Address:Port adalah alamat yang diikat beserta portnya, sedangkan kolom Peer berisi 0.0.0.0:* atau [::]:* karena socket pendengar belum memiliki lawan bicara. Kolom Recv-Q dan Send-Q pada socket pendengar memuat jumlah sambungan yang menunggu diterima layanan dan batas maksimum antreannya, misalnya 0 dan 511 pada port 12700. Kolom Process memuat nama proses, nomor PID, dan deskriptor berkas socket tersebut.
Kolom Process pada keluaran di atas tampak kosong untuk sebagian besar baris. Ini perilaku yang diharapkan, bukan error, karena kernel menyembunyikan informasi proses milik pengguna lain dari pengguna biasa. Baris python3 pada port 3000 adalah satu-satunya yang tampil utuh karena prosesnya berjalan dengan identitas pengguna yang sama, sedangkan baris lainnya adalah proses infrastruktur milik pengguna lain. Proses milik pengguna sendiri selalu tampil utuh di kolom yang sama, sebagaimana ditunjukkan pada bagian berikut.
Membaca alamat pendengar#
Kolom Local Address:Port pada daftar sebelumnya menentukan dari mana layanan tersebut dapat dijangkau, dan nilainya dapat dikelompokkan menjadi tiga pola.
| Pola alamat | Contoh dari daftar | Jangkauannya |
|---|---|---|
127.0.0.1:port | 127.0.0.1:19001 | Hanya dari mesin itu sendiri |
0.0.0.0:port | 0.0.0.0:19005 | Semua antarmuka IPv4 |
*:port | *:81 | Semua antarmuka, IPv4 dan IPv6 |
Baris 127.0.0.1 tidak terpengaruh oleh jaringan luar karena paketnya tidak pernah meninggalkan mesin. Baris 0.0.0.0 dan * inilah yang benar-benar mengekspos mesin, sehingga keduanya menjadi bahan pertimbangan utama saat firewall diatur. Penilaian ini sederhana tetapi menentukan, karena port yang mendengarkan pada semua antarmuka tanpa kebutuhan nyata adalah permukaan serangan yang sia-sia.
Cara membaca yang sama berlaku pada mesin apa pun yang dikelola. Layanan basis data yang hanya boleh diakses aplikasi pada mesin yang sama semestinya muncul sebagai 127.0.0.1:5432, bukan 0.0.0.0:5432, dan penyimpangan seperti itu paling cepat ditemukan dari daftar ss. Dengan demikian, membaca alamat pendengar menjadi kebiasaan pemeriksaan yang murah sebelum masuk ke pengaturan firewall.
Mengamati siklus hidup sebuah pendengar#
Siklus hidup pendengar paling mudah dipahami dari layanan yang dimulai dan dihentikan secara manual. Perintah python3 -m http.server menjalankan server web kecil yang melayani isi direktori kerja, dan keempat blok berikut harus dijalankan berurutan pada sesi terminal yang sama.
# hentikan sisa server latihan bila masih berjalan dari sesi sebelumnya
pkill -f "http.server 8642"
# jalankan server latihan sederhana pada port 8642
python3 -m http.server 8642 --bind 127.0.0.1 >/dev/null 2>&1 &
# beri waktu server untuk mulai mendengarkan
sleep 0.5
# tampilkan baris pendengar untuk port tersebut
ss -tln 'sport = :8642'State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 127.0.0.1:8642 0.0.0.0:*Baris LISTEN untuk port 8642 kini muncul, dengan nilai Send-Q sebesar 5 yang merupakan ukuran antrean default server latihan ini. Tanda & pada akhir perintah python3 menjalankannya sebagai proses latar belakang sehingga terminal tetap dapat dipakai.
# tampilkan proses pemilik port dengan nomor pid disamarkan
ss -tlnp 'sport = :8642' | sed 's/pid=[0-9]\+/pid=N/'State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8642 0.0.0.0:* users:(("python3",pid=N,fd=3))Karena server latihan ini dimiliki pengguna yang sama dengan yang menjalankan ss, kolom Process terisi penuh, lengkap dengan PID dan deskriptor berkasnya. Nomor PID berganti setiap kali server dijalankan ulang, sehingga pada contoh tersebut nilainya diganti dengan N melalui sed agar keluarannya tetap bersih. Kepemilikan inilah yang membuat baris-baris milik pengguna lain tampak kosong pada daftar sebelumnya.
# uji layanan lewat loopback
curl -sI http://127.0.0.1:8642 | head -n 1HTTP/1.0 200 OKStatus 200 OK memastikan socket tersebut bukan sekadar terdaftar, melainkan benar-benar melayani permintaan HTTP. Terakhir, layanan dihentikan dan portnya diperiksa lagi.
# hentikan server latihan
pkill -f "http.server 8642"
# beri waktu port tertutup sepenuhnya
sleep 0.3
# pastikan tidak ada lagi pendengar pada port tersebut
ss -tln 'sport = :8642'State Recv-Q Send-Q Local Address:Port Peer Address:Portss selalu mencetak baris kepalanya, dan tidak adanya baris lain berarti tidak ada lagi pendengar pada port 8642. Sambungan baru ke port itu sekarang akan ditolak dengan Connection refused, yang cocok dengan urutan diagnosis pada topik alat konektivitas.
Kesalahan umum#
- Mengira
-pselalu menampilkan nama proses. Tanpa hak root, kolom proses hanya terisi untuk socket milik pengguna sendiri. Jalankansudo ss -tlnppada mesin sendiri bila nama proses milik pengguna lain diperlukan. - Mencampur socket pendengar dengan sambungan aktif. Tanpa
-l, perintahss -tmencetak sambungan yang sedang terjalin dengan status sepertiESTAB, bukan daftar pintu yang terbuka. Gunakan-luntuk tujuan penilaian eksposur. - Memeriksa satu keluarga alamat saja. Layanan dapat mendengarkan pada IPv4, IPv6, atau keduanya, dan tampilannya berbeda, misalnya
127.0.0.1pada IPv4 dan[::1]pada IPv6. Daftar lengkap dariss -tulpnmencakup keduanya sekaligus. - Memakai
netstatuntuk keperluan yang sama. Perintah itu berasal dari paket net-tools yang tidak lagi dipasang secara default pada Ubuntu 24.04 dan Debian 12.ssdari iproute2 adalah penggantinya yang dikelola aktif.
Ringkasan#
ss -tulpnmencetak socket TCP dan UDP yang mendengarkan beserta alamat, port, antrean, dan proses pemiliknya.- Alamat pengikatan menentukan jangkauan, yaitu
127.0.0.1untuk lokal,0.0.0.0untuk semua antarmuka IPv4, dan*untuk kedua keluarga alamat. - Kolom proses hanya terisi untuk socket milik pengguna yang menjalankan
ss, dan informasi proses pengguna lain butuh hak root. - Pendengar muncul dan hilang bersama layanannya, sementara
sstetap mencetak baris kepalanya saat daftarnya kosong.
Referensi#
- ss(8) — Linux man-pages project — Daftar opsi perintah ss serta makna kolom keluarannya.
- http.server — Python documentation
— Modul yang menyediakan perintah
python3 -m http.server.