Rocky Linux ve AlmaLinux SSH portu nasıl değiştirilir?
Rocky Linux veya AlmaLinux sistemlerde SSH portunu değiştirmek için firewalld, SELinux ve sshd_config ayarlarını doğru sırayla yapılandırmanız gerekir. Bağlantı kopmadan işlem yapın.
SSH portunu değiştirmenin neden üç adım gerektirdiği
Rocky Linux, AlmaLinux, CentOS Stream veya Fedora üzerinde SSH portunu değiştirmek için tek bir düzenleme yeterli değildir. Yeni port üzerinden bağlantının çalışıp çalışmayacağına üç ayrı sistem karar verir. firewalld, paketin makineye ulaşıp ulaşmayacağına karar verir. SELinux, sshd sürecinin o port numarasına bağlanmasına izin verilip verilmeyeceğine karar verir. sshd_config ise daemon'ın hangi portu talep edeceğini belirler. SELinux adımını atlarsanız daemon başlatılmayı reddeder. firewalld adımını atlarsanız daemon başlar, dinlemeye geçer ancak kimse ona ulaşamaz.
Ubuntu üzerinde aynı işlem tek bir düzenleme ve yeniden başlatma ile tamamlanır; çünkü Ubuntu, SELinux yerine AppArmor kullanır ve sshd'nin hangi portlara bağlanabileceğini kısıtlayan bir profil içermez. Eğer ufw çalışıyorsa, sadece bir kural eklemeniz yeterlidir. Tüm fark bundan ibarettir. RHEL ailesi, temiz kurulumda firewalld çalışır ve SELinux zorunlu (enforcing) modda gelir; her ikisi de port numaralarını denetler.
İşlemleri bu sırayla yaparsanız, mevcut oturumunuz her adımda açık kalmaya devam eder:
- firewalld üzerinde yeni portu açın, 22 numaralı portu şimdilik açık bırakın.
semanageile yeni port için SELinux etiketini ekleyin.- sshd yapılandırmasında portu ayarlayın.
sshdservisini yeniden başlatın, ardından ilk terminali kapatmadan önce ikinci bir terminalden yeni port üzerinden giriş yapmayı deneyin.
Başlamadan önce sağlayıcınızın web konsolunu (VNC veya seri bağlantı) bulun ve buradan giriş yapabildiğinizi doğrulayın. Değişiklik hatalı sonuçlanırsa, o konsol sisteme geri dönmenizi sağlayacak tek yoldur. Port değişikliği, kullanıcıların yeni kiraladıkları bir sunucuya erişimlerini kaybetmelerinin en yaygın nedenlerinden biridir.
Öncelikle semanage aracını kurun
semanage, SELinux ilke ayarlarını düzenleyen araçtır ve minimal bir Rocky Linux veya AlmaLinux kurulumunda yer almaz. Bu araç policycoreutils-python-utils paketi içerisinde bulunur.
sudo dnf install -y policycoreutils-python-utilsBu paketi kurmadan önce komutu çalıştırmak sudo: semanage: command not found hatasına yol açar; birçok kullanıcı bu noktada SELinux'un yüklü olmadığını düşünerek adımı atlar. SELinux yüklüdür, yalnızca yönetim aracı eksiktir. Eğer dnf sözdizimi sizin için yeniyse, dnf ve apt komut karşılıkları bölümü, bildiğiniz komutlarla eşleştirme yapmanızı sağlar.
Bir port seçin ve o portun kullanımda olmadığını doğrulayın
1024 ile 65535 arasındaki herhangi bir boş TCP portu kullanılabilir. Bir portu seçmeden önce şu iki kontrolü yapın:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222İlk komut, ilgili portta halihazırda bir sürecin dinleme yapıp yapmadığını gösterir. İkinci komut ise SELinux politikasının bu portu başka bir servis türüne atayıp atamadığını denetler. Boş bir port için her iki komut da çıktı üretmez. Eğer port zaten bir politika tarafından rezerve edilmişse, 2. adımdaki semanage port -a komutu ValueError: Port tcp/2222 already defined hatasıyla başarısız olur; bu durumda çözüm, farklı bir port numarası seçmektir.
Bu kılavuz boyunca örnek olarak 2222 portu kullanılmıştır. Bu port, tarayıcıların 22 numaralı porttan sonra denediği ilk porttur; bu nedenle gerçek bir sunucuda daha az tahmin edilebilir bir port seçin.
Adım 1: firewalld üzerinde portu açın
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent, kuralı disk üzerindeki bölge dosyasına yazar ve çalışan güvenlik duvarına müdahale etmez. --reload ise diskteki yapılandırmayı çalışan güvenlik duvarına yükler. Yeniden yükleme adımını atlarsanız kural var olur ancak firewalld bir sonraki kez yeniden başlatılana kadar hiçbir işlev görmez; bu durum, tüm prosedürün görünürde hiçbir neden yokken başarısız olmasının en yaygın sebeplerinden biridir.
ssh servis girdisini şimdilik olduğu gibi bırakın. Bu girdi 22 numaralı portun açık kalmasını sağlar ve test sürecinde yedek erişim noktanızdır.
Ayrıca servis sağlayıcınızın kontrol panelini de kontrol edin. Birçok barındırma sağlayıcısı, işletim sisteminin dışında, VPS'in önünde bir ağ güvenlik duvarı çalıştırır; bu nedenle firewalld içinde açtığınız bir port, üst katmanda (upstream) engelleniyor olabilir. VPS için firewalld temel rehberi, bu model size yabancıysa bölgeler ve çalışma zamanı ile kalıcı yapılandırma arasındaki farkı kapsamaktadır.
Adım 2: Portu SELinux için etiketleme
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a komutu yeni bir port ataması ekler. -t ssh_port_t, SSH portlarının taşıdığı türdür. İkinci komut, ssh_port_t kapsamındaki tüm portları listeler; böylece servisi yeniden başlatmadan önce port numarasının başarıyla eklendiğini doğrulayabilirsiniz.
SELinux neden portu tamamen engeller
SELinux (security-enhanced Linux), sistemdeki her nesneye bir etiket atar; TCP port numaraları da diğer tüm nesneler gibi birer nesnedir. SSH daemon, sshd_t adlı bir alan (domain) içerisinde kısıtlanmış olarak çalışır. Politika, sshd_t sürecinin ssh_port_t etiketine sahip TCP portlarına bağlanmasına izin verir ve varsayılan olarak bu etiketi taşıyan tek port 22'dir. Daemon'dan 2222 portuna bağlanmasını istediğinizde çekirdek etiketi kontrol eder, bu numaraya atanmış genel tip politikasını bulur ve soket üzerindeki name_bind iznini reddeder.
Bu hatanın bir güvenlik duvarı sorunu gibi görünmemesinin nedeni budur. Çekirdek, dinleyen bir soket oluşmadan önce reddetme işlemini gerçekleştirir; bu nedenle sshd hatayı raporlar ve sonlanır. Bir güvenlik duvarı sorunu ise bunun tam tersidir: daemon çalışır ve sağlıklıdır, ancak paketler içeri girerken atılır.
getenforce, sunucunun hangi modda olduğunu size bildirir. Permissive modunda bir engelleme kaydedilir ancak uygulanmaz; bu yüzden port değişikliği çalışıyor gibi görünür ancak bir gün birisi setenforce 1 komutunu çalıştırdığında veya sunucu enforcing modunda yeniden başlatıldığında sistem bozulur. Portu her iki durumda da etiketleyin. Sunucular için SELinux temel kılavuzu, modlar, bağlamlar ve boolean değerleri hakkında ayrıntılı bilgi sunar.
Adım 3: sshd yapılandırmasında portu ayarlama
Rocky Linux 9 ve 10, AlmaLinux 9 ve 10 ile güncel Fedora sürümlerinde /etc/ssh/sshd_config bir include satırı ile başlar; bu nedenle değişikliğiniz için en düzenli yer bir drop-in dosyasıdır. Bu sayede paket güncellemeleri yaptığınız düzenlemeyle çakışmaz.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tEğer grep hiçbir Include satırı bulamazsa (Rocky Linux 8 ve diğer eski imajlarda durum böyledir), Port 2222 değerini doğrudan /etc/ssh/sshd_config içine ekleyin. sshd -t, drop-in dosyaları dahil tüm yapılandırmayı ayrıştırır ve sözdizimi hatalarını raporlar. Yeniden başlatmadan önce rapor edilen tüm hataları düzeltin; çünkü ayrıştırılamayan bir yapılandırma, servisin tekrar ayağa kalkamaması anlamına gelir.
Port birden fazla kez görünebilir ve sshd listelenen her portu dinler. Port 22 değerini ilk gün boyunca Port 2222 ile birlikte tutmak, kaldırmayı unutmadığınız sürece ucuz bir güvenlik ağı sağlar.
sshd servisiniz bir socket birimi tarafından mı başlatılıyor?
Bazı imajlar SSH'ı uzun süre çalışan bir servis yerine systemd socket aktivasyonu ile başlatır. Bu yapılandırmanın olduğu durumlarda, dinleme soketinin sahibi systemd'dir ve gelen bağlantıları sshd'ye iletir; bu nedenle sshd_config dosyasındaki Port satırı tamamen göz ardı edilir. Herhangi bir yeniden başlatma işlemi yapmadan önce kontrol edin:
systemctl is-enabled sshd.socketenabled yanıtı, portun sshd_config içinde değil, socket birimi üzerinde ayarlandığı anlamına gelir:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222Burada boş ListenStream= kullanımı zorunludur. Değerler drop-in dosyaları boyunca birikir; bu nedenle listeyi önce boş bir atama ile temizlemezseniz, soket hem 22 hem de 2222 portlarını dinlemeye devam eder. Ayarı sudo systemctl daemon-reload ile uygulayın ve ardından sudo systemctl restart sshd.socket komutunu çalıştırın. Eğer birim devre dışıysa veya sunucunuzda mevcut değilse, bu bölüm sizin için geçerli değildir.
Adım 4: yeniden başlatın ve ikinci bir terminalden test edin
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdBu terminali açık tutun. Oturumu kapatmayın. Kendi makinenizde ikinci bir terminal açın ve yeni port üzerinden bağlantı kurun:
ssh -p 2222 youruser@203.0.113.10İlk oturumu yalnızca ikinci giriş başarılı olduktan sonra kapatın. Eğer bağlantı sağlanamazsa, tüm değişiklikleri geri alabileceğiniz bir kabuk (shell) hala elinizin altındadır. Bu alışkanlık, beş dakikalık bir değişikliği tüm öğleden sonranızı sağlayıcı konsolunda harcamaktan ayıran kritik bir farktır.
Güvenlik duvarı engellemesi mi yoksa SELinux reddi mi? İkisini ayırt etme
Dizüstü bilgisayarınızdan bakıldığında bu iki hata neredeyse aynı görünür. Sunucu tarafında ise hiçbir benzerlikleri yoktur.
- Eğer
systemctl status sshdbirimin başarısız olduğunu gösteriyorsa, daemon hiçbir zaman soketine ulaşamamıştır. Bu bir yapılandırma hatası veya SELinux reddidir. - Eğer birim aktifse ve
ss -tlnpsshd'nin yeni porta bağlandığını gösteriyorsa, daemon düzgün çalışıyordur ve sorun ağ yolundadır: firewalld, sağlayıcının harici güvenlik duvarı veya bağlandığınız adres ve port.
SELinux durumu için tahmin yürütmek yerine denetim kaydını okuyun:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagername_bind sınıfındaki bir tcp_socket reddi, comm="sshd" içindeki süreci, src= içindeki port numarasını ve portun halihazırda taşıdığı etiketi tcontext= içinde belirtir. Son alan cevabı içerir. ssh_port_t dışındaki herhangi bir değer, 2. adımın kullandığınız porta uygulanmadığı anlamına gelir; bu genellikle numara yazım hatası veya yanlış protokolden kaynaklanır. Kaydı bir cümleye dönüştürmesi için sealert aracını tercih ediyorsanız setroubleshoot-server paketini kurun.
Çekirdek bağlamayı reddettiğinde sshd'nin kendi yazdığı mesaj şu şekildedir:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.1024 üzerindeki bir portta Permission denied hatası, bağlama için root yetkisi gerekmediğinden, SELinux imzasını taşır. Aynı satırdaki Address already in use ise farklı bir hatadır: başka bir süreç portu tutuyordur. İstemci tarafında, bağlantı reddedildi ile bağlantı zaman aşımına uğradı arasındaki fark, iki ağ durumunu birbirinden ayırır; çünkü reddedilme, paketinizin sunucuya ulaştığı ancak dinleyen bir servis olmadığı anlamına gelirken, zaman aşımı hiçbir yanıt alınmadığı anlamına gelir.
22 numaralı portu kapatın ve istemcilerinizi güncelleyin
Yeni port üzerinden birkaç başarılı giriş yaptıktan sonra 22 numaralı portu devre dışı bırakın:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all22 numaralı port üzerindeki SELinux etiketine dokunmayın. Bu etiket temel politikadan gelir ve güvenlik duvarı paket girişini engellediğinde herhangi bir yetki sağlamaz.
Ardından istemcileri düzeltin; varsayılan portu kullanan her aracın yeni ayara ihtiyacı vardır. Sürekli -p yazmak yerine, kendi makinenizde bir kez ~/.ssh/config dosyasına şu ayarı ekleyin:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync ve Ansible bu dosyayı okur. Ancak 22 numaralı portu sabit kodlanmış (hardcode) olarak içeren yedekleme işleri, izleme kontrolleri ve cron betikleri bu dosyayı okumaz; bu nedenle değişiklik henüz tazeyken bu yapılandırmaları bulup güncelleyin.
Port değişikliğinin sağladığı ve sağlamadığı avantajlar
Bu işlem günlük kayıtlarındaki gürültüyü azaltır. Otomatik tarayıcılar 22 numaralı portu sürekli olarak yoklar; portu değiştirmek bu satırların çoğunu günlüklerden temizleyerek gerçek olayların takibini kolaylaştırır. Bu bir güvenlik önlemi değildir. Tüm port aralığını tarayan herhangi bir tarayıcı, daemon sürecinizi bulur ve sürüm bilgisini okur. Port değişikliğini bir düzenleme işlemi olarak görün; asıl korumayı ise parola ile girişi kapatıp sadece anahtar tabanlı kimlik doğrulamayı zorunlu kılarak sağlayın. VPS için SSH sıkılaştırma rehberi, bu süreci adım adım açıklamaktadır.
Yukarıdaki her şey, aynı kaynaklardan derlendikleri için her iki büyük RHEL türevinde de aynı şekilde çalışır. Henüz bir seçim yapmadıysanız Rocky Linux ve AlmaLinux karşılaştırması bölümüne göz atın. Herhangi bir eski rehberi uygulamadan önce cat /etc/os-release komutuyla hangi sürümü kullandığınızı kontrol edin. Rocky Linux 8 için yazılmış rehberler hala üst sıralarda yer almaktadır ve semanage ile firewall-cmd adımları geçerliliğini korumaktadır. Ancak Rocky 8 sürümünde sshd_config.d include satırı ve dikkate alınması gereken bir socket ünitesi bulunmadığından, bu rehberlerin sshd ile ilgili kısımları güncel sistemlerle uyumlu değildir.
fail2ban'e yeni port bildirilmelidir
fail2ban temel depolarda bulunmaz. EPEL (Enterprise Linux için ek paketler) üzerinden sağlanır:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldfail2ban-firewalld alt paketi, fail2ban'in yasaklamalarını firewalld üzerinden yazmasını sağlar; kurallar dizisinin firewalld tarafından yönetildiği bir sunucuda istenen yöntem budur.
Varsayılan sshd jail ayarı port = ssh değerini kullanır ve bu isim /etc/services üzerinden 22 portuna çözümlenir. Yaptığınız değişiklikten sonra jail, kimsenin saldırmadığı bir portu izler; bu nedenle 2222 portunda başarısız giriş denemeleri birikirken sistem kimseyi yasaklamaz. Portu /etc/fail2ban/jail.local içerisinde numara olarak belirtin:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd, hataları /var/log/secure yerine journal üzerinden okur; bu, rsyslog paketinin bulunmayabileceği minimal kurulumlarda daha güvenli bir tercihtir. Servisi sudo systemctl enable --now fail2ban ile başlatın ve jail durumunu sudo fail2ban-client status sshd ile inceleyin. Jail sözdizimi, Ubuntu 24.04 üzerinde SSH için fail2ban kurulumu ile aynıdır. Yalnızca paket kaynağı ve yasaklama eylemi farklılık gösterir.
Porttan ziyade yama yönetimi önemlidir
SSH portu değiştirilmiş ancak dört aydır güvenlik güncellemeleri uygulanmamış bir sunucu, 22 numaralı portta çalışan ve her gece kendini güncelleyen bir sunucudan daha güvensiz durumdadır. root yetkisine sahipken aynı oturum içerisinde unattended-upgrades özelliğini etkinleştirin: Rocky Linux ve AlmaLinux üzerinde otomatik dnf güncellemeleri rehberi, zamanlayıcı ayarlarını ve güncellemelerin indirilmesi ile uygulanması arasındaki seçenekleri açıklamaktadır.
FAQ
Rocky Linux üzerinde port değişikliği yaptıktan sonra sshd neden başlatılamıyor?
Bunun nedeni neredeyse her zaman eksik olan SELinux port etiketidir. sshd, sshd_t etki alanı içinde kısıtlı olarak çalışır ve politika, servisin yalnızca ssh_port_t olarak etiketlenmiş portlara bağlanmasına izin verir; bu da varsayılan olarak sadece 22 numaralı porttur. Çekirdek bağlanma isteğini reddettiği için daemon dinleme yapamaz ve sonlanır; journalctl -u sshd üzerinde error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. biçiminde bir satır oluşur. Kendi port numaranızla sudo semanage port -a -t ssh_port_t -p tcp 2222 komutunu çalıştırın ve ardından servisi yeniden başlatın. Eğer semanage komutu bulunamazsa, önce policycoreutils-python-utils paketini kurun.
SELinux permissive moddayken semanage kullanmam gerekir mi?
Evet. Permissive modda erişim engeli kaydedilir ancak bağlanmaya yine de izin verilir; bu nedenle değişiklik çalışıyormuş gibi görünür. Ancak etiket hala eksiktir. Herhangi biri setenforce 1 komutunu çalıştırdığında veya sunucu /etc/selinux/config içinde SELINUX=enforcing ayarıyla yeniden başlatıldığında, sshd o portta başlamayı durdurur. Etiketi eklemek tek bir komut gerektirir ve haftalar sonra hiçbir belirgin neden olmaksızın ortaya çıkacak bir hatayı önler.
Port etiketli ve sshd çalışıyor, bağlantım neden zaman aşımına uğruyor?
Daemon çalışıyorsa SELinux tarafında bir sorun yoktur; paket yolda düşürülüyordur. Portunuz için sudo firewall-cmd --list-ports çıktısını kontrol edin ve --permanent kuralından sonra firewall-cmd --reload komutunu çalıştırdığınızdan emin olun; çünkü kalıcı bir kural, çalışmakta olan güvenlik duvarına kendiliğinden yansımaz. Ardından, VPS'inizin önündeki ağ tabanlı güvenlik duvarı için sunucu panelinizi kontrol edin. İnsanların engellendiği ikinci yer burasıdır ve işletim sistemi içindeki hiçbir araç bunu göstermez.
22 numaralı port yerine hangisini kullanmalıyım?
1024 ile 65535 arasındaki boş herhangi bir TCP portunu kullanabilirsiniz. Gerçek bir sunucuda 2222 ve 22222 portlarından kaçının, çünkü tarayıcılar 22'den hemen sonra bunları dener. Numaranın boş olduğunu sudo ss -tlnp ile doğrulayın, SELinux politikasının onu zaten rezerve etmediğinden sudo semanage port -l ile emin olun ve daha sonra kurabileceğiniz bir servise atanmış portlardan kaçının. Yüksek ve akılda kalıcı olmayan bir numara seçmek uygundur, çünkü bunu bir kez ~/.ssh/config içine yazacak ve bir daha asla yazmayacaksınız.