Cara Semak Port Linux Yang Sedang Listening
Ketahui cara port berfungsi untuk mengurus trafik pelayan anda. Gunakan arahan ss untuk melihat servis yang aktif dan membezakan port tempatan dengan port awam dengan tepat.
Apakah sebenarnya port
Port ialah nombor yang membolehkan satu pelayan menjalankan banyak servis serentak tanpa trafiknya bercampur. 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 pengendalian perlu tahu untuk servis yang mana paket tersebut ditujukan. 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 0 hingga 65535, dan 0 dikhaskan, jadi secara praktikalnya port berjalan dari 1 hingga 65535. Port di bawah 1024 ialah port "well-known" dan memerlukan root untuk dibuka, itulah sebabnya servis standard berada di situ: 22 untuk SSH, 80 untuk HTTP, 443 untuk HTTPS, 53 untuk DNS. Mana-mana port di atas 1024 boleh digunakan oleh program biasa.
Terdapat dua jenis, TCP dan UDP, dan nombor port dalam satu jenis adalah berasingan daripada nombor yang sama dalam jenis yang lain. TCP ialah protokol berasaskan sambungan yang digunakan oleh kebanyakan servis, 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 perlu menyatakan jenisnya, contohnya 22/tcp.
Mendengar bermaksud program sedang menunggu pada port
Program yang ingin menerima sambungan akan meminta kernel untuk "mendengar" pada sesuatu port. Sejak saat itu, port tersebut terbuka pada mesin dan program akan menjawab apa sahaja yang tiba di situ, tertakluk kepada firewall. Port yang tidak mempunyai sebarang program yang mendengar akan terus menolak sambungan. Oleh itu, soalan pertama dalam mana-mana pemeriksaan keselamatan ialah: apakah yang sedang mendengar, dan di mana.
Perintah untuk menjawab soalan tersebut ialah ss:
sudo ss -tlnpFlag tersebut bermaksud TCP (t), hanya soket yang mendengar (l), port berangka (n, supaya anda melihat 22 bukan ssh), dan proses pemilik (p). Hasil biasa:
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, iaitu cara anda menjejaki sesuatu yang anda tidak berniat untuk biarkan berjalan.
Lajur Local Address adalah bahagian yang penting
Baca alamat di hadapan setiap port dengan teliti, kerana ia menentukan siapa yang boleh mencapai servis tersebut. Terdapat tiga kes yang akan anda lihat secara berterusan.
0.0.0.0:22 bermaksud "mendengar pada setiap alamat IPv4 yang dimiliki mesin ini," termasuk alamat awamnya. Servis tersebut boleh dicapai dari internet melalui IPv4, sekiranya firewall membenarkannya.
[::]:80 bermaksud perkara yang sama untuk IPv6: mendengar pada setiap alamat IPv6, termasuk alamat awam. Banyak program mengikat (bind) di sini secara lalai, dan pada Linux, soket :: sering menerima IPv4 juga.
127.0.0.1:5432 bermaksud "mendengar pada loopback sahaja." 127.0.0.1 ialah alamat yang digunakan oleh mesin untuk berhubung dengan dirinya sendiri, dan ia tidak boleh dihalakan (routable) dari mana-mana tempat lain. Servis yang diikat di sini hanya boleh dicapai dari pelayan yang sama, tidak sekali-kali dari internet, tidak kira apa pun tetapan firewall anda. Baris Postgres di atas adalah selamat secara binaan.
Peraturan praktikalnya terhasil terus daripada perkara ini: pangkalan data, cache, atau panel pentadbir yang hanya digunakan oleh aplikasi anda sendiri harus diikat pada 127.0.0.1, bukan 0.0.0.0. Jika ia tidak pernah mendengar pada alamat awam, tiada apa yang boleh dicapai oleh penyerang.
Mendengar tidak bermakna boleh dicapai
Satu lagi perbezaan dapat mengelakkan banyak kekeliruan. Port yang terbuka pada mesin, yang bermaksud terdapat program sedang mendengar, adalah berbeza daripada port yang boleh dicapai dari luar, yang bermaksud firewall membenarkannya. Kedua-duanya mesti benar untuk klien jauh dapat menyambung. Kedua-dua kegagalan ini kelihatan berbeza dari sisi klien: sambungan yang ditolak bermakna tiada apa yang mendengar, manakala sambungan yang tergantung dan kemudian tamat masa biasanya bermakna firewall telah menggugurkan paket tersebut, yang sebenarnya adalah apa yang diberitahu oleh dua ralat SSH tersebut kepada anda.
Oleh itu, terdapat dua lapisan kawalan. Anda menentukan apa yang mendengar dengan menetapkan alamat bind bagi setiap servis. Dan anda menentukan apa yang boleh dicapai oleh dunia luar dengan firewall. Pelayan yang diurus dengan baik menggunakan kedua-duanya: servis hanya bind di tempat yang diperlukan, dan firewall menafikan segala-galanya yang tidak anda benarkan secara eksplisit. Membaca apa yang sedang mendengar dengan ss adalah langkah pertama; menentukan apa yang dibenarkan oleh firewall adalah langkah kedua, yang dibincangkan dalam asas firewall dengan UFW.
Terdapat satu perkara halus yang sering memerangkap pengguna di sini. IPv4 dan IPv6 adalah berasingan, dan firewall yang hanya meliputi IPv4 membiarkan servis [::] terbuka pada IPv6. Perangkap khusus itu mempunyai catatan tersendiri: perangkap firewall IPv6.
FAQ
Bagaimanakah cara untuk melihat port yang terbuka pada pelayan Linux saya?
Jalankan sudo ss -tlnp untuk TCP atau sudo ss -ulnp untuk UDP. Perintah tersebut menyenaraikan setiap soket yang sedang mendengar, port, alamat tempatan yang terikat dengannya, serta proses yang memilikinya. Baca lajur Local Address: 0.0.0.0 atau [::] bermaksud servis tersebut terdedah kepada rangkaian, manakala 127.0.0.1 bermaksud ia hanya mendengar pada mesin itu sendiri.
Apakah perbezaan antara 0.0.0.0 dan 127.0.0.1?
0.0.0.0 bermaksud "dengar pada semua alamat IPv4," termasuk alamat awam, supaya servis tersebut boleh dicapai dari rangkaian. 127.0.0.1 ialah loopback, iaitu alamat yang digunakan oleh mesin untuk berkomunikasi dengan dirinya sendiri, dan ia tidak boleh dihalakan dari tempat lain, jadi servis yang terikat dengannya hanya boleh dicapai secara tempatan. Ikat servis dalaman kepada 127.0.0.1 supaya ia tidak terdedah sama sekali.
Adakah saya perlu membuka port dalam firewall supaya sesuatu servis berfungsi?
Hanya untuk servis yang perlu dicapai dari mesin lain. Servis yang terikat kepada 127.0.0.1 tidak memerlukan peraturan firewall kerana tiada apa-apa dari luar yang boleh mencapainya. Servis pada 0.0.0.0 atau [::] memerlukan peraturan firewall untuk membenarkan trafik, dan secara lalai harus dinafikan sehingga anda menambah peraturan tersebut.
Apakah perbezaan antara port TCP dan port UDP?
TCP adalah berasaskan sambungan dan digunakan oleh kebanyakan servis, seperti SSH, pelayan web, dan pangkalan data. UDP adalah tanpa sambungan dan digunakan oleh DNS serta beberapa VPN. Nombor yang sama dalam TCP dan UDP adalah port yang berasingan, jadi 53/tcp dan 53/udp adalah berbeza. Apabila anda menulis peraturan firewall, anda perlu menyatakan protokolnya, contohnya 22/tcp.