SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor

Cara Tukar Port SSH di Rocky Linux dan AlmaLinux

Tukar port SSH dengan selamat tanpa terputus sambungan. Panduan ini merangkumi konfigurasi sshd_config, menambah port pada firewalld, dan melabel port baharu untuk SELinux.

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 membekalkan 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 membekalkan firewalld yang sedang berjalan dan SELinux dalam mod enforcing pada pemasangan baharu, dan kedua-duanya mengambil kira nombor port.

Lakukan kerja mengikut urutan ini supaya sesi semasa anda kekal aktif sepanjang setiap langkah:

  1. Buka port baharu dalam firewalld, dan biarkan port 22 terbuka buat masa ini.
  2. Tambah label SELinux untuk port baharu tersebut dengan semanage.
  3. Tetapkan port dalam konfigurasi sshd.
  4. Mulakan semula sshd, kemudian log masuk pada port baharu daripada terminal kedua sebelum menutup terminal pertama.
Cari konsol web pembekal anda (VNC atau serial) sebelum anda bermula, dan pastikan anda boleh log masuk melaluinya. Konsol tersebut adalah jalan keluar anda jika perubahan itu 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-utils

Menjalankan arahan tersebut sebelum memasang pakej itu akan menghasilkan sudo: semanage: command not found, dan pada tahap inilah ramai pembaca membuat keputusan bahawa SELinux tidak dipasang lalu melangkau langkah tersebut. SELinux sebenarnya sudah dipasang. Hanya alat pengurusan 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 2222

Semakan pertama menunjukkan sama ada sesuatu proses sedang mendengar pada nombor tersebut. Semakan kedua menunjukkan sama ada polisi SELinux telah menetapkannya kepada jenis servis lain. Port yang bebas tidak akan memaparkan 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 lain.

2222 digunakan sebagai contoh di sepanjang panduan ini. Ia juga merupakan port pertama yang akan 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 muat semula (reload), peraturan tersebut wujud tetapi tidak berfungsi sehingga firewalld dimulakan semula. Ini merupakan salah satu punca paling lazim mengapa keseluruhan prosedur ini kelihatan gagal tanpa sebab yang jelas.

Biarkan entri servis ssh seperti sedia ada buat masa ini. Entri tersebut memastikan port 22 kekal terbuka, dan ia merupakan langkah keselamatan sandaran anda semasa melakukan ujian.

Semak juga panel kawalan pembekal anda. Banyak hos menjalankan firewall rangkaian di hadapan VPS, di luar sistem pengendalian, jadi port yang anda buka dalam firewalld masih boleh 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 dilindungi 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 dikawal 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 tersebut.

Itulah 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 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 menerangkan dengan terperinci mengenai mod, konteks dan boolean.

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 adalah dalam fail drop-in. Kemas kini pakej kemudiannya 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 -t

Jika grep tidak menemui baris Include, yang merupakan keadaan pada Rocky Linux 8 dan imej lama 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 dapat dihidupkan semula.

Port mungkin muncul lebih daripada sekali, dan sshd akan mendengar pada setiap port yang disenaraikan. Mengekalkan Port 22 bersama Port 2222 untuk hari pertama merupakan langkah keselamatan yang mudah, asalkan 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. Periksa perkara ini sebelum anda memulakan semula apa-apa:

systemctl is-enabled sshd.socket

Jawapan enabled bermakna port ditetapkan pada unit socket, bukan dalam sshd_config:

sudo systemctl edit sshd.socket
[Socket]
ListenStream=
ListenStream=2222

ListenStream= 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 sshd

Pastikan 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.10

Tutup sesi pertama hanya selepas log masuk kedua itu berjaya. Jika ia tidak berfungsi, anda masih mempunyai shell yang membolehkan anda membatalkan semua perubahan. Tabiat ini merupakan perbezaan antara perubahan lima minit dengan menghabiskan sepanjang petang pada konsol pembekal.

Adakah firewall menggugurkan paket atau SELinux menghalang akses? Cara membezakannya

Dari komputer riba anda, kedua-dua kegagalan ini kelihatan hampir sama. Pada pelayan, kedua-duanya sangat berbeza.

  • Jika systemctl status sshd menunjukkan unit gagal, daemon tidak pernah mendapat soketnya. Ini adalah ralat konfigurasi atau penafian SELinux.
  • Jika unit aktif dan ss -tlnp menunjukkan sshd terikat pada port baharu, daemon berfungsi dengan baik dan masalahnya terletak pada laluan rangkaian: firewalld, firewall berasingan pembekal, 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-pager

Penafian 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 itu adalah 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.

Mesej yang ditulis oleh sshd sendiri apabila kernel menolak pengikatan (bind) adalah seperti ini:

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 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 dan tiada apa yang mendengar, manakala tamat masa (timeout) bermakna tiada apa yang menjawab 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-all

Biarkan label SELinux pada port 22 seperti sedia ada. Label tersebut datang daripada polisi asas dan ia tidak memberikan sebarang akses sebaik sahaja 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 youruser

scp, sftp, rsync dan Ansible semuanya membaca fail tersebut. Kerja sandaran (backup), semakan pemantauan dan skrip cron yang mengekod port 22 secara statik tidak akan membacanya, jadi cari dan kemas kini fail-fail tersebut sementara perubahan ini masih segar dalam ingatan anda.

Kesan menukar port dan perkara yang tidak dicapainya

Tindakan ini mengurangkan hingar log. Pengimbas automatik sentiasa menyerang port 22 secara berterusan, dan menukarnya akan membuang kebanyakan baris tersebut daripada journal, yang menjadikan peristiwa sebenar lebih mudah dilihat. Ini bukanlah kawalan keselamatan. Mana-mana pengimbas yang mengimbas julat port penuh akan menemui daemon anda dan membaca banner versinya walau apa pun. Anggap penukaran port sebagai kerja penyelenggaraan, dan letakkan perlindungan sebenar pada pengesahan berasaskan kunci sahaja dengan log masuk kata laluan dimatikan, 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, kerana ia dibina daripada sumber yang sama. Lihat perbandingan Rocky Linux dan AlmaLinux jika anda masih membuat pilihan antara keduanya. Semak keluaran yang sebenarnya diberikan kepada anda 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 betul, 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-firewalld

Subpakej fail2ban-firewalld membolehkan fail2ban menulis sekatan (bans) melalui firewalld, iaitu tindakan yang disyorkan pada pelayan yang menggunakan firewalld untuk mengurus set peraturan.

Jail lalai sshd menetapkan port = ssh, dan nama tersebut diselesaikan melalui /etc/services kepada 22. Selepas anda membuat perubahan, jail tersebut akan memantau port yang tidak diserang oleh sesiapa, jadi ia tidak akan menyekat sesiapa pun sementara percubaan log masuk yang gagal terus terkumpul pada port 2222. Tetapkan port mengikut nombor dalam /etc/fail2ban/jail.local:

[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600

backend = 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 penyediaan fail2ban untuk SSH pada Ubuntu 24.04. Hanya sumber pakej dan tindakan sekatan (ban action) yang berbeza.

Proses menampal (patching) lebih penting daripada port

Pelayan yang menukar port SSH tetapi tidak menggunakan kemas kini keselamatan selama empat bulan berada dalam keadaan yang lebih buruk berbanding pelayan yang menggunakan port 22 tetapi melakukan proses menampal 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 melaksanakannya.

FAQ

Mengapakah 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 sahaja. Kernel menolak pengikatan tersebut, jadi daemon keluar dan bukannya mendengar, dan journalctl -u sshd memaparkan 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 itu kelihatan seolah-olah berjaya. Label tersebut sebenarnya masih tiada. Sebaik sahaja sesiapa 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 timbul beberapa minggu kemudian tanpa punca yang jelas.

Port sudah dilabel dan sshd sedang berjalan, jadi mengapakah sambungan saya tamat masa (time out)?

Daemon yang sedang berjalan bermakna SELinux sudah berpuas hati, jadi paket tersebut digugurkan semasa 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 (permanent) sahaja tidak akan sampai ke firewall yang sedang berjalan. Kemudian, semak panel kawalan hos anda untuk firewall rangkaian berasingan di hadapan VPS. Itu adalah tempat kedua di mana 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 yang bebas dari 1024 hingga 65535. Elakkan 2222 dan 22222 pada pelayan sebenar, kerana pengimbas akan mencubanya serta-merta selepas port 22. Pastikan nombor tersebut bebas dengan sudo ss -tlnp, pastikan polisi SELinux belum menuntutnya dengan sudo semanage port -l, dan elakkan mana-mana port yang diberikan kepada 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.