Cara Mengubah Port SSH dengan SELinux dan firewalld
Pelajari urutan aman mengubah port SSH di Rocky Linux, AlmaLinux, CentOS Stream, atau Fedora dengan firewalld, label port SELinux, dan sshd_config.
Mengapa perubahan port SSH memerlukan tiga langkah di sini
Untuk mengubah port SSH pada Rocky Linux, AlmaLinux, CentOS Stream, atau Fedora, satu perubahan saja tidak cukup. Tiga sistem terpisah menentukan apakah koneksi pada port baru dapat berfungsi. firewalld menentukan apakah paket dapat mencapai mesin. SELinux menentukan apakah sshd diizinkan melakukan bind ke nomor port tersebut. sshd_config menentukan port yang diminta daemon. Jika langkah SELinux terlewat, daemon menolak untuk start. Jika langkah firewalld terlewat, daemon tetap start dan listening, tetapi tidak ada yang dapat menjangkaunya.
Di Ubuntu, pekerjaan yang sama hanya memerlukan satu perubahan dan restart karena Ubuntu menggunakan AppArmor, bukan SELinux, serta tidak menyediakan profile yang membatasi port tempat sshd boleh melakukan bind. Jika ufw berjalan di sana, tambahkan satu rule. Hanya itu perbedaannya. RHEL family menyediakan firewalld dalam keadaan berjalan dan SELinux dalam mode enforcing sejak instalasi baru, dan keduanya memperhatikan nomor port.
Lakukan langkah-langkah berikut dalam urutan ini agar session saat ini tetap aktif selama seluruh proses:
- Buka port baru di firewalld, tetapi biarkan port 22 tetap terbuka untuk sementara.
- Tambahkan label SELinux untuk port baru dengan
semanage. - Atur port dalam konfigurasi sshd.
- Restart
sshd, lalu login menggunakan port baru dari terminal kedua sebelum menutup terminal pertama.
Temukan web console milik provider Anda (VNC atau serial) sebelum memulai, lalu pastikan Anda dapat login melalui console tersebut. Console itu adalah akses pemulihan jika perubahan gagal. Perubahan port merupakan salah satu alasan paling umum tenant terkunci dari server yang baru mereka bayar.
Dapatkan semanage terlebih dahulu
semanage adalah alat untuk mengedit pengaturan kebijakan SELinux. Instalasi minimal Rocky Linux atau AlmaLinux tidak menyertakannya. Alat ini terdapat dalam policycoreutils-python-utils.
sudo dnf install -y policycoreutils-python-utilsMenjalankan perintah tersebut sebelum menginstal paket itu menghasilkan sudo: semanage: command not found. Pada tahap ini, banyak pembaca mengira SELinux belum diinstal lalu melewati langkah ini. SELinux sudah diinstal. Hanya alat pengelolaannya yang belum tersedia. Jika sintaks dnf masih baru bagi Anda, padanan perintah dnf dan apt dapat mengaitkannya dengan perintah yang sudah Anda kenal.
Pilih port dan periksa apakah port tersebut sudah digunakan
Port TCP bebas apa pun dari 1024 hingga 65535 dapat digunakan. Lakukan dua pemeriksaan sebelum menetapkannya:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222Pemeriksaan pertama menunjukkan apakah suatu proses sudah mendengarkan pada nomor tersebut. Pemeriksaan kedua menunjukkan apakah kebijakan SELinux sudah menetapkan port tersebut ke tipe layanan lain. Port yang bebas tidak menghasilkan output dari kedua pemeriksaan. Jika kebijakan sudah mengklaim port tersebut, semanage port -a pada langkah 2 gagal dengan ValueError: Port tcp/2222 already defined, dan solusinya adalah memilih nomor lain.
2222 digunakan sebagai contoh di seluruh panduan ini. Port tersebut juga menjadi port pertama yang dicoba pemindai setelah 22, jadi pilih port yang kurang mudah ditebak pada server sebenarnya.
Langkah 1: buka port di firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent menulis aturan ke file zone pada disk dan tidak mengubah firewall yang sedang berjalan. --reload memuat konfigurasi pada disk ke firewall yang sedang berjalan. Jika reload dilewati, aturan tersebut ada tetapi tidak berfungsi sampai firewalld dijalankan ulang. Ini adalah salah satu penyebab paling umum prosedur ini tampak gagal tanpa alasan yang jelas.
Untuk saat ini, jangan ubah entri service ssh. Entri tersebut menjaga port 22 tetap terbuka dan menjadi jalur cadangan selama pengujian.
Periksa juga control panel provider Anda. Banyak host menjalankan network firewall di depan VPS, di luar sistem operasi. Karena itu, port yang sudah dibuka di firewalld masih dapat dibuang oleh firewall upstream. Panduan dasar firewalld untuk VPS menjelaskan zone serta perbedaan antara konfigurasi runtime dan permanent jika model ini masih baru bagi Anda.
Langkah 2: beri label pada port untuk SELinux
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a menambahkan penetapan port baru. -t ssh_port_t adalah tipe yang digunakan oleh port SSH. Perintah kedua menampilkan semua port yang kini tercakup oleh ssh_port_t, sehingga Anda dapat memastikan nomor tersebut sudah ditambahkan sebelum mengubah daemon.
Mengapa SELinux memblokir port
SELinux (security-enhanced Linux) memberikan label kepada setiap objek dalam sistem, dan nomor port TCP juga merupakan objek seperti lainnya. Daemon SSH berjalan dalam domain terbatas bernama sshd_t. Kebijakan mengizinkan sshd_t mengikat port TCP berlabel ssh_port_t. Secara default, hanya port 22 yang memiliki label tersebut. Jika daemon diminta mengikat port 2222, kernel memeriksa labelnya, menemukan tipe generik yang ditetapkan kebijakan untuk nomor tersebut, lalu menolak izin name_bind pada socket.
Itulah sebabnya kegagalan ini tidak tampak seperti masalah firewall. Kernel menolak permintaan sebelum listening socket dibuat, sehingga sshd melaporkan error dan keluar. Masalah firewall adalah kebalikannya: daemon berjalan dengan baik, tetapi paket dibuang saat masuk.
getenforce menunjukkan mode yang digunakan oleh sistem. Dalam Permissive, penolakan dicatat tetapi tidak diberlakukan. Akibatnya, perubahan port tampak berhasil, lalu gagal ketika seseorang menjalankan setenforce 1 atau sistem melakukan reboot ke mode enforcing. Tetap beri label pada port dalam kedua kondisi tersebut. Panduan dasar SELinux untuk server menjelaskan mode, context, dan boolean secara menyeluruh.
Langkah 3: tetapkan port dalam konfigurasi sshd
Pada Rocky Linux 9 dan 10, AlmaLinux 9 dan 10, serta Fedora versi terbaru, /etc/ssh/sshd_config diawali dengan baris include. Karena itu, tempat yang rapi untuk perubahan Anda adalah file drop-in. Pembaruan paket tidak akan menimpa perubahan tersebut.
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 menemukan baris Include, seperti pada Rocky Linux 8 dan image lama lainnya, masukkan Port 2222 langsung ke /etc/ssh/sshd_config. sshd -t mem-parsing seluruh konfigurasi, termasuk drop-in, dan melaporkan error sintaks. Perbaiki semua error yang dilaporkan sebelum melakukan restart, karena konfigurasi yang gagal diuraikan menyebabkan daemon tidak dapat berjalan kembali.
Port dapat muncul lebih dari sekali, dan sshd akan mendengarkan semua port yang tercantum. Mempertahankan Port 22 bersama Port 2222 selama hari pertama merupakan langkah pengamanan sederhana, selama Anda ingat untuk menghapusnya.
Apakah sshd dijalankan oleh unit socket?
Beberapa image memulai SSH melalui aktivasi socket systemd, bukan sebagai service yang berjalan terus-menerus. Dalam konfigurasi tersebut, systemd mengelola socket yang listening dan meneruskan koneksi ke sshd. Karena itu, baris Port dalam sshd_config diabaikan sepenuhnya. Periksa hal ini sebelum me-restart apa pun:
systemctl is-enabled sshd.socketJawaban enabled berarti port ditetapkan pada unit socket, bukan dalam sshd_config:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222ListenStream= tanpa nilai diperlukan. Nilai terakumulasi di seluruh drop-in. Tanpa assignment kosong untuk menghapus daftar terlebih dahulu, socket tetap listening pada 22 dan 2222. Terapkan perubahan dengan sudo systemctl daemon-reload, lalu sudo systemctl restart sshd.socket. Jika unit tersebut dinonaktifkan atau tidak ada di server Anda, bagian ini tidak berlaku.
Langkah 4: mulai ulang, lalu lakukan pengujian dari terminal kedua
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdBiarkan terminal ini tetap terbuka. Jangan keluar dari sesi ini. Buka terminal kedua di mesin Anda, lalu sambungkan melalui port baru:
ssh -p 2222 youruser@203.0.113.10Tutup sesi pertama hanya setelah login kedua berhasil. Jika login tersebut gagal, Anda masih memiliki shell untuk membatalkan semua perubahan. Kebiasaan ini membedakan perubahan yang selesai dalam lima menit dari pekerjaan berjam-jam melalui konsol penyedia.
Firewall drop atau penolakan SELinux? Cara membedakannya
Dari laptop, kedua kegagalan tersebut terlihat hampir sama. Di server, keduanya terlihat sangat berbeda.
- Jika
systemctl status sshdmenampilkan unit gagal, daemon tidak pernah mendapatkan socket-nya. Ini merupakan kesalahan konfigurasi atau penolakan SELinux. - Jika unit aktif dan
ss -tlnpmenampilkan sshd terikat pada port baru, daemon tidak bermasalah. Masalahnya ada pada jalur jaringan: firewalld, firewall terpisah milik provider, atau alamat dan port yang Anda gunakan.
Untuk kasus SELinux, baca catatan audit dan jangan menebak:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagerPenolakan name_bind pada class tcp_socket mencantumkan proses dalam comm="sshd", nomor port dalam src=, dan label yang sebenarnya digunakan port dalam tcontext=. Field terakhir itulah jawabannya. Nilai selain ssh_port_t berarti langkah 2 tidak diterapkan pada port yang Anda gunakan, biasanya karena nomor salah ketik atau protokol yang salah. Instal setroubleshoot-server jika Anda ingin sealert mengubah catatan tersebut menjadi kalimat.
Pesan yang ditulis sshd ketika kernel menolak bind terlihat seperti ini:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.Permission denied pada port di atas 1024, yang tidak memerlukan hak akses root untuk bind, merupakan tanda SELinux. Address already in use pada baris yang sama menunjukkan masalah yang berbeda: proses lain sedang menggunakan port tersebut. Dari sisi client, perbedaan antara connection refused dan connection timed out membedakan kedua kasus jaringan tersebut, karena penolakan berarti paket Anda telah mencapai host dan tidak ada yang sedang listening, sedangkan timeout berarti tidak ada respons sama sekali.
Tutup port 22 dan perbarui klien
Setelah beberapa login melalui port baru berhasil, hapus akses ke port 22:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allBiarkan label SELinux pada port 22 apa adanya. Label tersebut berasal dari kebijakan dasar dan tidak memberikan akses apa pun setelah firewall berhenti menerima paket yang masuk.
Kemudian perbaiki klien karena setiap alat yang mengasumsikan port default kini perlu diberi informasi port baru. Simpan konfigurasi tersebut di ~/.ssh/config pada mesin Anda sekali saja, sehingga Anda tidak perlu terus-menerus mengetik -p:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync, dan Ansible semuanya membaca file tersebut. Tugas pencadangan, pemeriksaan pemantauan, dan skrip cron yang menetapkan port 22 secara langsung tidak membacanya. Karena itu, cari dan perbarui semuanya selagi perubahan ini masih Anda ingat.
Dampak perubahan port dan hal-hal yang tidak diberikannya
Perubahan ini mengurangi kebisingan pada log. Pemindai otomatis terus-menerus membanjiri port 22, dan memindahkannya dari port tersebut menghapus sebagian besar baris itu dari journal sehingga kejadian yang sebenarnya lebih mudah terlihat. Perubahan ini bukan kontrol keamanan. Pemindai yang memeriksa seluruh rentang port tetap dapat menemukan daemon Anda dan membaca banner versinya. Perlakukan perubahan port sebagai pemeliharaan, lalu terapkan perlindungan sebenarnya melalui autentikasi yang hanya menggunakan key dengan login menggunakan password dinonaktifkan. Panduan hardening SSH untuk VPS menjelaskan langkah-langkahnya secara berurutan.
Semua hal di atas bekerja secara identik pada kedua rebuild RHEL utama karena keduanya dibuat dari source yang sama. Lihat Perbandingan Rocky Linux dan AlmaLinux jika Anda masih memilih di antara keduanya. Periksa release yang benar-benar diberikan kepada Anda sebelum mengikuti panduan lama apa pun, menggunakan cat /etc/os-release. Panduan yang ditulis untuk Rocky Linux 8 masih memiliki peringkat yang baik, dan langkah semanage serta firewall-cmd di dalamnya tetap benar. Namun, Rocky 8 tidak memiliki baris include sshd_config.d dan tidak memiliki socket unit yang perlu dipertimbangkan, sehingga bagian sshd dari panduan tersebut tidak sesuai dengan server saat ini.
fail2ban harus diberi tahu tentang port baru
fail2ban tidak tersedia di repositori dasar. Paket ini berasal dari EPEL (paket tambahan untuk Enterprise Linux):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldSubpaket fail2ban-firewalld membuat fail2ban menulis aturan pemblokirannya melalui firewalld. Ini yang diperlukan pada server yang aturan firewall-nya dikelola oleh firewalld.
Jail bawaan sshd menetapkan port = ssh. Nama tersebut diterjemahkan oleh /etc/services menjadi 22. Setelah perubahan Anda, jail memantau port yang tidak menjadi sasaran serangan. Akibatnya, tidak ada alamat yang diblokir, sementara kegagalan login terus bertambah pada 2222. Tetapkan port berdasarkan nomor di /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd membaca kegagalan dari journal, bukan dari /var/log/secure. Ini lebih aman pada instalasi minimal karena rsyslog mungkin tidak tersedia. Jalankan fail2ban dengan sudo systemctl enable --now fail2ban, lalu periksa jail menggunakan sudo fail2ban-client status sshd. Sintaks jail sama dengan yang digunakan dalam konfigurasi fail2ban untuk SSH di Ubuntu 24.04. Perbedaannya hanya pada sumber paket dan tindakan pemblokiran.
Patch lebih penting daripada port
Server dengan port SSH yang dipindahkan dan pembaruan keamanan yang belum diterapkan selama empat bulan berada dalam kondisi yang lebih buruk daripada server yang tetap menggunakan port 22 tetapi memasang patch setiap malam. Aktifkan pembaruan tanpa pengawasan dalam sesi yang sama saat Anda sudah menjadi root: pembaruan dnf otomatis pada Rocky Linux dan AlmaLinux membahas timer serta pilihan antara mengunduh pembaruan dan menerapkannya.
FAQ
Mengapa sshd gagal dimulai setelah saya mengubah port di Rocky Linux?
Hampir selalu penyebabnya adalah label port SELinux yang belum ada. sshd berjalan dalam domain sshd_t yang dibatasi, dan kebijakan hanya mengizinkannya mengikat port berlabel ssh_port_t, yang secara default hanya port 22. Kernel menolak pengikatan tersebut, sehingga daemon keluar dan tidak mulai listening, sedangkan journalctl -u sshd berisi baris dengan 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 menggunakan nomor port Anda sendiri, lalu mulai ulang service. Jika semanage tidak ditemukan, instal policycoreutils-python-utils terlebih dahulu.
Apakah saya masih memerlukan semanage jika SELinux berada dalam mode permissive?
Ya. Dalam mode permissive, penolakan dicatat dan pengikatan tetap diizinkan, sehingga perubahan tampak berhasil. Label tersebut tetap belum ada. Saat seseorang menjalankan setenforce 1, atau server melakukan boot dengan SELINUX=enforcing di /etc/selinux/config, sshd berhenti berjalan pada port tersebut. Menambahkan label hanya memerlukan satu perintah dan menghilangkan kegagalan yang jika tidak, dapat muncul beberapa minggu kemudian tanpa penyebab yang jelas.
Port sudah diberi label dan sshd sedang berjalan, jadi mengapa koneksi saya mengalami timeout?
Daemon yang berjalan berarti SELinux tidak memblokirnya. Jadi, paket kemungkinan dibuang dalam perjalanan masuk. Periksa sudo firewall-cmd --list-ports untuk port Anda, dan pastikan Anda menjalankan firewall-cmd --reload setelah aturan --permanent, karena aturan permanen saja tidak pernah diterapkan ke firewall yang sedang berjalan. Kemudian periksa panel kontrol host Anda untuk firewall jaringan terpisah yang berada di depan VPS. Di situlah pemblokiran kedua sering terjadi, dan tidak ada yang dapat menunjukkannya dari dalam sistem operasi.
Port mana yang sebaiknya saya gunakan sebagai pengganti 22?
Gunakan port TCP bebas apa pun dari 1024 hingga 65535. Hindari 2222 dan 22222 pada server produksi, karena pemindai segera mencobanya setelah port 22. Pastikan nomor tersebut belum digunakan dengan sudo ss -tlnp, pastikan kebijakan SELinux belum mengklaimnya dengan sudo semanage port -l, dan jangan gunakan port yang ditetapkan untuk service yang mungkin Anda instal nanti. Nomor port yang tinggi dan sulit diingat tidak masalah, karena Anda akan menuliskannya satu kali ke dalam ~/.ssh/config dan tidak perlu mengetikkannya lagi.