Port yang Mendengarkan

Melihat layanan yang mengekspos mesin dengan ss -tulpn.

Daftar isi

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.

bash
# tampilkan socket TCP dan UDP yang mendengarkan beserta prosesnya
ss -tulpn
text Keluaran
Netid 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 alamatContoh dari daftarJangkauannya
127.0.0.1:port127.0.0.1:19001Hanya dari mesin itu sendiri
0.0.0.0:port0.0.0.0:19005Semua antarmuka IPv4
*:port*:81Semua 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.

bash
# 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'
text Keluaran
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.

bash
# tampilkan proses pemilik port dengan nomor pid disamarkan
ss -tlnp 'sport = :8642' | sed 's/pid=[0-9]\+/pid=N/'
text Keluaran
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.

bash
# uji layanan lewat loopback
curl -sI http://127.0.0.1:8642 | head -n 1
text Keluaran
HTTP/1.0 200 OK

Status 200 OK memastikan socket tersebut bukan sekadar terdaftar, melainkan benar-benar melayani permintaan HTTP. Terakhir, layanan dihentikan dan portnya diperiksa lagi.

bash
# 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'
text Keluaran
State Recv-Q Send-Q Local Address:Port Peer Address:Port

ss 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 -p selalu menampilkan nama proses. Tanpa hak root, kolom proses hanya terisi untuk socket milik pengguna sendiri. Jalankan sudo ss -tlnp pada mesin sendiri bila nama proses milik pengguna lain diperlukan.
  • Mencampur socket pendengar dengan sambungan aktif. Tanpa -l, perintah ss -t mencetak sambungan yang sedang terjalin dengan status seperti ESTAB, bukan daftar pintu yang terbuka. Gunakan -l untuk tujuan penilaian eksposur.
  • Memeriksa satu keluarga alamat saja. Layanan dapat mendengarkan pada IPv4, IPv6, atau keduanya, dan tampilannya berbeda, misalnya 127.0.0.1 pada IPv4 dan [::1] pada IPv6. Daftar lengkap dari ss -tulpn mencakup keduanya sekaligus.
  • Memakai netstat untuk keperluan yang sama. Perintah itu berasal dari paket net-tools yang tidak lagi dipasang secara default pada Ubuntu 24.04 dan Debian 12. ss dari iproute2 adalah penggantinya yang dikelola aktif.

Ringkasan#

  • ss -tulpn mencetak socket TCP dan UDP yang mendengarkan beserta alamat, port, antrean, dan proses pemiliknya.
  • Alamat pengikatan menentukan jangkauan, yaitu 127.0.0.1 untuk lokal, 0.0.0.0 untuk 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 ss tetap mencetak baris kepalanya saat daftarnya kosong.

Referensi#