Apa itu port dan cara servis Linux berfungsi
Ketahui fungsi port dalam mengurus trafik pelayan. Pelajari cara menggunakan arahan ss untuk menyemak perkhidmatan yang sedang listening pada Linux anda.
Apa itu port sebenarnya
Port ialah nombor yang membolehkan satu pelayan menjalankan banyak perkhidmatan secara serentak tanpa trafiknya bercampur aduk. VPS anda mempunyai satu alamat IP, tetapi ia mungkin menjalankan pelayan web, pelayan SSH, dan pangkalan data pada masa yang sama. Apabila paket tiba, sistem operasi perlu tahu paket itu untuk perkhidmatan yang mana. Nombor port adalah jawapannya. Trafik web pergi ke port 443, SSH ke port 22. Alamat IP membawa paket ke pelayan anda; port membawanya ke program yang betul pada pelayan tersebut.
Port ialah nombor 16-bit: 16 bit memberikan nilai 0 hingga 65535, dan 0 adalah rizab, jadi port berjalan dari 1 hingga 65535 dalam praktiknya. Port di bawah 1024 ialah port "well-known" dan memerlukan akses root untuk dibuka, sebab itulah perkhidmatan standard berada di situ: 22 untuk SSH, 80 untuk HTTP, 443 untuk HTTPS, 53 untuk DNS. Apa-apa di atas 1024 adalah bebas untuk program biasa.
Terdapat dua jenis, TCP dan UDP, dan nombor port dalam satu jenis adalah berbeza daripada nombor yang sama dalam jenis yang lain. TCP ialah protokol berasaskan sambungan yang digunakan oleh kebanyakan perkhidmatan, seperti SSH, HTTP, dan pangkalan data. UDP adalah tanpa sambungan dan digunakan untuk perkara seperti DNS dan beberapa VPN. Apabila anda membuka firewall, anda biasanya menamakan jenisnya, contohnya 22/tcp.
Listening bermaksud program sedang menunggu pada port
Program yang ingin menerima sambungan meminta kernel untuk "listen" pada satu port. Dari saat itu, port tersebut terbuka pada mesin dan program tersebut menjawab apa sahaja yang tiba di situ, tertakluk kepada firewall. Port yang tiada sesiapa sedang listening hanya akan menolak sambungan. Jadi soalan pertama dalam sebarang pemeriksaan keselamatan ialah: apa yang sedang listening, dan di mana.
Perintah untuk menjawab perkara itu ialah ss:
sudo ss -tlnpFlag tersebut bermaksud TCP (t), hanya socket listening (l), port numerik (n, jadi anda melihat 22 bukan ssh), dan proses pemilik (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 nginxLajur Process memberitahu anda program mana yang memiliki setiap port, yang mana itulah cara anda mengesan sesuatu yang tidak sengaja dibiarkan berjalan.
Lajur Local Address ialah bahagian yang penting
Baca alamat di hadapan setiap port dengan teliti, kerana ia menentukan siapa yang boleh mencapai perkhidmatan tersebut. Terdapat tiga kes yang akan anda lihat secara berterusan.
0.0.0.0:22 bermaksud "listen pada setiap alamat IPv4 yang dimiliki mesin ini," termasuk alamat awamnya. Perkhidmatan tersebut boleh dicapai dari internet melalui IPv4, jika firewall membenarkan.
[::]:80 bermaksud perkara yang sama untuk IPv6: listen pada setiap alamat IPv6, termasuk awam. Banyak program melakukan bind di sini secara lalai, dan pada Linux, socket :: sering menerima IPv4 juga.
127.0.0.1:5432 bermaksud "listen pada loopback sahaja." 127.0.0.1 ialah alamat yang digunakan mesin untuk bercakap dengan dirinya sendiri, dan ia tidak boleh dihalakan (routable) dari mana-mana tempat lain. Perkhidmatan yang di-bind di sini hanya boleh dicapai dari pelayan yang sama, tidak pernah dari internet, tidak kira apa yang firewall anda katakan. Baris Postgres di atas adalah selamat secara struktur.
Peraturan praktikal terhasil daripada perkara ini: pangkalan data, 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 ia tidak pernah listen pada alamat awam, tiada apa yang boleh dicapai oleh penyerang.
Listening tidak sama dengan boleh dicapai (reachable)
Satu lagi perbezaan menyelamatkan banyak kekeliruan. Port yang terbuka pada mesin, bermaksud program sedang listening, adalah berbeza daripada port tersebut boleh dicapai dari luar, bermaksud firewall membenarkannya. Kedua-duanya mesti benar untuk pelanggan jauh (remote client) bersambung.
Jadi terdapat dua lapisan kawalan. Anda menentukan apa yang listening, dengan menetapkan alamat bind setiap perkhidmatan. Dan anda menentukan apa yang boleh dicapai oleh dunia luar, dengan firewall. Pelayan yang diurus dengan baik menggunakan kedua-duanya: perkhidmatan hanya di-bind di tempat yang diperlukan, dan firewall menolak semua yang anda tidak benarkan secara eksplisit. Membaca apa yang sedang listening dengan ss ialah langkah pertama; memutuskan apa yang dibenarkan oleh firewall ialah langkah kedua, yang dibincangkan dalam firewalls 101 with UFW.
Terdapat kehalusan yang sering mengelirukan orang di sini. IPv4 dan IPv6 adalah berasingan, dan firewall yang hanya meliputi IPv4 akan membiarkan perkhidmatan [::] terbuka pada IPv6. Perangkap khusus itu mempunyai artikelnya sendiri: the IPv6 firewall trap.
FAQ
Bagaimana saya ingin melihat port apa yang terbuka pada pelayan Linux saya?
Jalankan sudo ss -tlnp untuk TCP atau sudo ss -ulnp untuk UDP. Itu akan menyenaraikan setiap socket listening, port, alamat tempatan yang di-bind, dan proses yang memilikinya. Baca lajur Local Address: 0.0.0.0 atau [::] bermaksud perkhidmatan terdedah kepada rangkaian, manakala 127.0.0.1 bermaksud ia hanya listen pada mesin itu sendiri.
Apakah perbezaan antara 0.0.0.0 dan 127.0.0.1?
0.0.0.0 bermaksud "listen pada semua alamat IPv4," termasuk alamat awam, jadi perkhidmatan boleh dicapai dari rangkaian. 127.0.0.1 ialah loopback, alamat yang digunakan mesin untuk bercakap dengan dirinya sendiri, dan ia tidak boleh dihalakan dari mana-mana tempat lain, jadi perkhidmatan yang di-bind kepadanya hanya boleh dicapai secara tempatan. Bind perkhidmatan dalaman ke 127.0.0.1 supaya ia tidak pernah terdedah.
Adakah saya perlu membuka port dalam firewall untuk perkhidmatan berfungsi?
Hanya untuk perkhidmatan yang mesti dicapai dari mesin lain. Perkhidmatan yang di-bind ke 127.0.0.1 tidak memerlukan peraturan firewall kerana tiada perkara luaran yang boleh mencapainya. Perkhidmatan pada 0.0.0.0 atau [::] memerlukan peraturan firewall untuk membenarkan trafik, dan harus ditolak secara lalai sehingga anda menambahkannya.
Apakah perbezaan antara port TCP dan port UDP?
TCP adalah berasaskan sambungan dan digunakan oleh kebanyakan perkhidmatan, seperti SSH, pelayan web, dan pangkalan data. UDP adalah tanpa sambungan dan digunakan oleh DNS dan beberapa VPN. Nombor yang sama dalam TCP dan UDP adalah port yang berbeza, jadi 53/tcp dan 53/udp adalah berbeza. Apabila anda menulis peraturan firewall, anda menamakan protokolnya, contohnya 22/tcp.