SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-09-04

Rocky Linux ve AlmaLinux SSH portu değiştirme rehberi

Rocky Linux veya AlmaLinux üzerinde SSH portunu değiştirirken firewalld, SELinux ve sshd_config ayarlarını sırasıyla yaparak bağlantı kopma sorununu nasıl önleyeceğinizi öğrenin.

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 üzerindeki bir 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şlamayı reddeder. firewalld adımını atlarsanız servis başlar, portu dinler ancak kimse erişemez.

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. Aradaki tüm fark budur. 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:

  1. firewalld üzerinde yeni portu açın, 22 numaralı portu şimdilik açık bırakın.
  2. semanage kullanarak yeni port için SELinux etiketini ekleyin.
  3. sshd yapılandırmasında portu ayarlayın.
  4. sshd servisini 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 giriş yapabildiğinizi doğrulayın. Değişiklik başarısız olursa, 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-utils

Bu 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 kurulu olmadığını düşünerek adımı atlar. SELinux kurulu durumdadı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ıza yardımcı olacaktır.

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 herhangi bir çıktı döndürmez. Eğer port halihazırda 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, gerçek bir sunucuda tarayıcıların 22 numaralı porttan sonra denediği ilk porttur; bu nedenle daha az belirgin bir port seçmeniz önerilir.

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, 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 acil durum çıkış 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 üzerinde açtığınız bir port, üst katmanda (upstream) engellenmeye devam edebilir. VPS için firewalld temel rehberi, bu model size yeniyse bölgeleri ve çalışma zamanı ile kalıcı yapılandırma arasındaki farkı açıklar.

Adım 2: Portu SELinux için etiketleyin

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 öğeleri listeler; böylece daemon üzerinde işlem yapmadan önce port numaranızın eklendiğini doğrulayabilirsiniz.

SELinux neden portu engeller

SELinux (Security-Enhanced Linux), sistemdeki her nesneye bir etiket atar; TCP port numaraları da diğerleri gibi birer nesnedir. SSH daemon, sshd_t adlı bir alan içinde 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. Güvenlik duvarı sorunu ise bunun tam tersidir: daemon çalışır ve sağlıklıdır, ancak paketler giriş yolunda 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 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ğerlerini ayrıntılı olarak ele alır. Portlar, bu durumla karşılaştığınız tek nesne değildir; aynı politika, bir container'ın mount edilmiş bir ana makine dizinini okumasını, o yol yeniden etiketlenene kadar engeller. Bu nedenle Rocky Linux veya AlmaLinux üzerine Docker kurulumu rehberleri, Ubuntu rehberlerinde asla bahsedilmeyen bir SELinux adımı içerir.

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. Böylece paket güncellemeleri yaptığınız düzenleme ile çakışmaz.

grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t

Eğ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ı bildirir. Yeniden başlatmadan önce bildirilen 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 düşük maliyetli bir güvenlik ağı sağlar.

sshd servisiniz bir socket ünitesi tarafından mı başlatılıyor?

Bazı imajlar SSH'ı sürekli çalışan bir servis yerine systemd socket aktivasyonu ile başlatır. Bu yapının kurulduğu durumlarda, dinleme soketini systemd yönetir ve bağlantıları sshd'ye aktarır; bu nedenle sshd_config dosyasındaki Port satırı tamamen göz ardı edilir. Herhangi bir yeniden başlatma işlemi yapmadan önce şu kontrolü gerçekleştirin:

systemctl is-enabled sshd.socket

enabled yanıtı, portun sshd_config içinde değil, socket ünitesi üzerinde tanımlandığı anlamına gelir:

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

Burada boş ListenStream= kullanımı zorunludur. Değerler drop-in dosyaları arasında birikir; bu nedenle listeyi temizlemek için boş bir atama yapılmazsa, socket hem 22 hem de 2222 numaralı portları 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 ilgili ünite sunucunuzda devre dışıysa veya 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 sshd

Bu 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ı çalışmazsa, yaptığınız değişiklikleri geri alabileceğiniz bir kabuk oturumuna sahip olmaya devam edersiniz. Bu alışkanlık, beş dakikalık bir değişiklik ile sağlayıcı konsolunda geçirilecek bir öğleden sonra arasındaki farkı yaratır.

Firewall engellemesi mi yoksa SELinux reddi mi? Nasıl ayırt edilir?

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 sshd birimin başarısız olduğunu gösteriyorsa, daemon soketine hiçbir zaman ulaşamamıştır. Bu bir yapılandırma hatası veya SELinux reddidir.
  • Eğer birim aktifse ve ss -tlnp sshd'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-pager

name_bind reddi, tcp_socket sınıfında, comm="sshd" içindeki süreci, src= içindeki port numarasını ve tcontext= içinde portun halihazırda taşıdığı etiketi 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ış protokoldür. Kaydı bir cümleye dönüştürmek için sealert kullanmak isterseniz 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, bağlama için root yetkisi gerekmeyen durumlarda Permission denied, 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ından bakıldığında, connection refused ve connection timed out arasındaki fark, iki ağ durumunu birbirinden ayırır; çünkü reddedilme (refused), paketinizin ana bilgisayara ulaştığı ancak dinleyen bir servis olmadığı anlamına gelirken, zaman aşımı (timeout) hiçbir yanıt alınamadığı 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-all

22 numaralı port üzerindeki SELinux etiketine dokunmayın. Bu etiket temel politikadan gelir ve güvenlik duvarı paket girişini durdurduğunda herhangi bir yetki sağlamaz.

Ardından istemcileri düzeltin; varsayılan portu kullanan her aracın artık yeni porttan haberdar edilmesi gerekir. Sürekli -p yazmak yerine, kendi makinenizdeki ~/.ssh/config dosyasına şu ayarı bir kez ekleyin:

Host myvps
  HostName 203.0.113.10
  Port 2222
  User youruser

scp, sftp, rsync ve Ansible bu dosyayı okur. Ancak port 22'yi sabit kodlayan yedekleme işleri, izleme kontrolleri ve cron betikleri bu dosyayı okumaz; bu nedenle değişiklik henüz tazeyken bu yapılandırmaları tespit edip 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 sürekli olarak 22 numaralı portu yoklar; portu değiştirmek bu satırların çoğunu günlükten temizleyerek gerçek olayların daha kolay izlenmesini sağlar. 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ı, parola ile girişi kapatıp yalnızca anahtar tabanlı kimlik doğrulamayı zorunlu kılarak sağlayın. Bu süreç, bir VPS için SSH sıkılaştırma rehberi içerisinde adım adım anlatılmaktadır.

Yukarıdaki tüm işlemler, aynı kaynaklardan derlendikleri için her iki ana RHEL türevinde de aynı şekilde çalışır. Henüz seçim yapmadıysanız Rocky Linux ve AlmaLinux karşılaştırması bölümüne göz atın. CentOS 2020 yılında bu niteliğini kaybettiği için günümüzde birbirine çok yakın iki farklı türev bulunmaktadır; bu dönüşümün hikayesi Red Hat'ten CentOS'a, oradan Rocky ve AlmaLinux'a uzanan süreç içerisinde detaylandırılmıştır. Eski bir rehberi uygulamadan önce cat /etc/os-release komutu ile hangi sürümü kullandığınızı kontrol edin. Rocky Linux 8 için yazılmış rehberler hala arama sonuçlarında üst sıralarda yer alır ve semanage ile firewall-cmd adımları hala geçerlidir; ancak Rocky 8 sürümünde sshd_config.d include satırı ve socket birimi bulunmadığı için bu rehberlerin sshd ile ilgili kısımları güncel sistemlerle uyumsuzdur.

fail2ban'e yeni port bildirilmelidir

fail2ban temel depolarda bulunmaz. EPEL (Extra Packages for Enterprise Linux) üzerinden sağlanır:

sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld

fail2ban-firewalld alt paketi, fail2ban'in yasaklamaları firewalld üzerinden gerçekleştirmesini sağlar; kuralların firewalld tarafından yönetildiği bir sunucuda tercih edilen 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 = 3600

backend = 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.

Port numarasından daha önemlisi yama yönetimidir

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 aktif hale getirin: 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. Yüklenen bir güncelleme, eski kodla çalışmaya devam eden daemon süreçlerini otomatik olarak yeniden başlatmaz; bu nedenle openssh-server veya bağlantılı olduğu bir kütüphane güncellendiğinde yeniden başlatılması gereken servislerin veya sistemin kontrol edilmesi için bir dakika ayırmak faydalıdı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ı (domain) içinde kısıtlı olarak çalışır ve ilke (policy) yalnızca ssh_port_t olarak etiketlenmiş portlara bağlanmasına izin verir; bu da varsayılan olarak sadece 22 numaralı porttur. Çekirdek (kernel) bağlanma isteğini reddeder, bu nedenle 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 bulunamazsa, önce policycoreutils-python-utils paketini kurun.

SELinux permissive moddayken semanage kullanmam gerekir mi?

Evet. Permissive modda erişim reddi kaydedilir ancak bağlanmaya yine de izin verilir; bu yüzden 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 dosyasında 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 hata durumunu engeller.

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 sunucuya ulaşırken düşürülüyordur. Portunuz için sudo firewall-cmd --list-ports çıktısını kontrol edin ve --permanent kuralını ekledikten 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 uygulanmaz. Ardından, VPS'inizin önündeki harici bir ağ güvenlik duvarı olup olmadığını kontrol etmek için sunucunuzun kontrol paneline bakın. İ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 portu kullanılabilir. Gerçek bir sunucuda 2222 ve 22222 portlarından kaçının, çünkü tarayıcılar 22'den hemen sonra bunları dener. sudo ss -tlnp ile numaranın boş olduğunu doğrulayın, sudo semanage port -l ile SELinux ilkesinin o portu zaten talep etmediğinden 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.