Cara Tukar Port SSH di Rocky Linux dan AlmaLinux
Tukar port SSH dengan selamat tanpa terputus sambungan. Ikuti langkah konfigurasi sshd_config, kemaskini peraturan firewalld serta label port SELinux untuk elak ralat akses.
Mengapa menukar port SSH memerlukan tiga langkah di sini
Untuk menukar port SSH pada Rocky Linux, AlmaLinux, CentOS Stream atau Fedora, satu suntingan tidak mencukupi. Tiga sistem berasingan masing-masing menentukan sama ada sambungan pada port baharu itu berfungsi. firewalld menentukan sama ada paket sampai ke mesin tersebut. SELinux menentukan sama ada sshd dibenarkan untuk mengikat (bind) nombor port tersebut atau tidak. sshd_config menentukan port mana yang diminta oleh daemon. Jika langkah SELinux terlepas, daemon enggan bermula. Jika langkah firewalld terlepas, ia bermula dan mendengar, tetapi tiada sesiapa yang boleh mencapainya.
Pada Ubuntu, tugas yang sama hanya memerlukan satu suntingan dan satu mulakan semula (restart), kerana Ubuntu menggunakan AppArmor dan bukannya SELinux serta tidak menyertakan profil yang menyekat port mana yang boleh diikat oleh sshd. Jika ufw sedang berjalan di sana, anda hanya perlu menambah satu peraturan. Itulah perbezaan keseluruhannya. Keluarga RHEL menyertakan firewalld yang berjalan dan SELinux yang menguatkuasakan dasar pada pemasangan baharu, dan kedua-duanya mengambil kira nombor port.
Lakukan kerja mengikut urutan ini supaya sesi semasa anda kekal aktif sepanjang setiap langkah:
- Buka port baharu dalam firewalld, dan biarkan port 22 terbuka buat masa ini.
- Tambah label SELinux untuk port baharu tersebut dengan
semanage. - Tetapkan port dalam konfigurasi sshd.
- Mulakan semula
sshd, kemudian log masuk pada port baharu daripada terminal kedua sebelum menutup terminal pertama.
Cari konsol web pembekal anda (VNC atau bersiri) sebelum anda bermula, dan pastikan anda boleh log masuk melaluinya. Konsol tersebut adalah jalan masuk semula anda jika perubahan tersebut tidak menjadi. Perubahan port adalah salah satu sebab paling biasa penyewa terkunci keluar daripada pelayan yang baru sahaja mereka bayar.
Pertama, pasang semanage
semanage ialah alat yang menyunting tetapan polisi SELinux, dan pemasangan minimum Rocky Linux atau AlmaLinux tidak menyertakannya. Ia berada dalam policycoreutils-python-utils.
sudo dnf install -y policycoreutils-python-utilsMenjalankan arahan tersebut sebelum memasang pakej itu akan menghasilkan sudo: semanage: command not found, dan pada tahap itulah ramai pembaca membuat keputusan bahawa SELinux tidak dipasang lalu melangkau langkah tersebut. SELinux sebenarnya sudah dipasang. Hanya alat pengurusannya yang tiada. Jika sintaks dnf baharu bagi anda, setara arahan dnf dan apt memetakannya kembali kepada apa yang anda sudah ketahui.
Pilih port dan pastikan tiada proses yang menggunakannya
Mana-mana port TCP bebas antara 1024 hingga 65535 boleh digunakan. Lakukan dua semakan sebelum anda menetapkannya:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222Semakan pertama menunjukkan sama ada sesuatu proses sedang mendengar pada nombor port tersebut. Semakan kedua menunjukkan sama ada polisi SELinux telah menetapkannya kepada jenis servis yang lain. Port yang bebas tidak akan menghasilkan sebarang output daripada kedua-dua arahan tersebut. Jika polisi telah menuntut port tersebut, semanage port -a dalam langkah 2 akan gagal dengan ralat ValueError: Port tcp/2222 already defined, dan penyelesaiannya adalah dengan memilih nombor port yang lain.
2222 digunakan sebagai contoh sepanjang panduan ini. Ia juga merupakan port pertama yang dicuba oleh pengimbas selepas port 22, jadi pilihlah nombor yang kurang ketara pada pelayan sebenar.
Langkah 1: buka port dalam firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent menulis peraturan ke dalam fail zon pada cakera dan tidak mengubah firewall yang sedang berjalan. --reload memuatkan konfigurasi pada cakera ke dalam firewall yang sedang berjalan. Jika anda melangkau proses reload, peraturan tersebut wujud tetapi tidak berfungsi sehingga firewalld dimulakan semula. Ini merupakan punca paling kerap mengapa prosedur ini kelihatan gagal tanpa sebab yang jelas.
Biarkan entri perkhidmatan ssh seperti sedia ada buat masa ini. Entri tersebut memastikan port 22 kekal terbuka dan ia menjadi sandaran anda semasa melakukan ujian.
Semak juga panel kawalan pembekal anda. Banyak hos menjalankan firewall rangkaian di hadapan VPS, di luar sistem pengendalian. Oleh itu, port yang telah anda buka dalam firewalld mungkin masih disekat di peringkat hulu (upstream). Panduan asas firewalld untuk VPS merangkumi zon serta perbezaan antara runtime dan permanent jika model ini baharu bagi anda.
Langkah 2: labelkan port untuk SELinux
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a menambah tugasan port baharu. -t ssh_port_t ialah jenis yang dibawa oleh port SSH. Perintah kedua menyenaraikan semua perkara yang kini diliputi oleh ssh_port_t, supaya anda boleh mengesahkan nombor anda telah dimasukkan sebelum anda menyentuh daemon tersebut.
Mengapa SELinux menyekat port tersebut
SELinux (Security-Enhanced Linux) memberikan label kepada setiap objek dalam sistem, dan nombor port TCP juga dianggap sebagai objek. Daemon SSH berjalan dalam domain yang dipanggil sshd_t. Polisi membenarkan sshd_t untuk mengikat (bind) port TCP yang dilabelkan sebagai ssh_port_t, dan secara lalai, satu-satunya port yang mempunyai label tersebut ialah 22. Apabila anda meminta daemon untuk mengikat port 2222, kernel akan menyemak label tersebut, mencari jenis polisi generik yang diberikan kepada nombor itu, dan menolak kebenaran name_bind pada soket berkenaan.
Inilah sebabnya kegagalan ini tidak kelihatan seperti masalah firewall. Kernel menolak permintaan tersebut sebelum soket pendengar (listening socket) sempat wujud, jadi sshd melaporkan ralat dan keluar. Masalah firewall adalah sebaliknya: daemon sedang berjalan dengan lancar, namun paket data dibuang semasa dalam perjalanan masuk.
getenforce memberitahu anda mod yang sedang digunakan oleh pelayan. Pada Permissive, penafian akan direkodkan tetapi tidak dikuatkuasakan, jadi perubahan port kelihatan berfungsi tetapi akan gagal apabila seseorang menjalankan setenforce 1 atau pelayan but semula ke dalam mod penguatkuasaan (enforcing mode). Labelkan port tersebut walau apa pun modnya. Panduan asas SELinux untuk pelayan membincangkan mod, konteks dan boolean dengan lebih terperinci. Port bukanlah satu-satunya objek yang menyebabkan masalah ini; polisi yang sama akan menghalang kontena daripada membaca direktori hos yang dipasang (mounted) sehingga laluan tersebut dilabel semula. Inilah sebabnya pemasangan Docker pada Rocky Linux atau AlmaLinux memerlukan langkah SELinux yang tidak pernah disebut dalam panduan Ubuntu.
Langkah 3: tetapkan port dalam konfigurasi sshd
Pada Rocky Linux 9 dan 10, AlmaLinux 9 dan 10, serta Fedora terkini, /etc/ssh/sshd_config bermula dengan baris include, jadi tempat yang kemas untuk perubahan anda ialah fail drop-in. Kemas kini pakej kemudian tidak akan bertindih dengan suntingan anda.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tJika grep tidak menemui baris Include, yang merupakan keadaan pada Rocky Linux 8 dan imej lama yang lain, masukkan Port 2222 ke dalam /etc/ssh/sshd_config secara terus. sshd -t menghuraikan keseluruhan konfigurasi, termasuk drop-in, dan melaporkan ralat sintaks. Betulkan sebarang ralat yang dilaporkan sebelum anda memulakan semula, kerana konfigurasi yang gagal dihuraikan bermakna daemon tidak akan kembali aktif.
Port mungkin muncul lebih daripada sekali, dan sshd mendengar pada setiap port yang disenaraikan. Mengekalkan Port 22 bersama-sama Port 2222 untuk hari pertama merupakan langkah keselamatan yang mudah, selagi anda ingat untuk membuangnya.
Adakah sshd anda dimulakan oleh unit socket?
Sesetengah imej memulakan SSH melalui pengaktifan socket systemd dan bukannya sebagai servis yang berjalan secara berterusan. Apabila konfigurasi ini digunakan, systemd mengawal socket pendengar dan menyerahkan sambungan kepada sshd, jadi baris Port dalam sshd_config diabaikan sepenuhnya. Semak perkara ini sebelum anda memulakan semula apa-apa:
systemctl is-enabled sshd.socketJawapan enabled bermaksud port ditetapkan pada unit socket, bukan dalam sshd_config:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222ListenStream= kosong diperlukan. Nilai akan terkumpul merentasi fail drop-in, jadi tanpa tugasan kosong untuk mengosongkan senarai terlebih dahulu, socket akan terus mendengar pada port 22 dan juga 2222. Gunakan tetapan ini dengan sudo systemctl daemon-reload dan kemudian sudo systemctl restart sshd.socket. Jika unit tersebut dinyahdayakan atau tidak wujud pada pelayan anda, bahagian ini tidak terpakai kepada anda.
Langkah 4: mulakan semula, kemudian uji daripada terminal kedua
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdPastikan terminal ini kekal terbuka. Jangan log keluar daripadanya. Buka terminal kedua pada mesin anda sendiri dan sambung menggunakan port baharu tersebut:
ssh -p 2222 youruser@203.0.113.10Tutup sesi pertama hanya selepas log masuk kedua itu berjaya. Jika ia tidak berfungsi, anda masih mempunyai shell untuk membatalkan semua perubahan. Tabiat ini membezakan antara perubahan lima minit dengan masa yang terbuang sepanjang petang di konsol pembekal.
Adakah firewall menggugurkan paket atau SELinux menafikan akses? Cara membezakannya
Daripada komputer riba anda, kedua-dua kegagalan ini kelihatan hampir sama. Namun pada pelayan, ia adalah dua perkara yang berbeza.
- Jika
systemctl status sshdmenunjukkan unit gagal, daemon tidak pernah menerima soketnya. Ini adalah ralat konfigurasi atau penafian oleh SELinux. - Jika unit aktif dan
ss -tlnpmenunjukkan sshd terikat pada port baharu, daemon berfungsi dengan baik dan masalahnya terletak pada laluan rangkaian: firewalld, firewall berasingan penyedia, atau alamat dan port yang anda hubungi.
Bagi kes SELinux, baca rekod audit daripada meneka:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagerPenafian name_bind pada kelas tcp_socket menamakan proses dalam comm="sshd", nombor port dalam src=, dan label yang sebenarnya dibawa oleh port tersebut dalam tcontext=. Medan terakhir itulah jawapannya. Apa-apa selain daripada ssh_port_t bermakna langkah 2 tidak terpakai pada port yang anda gunakan, biasanya disebabkan kesilapan menaip nombor atau protokol yang salah. Pasang setroubleshoot-server jika anda lebih suka sealert menukarkan rekod tersebut menjadi ayat yang mudah difahami.
Mesej yang ditulis oleh sshd sendiri apabila kernel menolak pengikatan (bind) adalah seperti berikut:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.Permission denied pada port melebihi 1024, di mana tiada keistimewaan root diperlukan untuk mengikat, adalah tanda pengenalan SELinux. Address already in use dalam baris yang sama adalah kerosakan yang berbeza: proses lain sedang memegang port tersebut. Dari sisi klien, perbezaan antara connection refused dan connection timed out memisahkan dua kes rangkaian tersebut, kerana penolakan bermakna paket anda sampai ke hos tetapi tiada apa yang mendengar, manakala tamat masa (timeout) bermakna tiada respons langsung.
Tutup port 22 dan kemas kini klien anda
Setelah beberapa log masuk pada port baharu berjaya dilakukan, tutup port 22:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allBiarkan label SELinux pada port 22 seperti sedia ada. Label tersebut datang daripada polisi asas dan ia tidak memberikan sebarang akses setelah firewall berhenti membenarkan paket masuk.
Kemudian, betulkan klien anda kerana setiap alat yang menganggap port lalai digunakan kini perlu dikemas kini. Masukkan tetapan ke dalam ~/.ssh/config pada mesin anda sekali sahaja supaya anda tidak perlu menaip -p selama-lamanya:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync dan Ansible semuanya membaca fail tersebut. Tugasan sandaran, semakan pemantauan dan skrip cron yang mengekod port 22 secara statik tidak membacanya, jadi cari dan kemas kini skrip tersebut sementara perubahan ini masih segar dalam ingatan anda.
Kesan menukar port dan perkara yang tidak dicapainya
Tindakan ini mengurangkan hingar log. Pengimbas automatik menyerang port 22 secara berterusan, dan menukarnya akan membuang kebanyakan baris tersebut daripada journal, sekali gus memudahkan pemerhatian terhadap peristiwa sebenar. Ini bukanlah kawalan keselamatan. Mana-mana pengimbas yang mengimbas julat port penuh akan tetap menemui daemon anda dan membaca banner versinya. Anggap perubahan port sebagai penyelenggaraan rutin, dan letakkan perlindungan sebenar pada pengesahan berasaskan kunci sahaja dengan log masuk kata laluan dinyahaktifkan, seperti yang diterangkan langkah demi langkah dalam panduan pengukuhan SSH untuk VPS.
Segala perkara di atas berfungsi secara identik pada kedua-dua binaan semula RHEL utama, memandangkan ia dibina daripada sumber yang sama. Lihat perbandingan Rocky Linux dan AlmaLinux jika anda masih dalam proses memilih antara keduanya. Terdapat dua binaan semula yang hampir serupa untuk dipilih kerana CentOS berhenti menjadi salah satu daripadanya pada tahun 2020, satu perubahan yang diceritakan sepenuhnya dalam kisah daripada Red Hat kepada CentOS kepada Rocky dan AlmaLinux. Semak keluaran yang anda terima sebelum mengikuti mana-mana panduan lama dengan cat /etc/os-release. Panduan yang ditulis untuk Rocky Linux 8 masih mendapat kedudukan carian yang baik dan langkah semanage serta firewall-cmd di dalamnya masih tepat, namun Rocky 8 tidak mempunyai baris include sshd_config.d dan tiada unit soket yang perlu dipertimbangkan, jadi bahagian sshd dalam panduan tersebut tidak sepadan dengan pelayan semasa.
fail2ban perlu dimaklumkan tentang port baharu
fail2ban tidak terdapat dalam repositori asas. Ia datang daripada EPEL (extra packages for enterprise Linux):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldSubpakej fail2ban-firewalld membolehkan fail2ban menulis sekatan (bans) melalui firewalld, iaitu tindakan yang disyorkan pada pelayan yang menggunakan firewalld untuk mengurus set peraturan.
Jail sshd lalai menetapkan port = ssh, dan nama tersebut diselesaikan melalui /etc/services kepada 22. Selepas perubahan anda, jail tersebut memantau port yang tidak diserang oleh sesiapa, jadi ia tidak menyekat sesiapa pun sementara percubaan log masuk gagal terkumpul pada port 2222. Tetapkan port mengikut nombor dalam /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd membaca kegagalan daripada journal dan bukannya daripada /var/log/secure, yang merupakan pilihan lebih selamat pada pemasangan minimal di mana rsyslog mungkin tidak tersedia. Mulakan ia dengan sudo systemctl enable --now fail2ban dan periksa jail tersebut dengan sudo fail2ban-client status sshd. Sintaks jail adalah sama dengan yang digunakan dalam persediaan fail2ban untuk SSH pada Ubuntu 24.04. Hanya sumber pakej dan tindakan sekatan (ban action) yang berbeza.
Penyelenggaraan tampalan lebih penting daripada port
Pelayan yang menukar port SSH tetapi tidak mengemas kini tampalan keselamatan selama empat bulan berada dalam keadaan yang lebih buruk berbanding pelayan yang menggunakan port 22 tetapi melakukan kemas kini secara automatik setiap malam. Aktifkan unattended updates dalam sesi yang sama semasa anda masih menjadi root: kemas kini dnf automatik pada Rocky Linux dan AlmaLinux merangkumi pemasa serta pilihan antara memuat turun kemas kini dan memasangnya. Kemas kini yang dipasang tidak memulakan semula daemon yang sedang menjalankan kod lama, jadi menyemak apa yang masih memerlukan permulaan semula atau but semula adalah berbaloi untuk dilakukan setiap kali openssh-server atau pustaka yang dipautkan dengannya dikemas kini dalam kelompok tersebut.
FAQ
Mengapa sshd gagal bermula selepas saya menukar port pada Rocky Linux?
Hampir selalunya disebabkan oleh label port SELinux yang tiada. sshd berjalan dalam domain sshd_t yang terkawal, dan polisi hanya membenarkan ia mengikat port yang dilabel sebagai ssh_port_t, yang secara lalai hanyalah port 22. Kernel menolak pengikatan tersebut, jadi daemon keluar dan bukannya mendengar, dan journalctl -u sshd mengandungi baris dalam bentuk error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. Jalankan sudo semanage port -a -t ssh_port_t -p tcp 2222 dengan nombor port anda sendiri, kemudian mulakan semula servis tersebut. Jika semanage tidak ditemui, pasang policycoreutils-python-utils terlebih dahulu.
Adakah saya masih memerlukan semanage jika SELinux berada dalam mod permissive?
Ya. Dalam mod permissive, penafian direkodkan tetapi pengikatan tetap dibenarkan, jadi perubahan tersebut kelihatan seolah-olah berjaya. Label tersebut sebenarnya masih tiada. Sebaik sahaja seseorang menjalankan setenforce 1, atau pelayan but semula dengan SELINUX=enforcing dalam /etc/selinux/config, sshd akan berhenti bermula pada port tersebut. Menambah label hanya memerlukan satu arahan dan menghapuskan kegagalan yang mungkin muncul beberapa minggu kemudian tanpa punca yang jelas.
Port sudah dilabel dan sshd sedang berjalan, mengapa sambungan saya tamat masa?
Daemon yang sedang berjalan bermakna SELinux berpuas hati, jadi paket tersebut digugurkan dalam perjalanan masuk. Semak sudo firewall-cmd --list-ports untuk port anda, dan pastikan anda menjalankan firewall-cmd --reload selepas peraturan --permanent, kerana peraturan kekal sahaja tidak akan terus mencapai firewall yang sedang berjalan. Kemudian, semak panel kawalan hos anda untuk firewall rangkaian berasingan di hadapan VPS. Itu adalah tempat kedua pengguna sering disekat, dan tiada apa-apa di dalam sistem pengendalian yang akan menunjukkannya.
Port manakah yang patut saya gunakan selain 22?
Mana-mana port TCP bebas dari 1024 hingga 65535. Elakkan 2222 dan 22222 pada pelayan sebenar, kerana pengimbas akan mencubanya serta-merta selepas 22. Pastikan nombor tersebut bebas dengan sudo ss -tlnp, pastikan polisi SELinux belum menuntutnya dengan sudo semanage port -l, dan elakkan sebarang nombor yang ditetapkan untuk servis yang mungkin anda pasang kemudian. Nombor yang tinggi dan sukar diingat adalah memadai, kerana anda hanya akan menulisnya ke dalam ~/.ssh/config sekali sahaja dan tidak perlu menaipnya lagi.