Apa itu port dan cara kerja layanan Linux
Pelajari fungsi port dalam mengarahkan trafik ke layanan yang tepat. Gunakan perintah ss untuk mengecek port yang sedang listening pada sistem Linux Anda.
Apa itu port sebenarnya
Port adalah sebuah angka yang memungkinkan satu server menjalankan banyak layanan secara bersamaan tanpa mencampuradukkan lalu lintas datanya. VPS Anda memiliki satu alamat IP, tetapi dapat menjalankan web server, SSH server, dan database secara bersamaan. Saat sebuah paket tiba, sistem operasi perlu mengetahui paket tersebut ditujukan untuk layanan yang mana. Nomor port adalah jawabannya. Lalu lintas web menuju ke port 443, SSH ke port 22. Alamat IP membawa paket ke server Anda; port membawanya ke program yang tepat di server tersebut.
Port adalah angka 16-bit: 16 bit memberikan rentang 0 hingga 65535, dan 0 dicadangkan, sehingga dalam praktiknya port berjalan dari 1 hingga 65535. Port di bawah 1024 adalah port "well-known" dan memerlukan hak akses root untuk dibuka, itulah sebabnya layanan standar berada di sana: 22 untuk SSH, 80 untuk HTTP, 443 untuk HTTPS, 53 untuk DNS. Segala sesuatu di atas 1024 dapat digunakan oleh program biasa.
Ada dua jenis, TCP dan UDP, dan nomor port pada satu protokol terpisah dari nomor yang sama pada protokol lainnya. TCP adalah protokol berbasis koneksi yang digunakan oleh sebagian besar layanan, seperti SSH, HTTP, dan database. UDP bersifat connectionless dan digunakan untuk hal-hal seperti DNS dan beberapa VPN. Saat Anda membuka firewall, Anda biasanya menentukan protokol mana yang digunakan, misalnya 22/tcp.
Listening berarti sebuah program sedang menunggu pada sebuah port
Program yang ingin menerima koneksi meminta kernel untuk "listen" pada sebuah port. Sejak saat itu, port tersebut terbuka di mesin tersebut dan program akan menjawab apa pun yang tiba di sana, tergantung pada firewall. Port yang tidak memiliki layanan yang sedang listening akan menolak koneksi. Jadi, pertanyaan pertama dalam pemeriksaan keamanan apa pun adalah: apa yang sedang listening, dan di mana.
Perintah untuk menjawab hal tersebut adalah ss:
sudo ss -tlnpFlag tersebut berarti TCP (t), hanya socket listening (l), port numerik (n, sehingga Anda melihat 22 bukan ssh), dan proses pemiliknya (p). Hasil tipikal:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxKolom Process memberi tahu Anda program mana yang memiliki setiap port, yang merupakan cara Anda melacak sesuatu yang tidak sengaja Anda biarkan berjalan.
Kolom Local Address adalah bagian yang penting
Baca alamat di depan setiap port dengan teliti, karena hal ini menentukan siapa yang dapat menjangkau layanan tersebut. Ada tiga kasus yang akan sering Anda temui.
0.0.0.0:22 berarti "listen pada setiap alamat IPv4 yang dimiliki mesin ini," termasuk alamat publiknya. Layanan dapat dijangkau dari internet melalui IPv4, jika firewall mengizinkan.
[::]:80 berarti hal yang sama untuk IPv6: listen pada setiap alamat IPv6, termasuk publik. Banyak program melakukan bind di sini secara default, dan pada Linux socket :: sering kali menerima IPv4 juga.
127.0.0.1:5432 berarti "listen pada loopback saja." 127.0.0.1 adalah alamat yang digunakan mesin untuk berkomunikasi dengan dirinya sendiri, dan alamat ini tidak dapat di-route dari tempat lain. Layanan yang di-bind di sini hanya dapat dijangkau dari server yang sama, tidak pernah dari internet, tidak peduli apa yang dikatakan firewall Anda. Baris Postgres di atas aman secara desain.
Aturan praktisnya adalah sebagai berikut: database, cache, atau panel admin yang hanya digunakan oleh aplikasi Anda sendiri harus di-bind ke 127.0.0.1, bukan 0.0.0.0. Jika layanan tidak pernah listen pada alamat publik, tidak ada yang bisa dijangkau oleh penyerang.
Listening tidak sama dengan reachable
Satu perbedaan lagi akan menghindari banyak kebingungan. Port yang terbuka di mesin, yang berarti sebuah program sedang listening, berbeda dengan port tersebut dapat dijangkau (reachable) dari luar, yang berarti firewall mengizinkannya. Keduanya harus bernilai benar agar klien jarak jauh dapat terhubung.
Jadi ada dua lapisan kontrol. Anda menentukan apa yang listening dengan mengatur alamat bind setiap layanan. Dan Anda menentukan apa yang dapat dijangkau oleh dunia luar dengan firewall. Server yang dikelola dengan baik menggunakan keduanya: layanan hanya melakukan bind di tempat yang dibutuhkan, dan firewall menolak semua hal yang tidak Anda izinkan secara eksplisit. Membaca apa yang sedang listening dengan ss adalah langkah pertama; memutuskan apa yang diizinkan firewall adalah langkah kedua, yang dibahas dalam firewalls 101 dengan UFW.
Ada kehalusan yang sering menjebak orang di sini. IPv4 dan IPv6 adalah terpisah, dan firewall yang hanya mencakup IPv4 akan membiarkan layanan [::] terbuka pada IPv6. Jebakan spesifik tersebut memiliki artikel tersendiri: the IPv6 firewall trap.
FAQ
Bagaimana cara melihat port apa saja yang terbuka di server Linux saya?
Jalankan sudo ss -tlnp untuk TCP atau sudo ss -ulnp untuk UDP. Itu akan mencantumkan setiap socket listening, port, alamat lokal tempat ia di-bind, dan proses yang memilikinya. Baca kolom Local Address: 0.0.0.0 atau [::] berarti layanan terekspos ke jaringan, sedangkan 127.0.0.1 berarti layanan hanya listen pada mesin itu sendiri.
Apa perbedaan antara 0.0.0.0 dan 127.0.0.1?
0.0.0.0 berarti "listen pada semua alamat IPv4," termasuk alamat publik, sehingga layanan dapat dijangkau dari jaringan. 127.0.0.1 adalah loopback, alamat yang digunakan mesin untuk berkomunikasi dengan dirinya sendiri, dan tidak dapat di-route dari tempat lain, sehingga layanan yang di-bind ke alamat tersebut hanya dapat dijangkau secara lokal. Bind layanan internal ke 127.0.0.1 agar tidak pernah terekspos.
Apakah saya perlu membuka port di firewall agar layanan dapat berfungsi?
Hanya untuk layanan yang harus dijangkau dari mesin lain. Layanan yang di-bind ke 127.0.0.1 tidak memerlukan aturan firewall karena tidak ada entitas eksternal yang dapat menjangkaunya. Layanan pada 0.0.0.0 atau [::] memerlukan aturan firewall untuk mengizinkan lalu lintas, dan harus ditolak secara default sampai Anda menambahkannya.
Apa perbedaan antara port TCP dan port UDP?
TCP berbasis koneksi dan digunakan oleh sebagian besar layanan, seperti SSH, web server, dan database. UDP bersifat connectionless dan digunakan oleh DNS dan beberapa VPN. Nomor yang sama pada TCP dan UDP adalah port yang berbeda, sehingga 53/tcp dan 53/udp adalah berbeda. Saat Anda menulis aturan firewall, Anda menentukan protokolnya, misalnya 22/tcp.