SSD Nodes Learn Hosting plans →
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-09-04

SSH poort wijzigen op Rocky Linux met SELinux en firewalld

Het wijzigen van de SSH-poort op RHEL-gebaseerde systemen vereist drie stappen. Voorkom dat u wordt buitengesloten door eerst de firewalld-poort en SELinux-label toe te voegen.

Waarom het wijzigen van de SSH-poort hier drie stappen vereist

Om de SSH-poort te wijzigen op Rocky Linux, AlmaLinux, CentOS Stream of Fedora is één aanpassing niet voldoende. Drie afzonderlijke systemen bepalen of een verbinding op de nieuwe poort werkt. firewalld bepaalt of het pakket de machine bereikt. SELinux bepaalt of sshd überhaupt op dat poortnummer mag binden. sshd_config bepaalt welke poort de daemon aanvraagt. Slaat u de SELinux-stap over, dan weigert de daemon te starten. Slaat u de firewalld-stap over, dan start de daemon wel en luistert deze, maar is hij voor niemand bereikbaar.

Op Ubuntu is dezelfde taak één aanpassing en een herstart, omdat Ubuntu AppArmor gebruikt in plaats van SELinux en geen profiel meelevert dat beperkt op welke poorten sshd mag binden. Als ufw daar actief is, voegt u één regel toe. Dat is het hele verschil. De RHEL-familie levert een verse installatie met firewalld actief en SELinux in de modus enforcing, en beide systemen controleren poortnummers.

Voer het werk in deze volgorde uit zodat uw huidige sessie tijdens elke stap actief blijft:

  1. Open de nieuwe poort in firewalld en laat poort 22 voorlopig open.
  2. Voeg het SELinux-label voor de nieuwe poort toe met semanage.
  3. Stel de poort in de sshd-configuratie in.
  4. Herstart sshd en log vervolgens in op de nieuwe poort vanaf een tweede terminal voordat u de eerste sluit.
Zoek de webconsole (VNC of serieel) van uw provider op voordat u begint en controleer of u daarmee kunt inloggen. Die console is uw weg terug als de wijziging mislukt. Een poortwijziging is een van de meest voorkomende redenen waarom een gebruiker zichzelf buitensluit van een server waarvoor net is betaald.

Installeer eerst semanage

semanage is de tool die SELinux-beleidsinstellingen bewerkt, en een minimale installatie van Rocky Linux of AlmaLinux bevat deze niet. Deze bevindt zich in policycoreutils-python-utils.

sudo dnf install -y policycoreutils-python-utils

Het uitvoeren van het commando voordat dit pakket is geïnstalleerd, resulteert in sudo: semanage: command not found, en dat is het punt waarop veel lezers besluiten dat SELinux niet is geïnstalleerd en de stap overslaan. SELinux is wel geïnstalleerd. Alleen de beheertool ontbreekt. Als de dnf-syntaxis nieuw voor u is, koppelt de equivalenten van de dnf- en apt-commando's dit terug naar wat u al kent.

Kies een poort en controleer of deze vrij is

Elke vrije TCP-poort tussen 1024 en 65535 is geschikt. Voer twee controles uit voordat u een keuze maakt:

sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222

De eerste opdracht toont of een proces al op dat poortnummer luistert. De tweede opdracht toont of het SELinux-beleid de poort al toewijst aan een ander servicetype. Een vrije poort geeft bij beide opdrachten geen resultaat. Als het beleid de poort al claimt, mislukt de semanage port -a in stap 2 met de foutmelding ValueError: Port tcp/2222 already defined. De oplossing is om een ander poortnummer te kiezen.

In deze handleiding wordt 2222 als voorbeeld gebruikt. Dit is echter ook de eerste poort die een scanner probeert na poort 22; kies daarom op een productieserver een minder voor de hand liggend nummer.

Stap 1: open de poort in firewalld

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

--permanent schrijft de regel naar het zonebestand op de schijf en wijzigt de actieve firewall niet. --reload laadt de configuratie van de schijf in de actieve firewall. Sla de reload over en de regel bestaat wel, maar doet niets totdat firewalld opnieuw opstart; dit is een van de meest voorkomende redenen waarom deze procedure zonder aanwijsbare oorzaak lijkt te falen.

Laat de ssh service-entry voorlopig met rust. Deze entry houdt poort 22 open en dient als fallback terwijl u test.

Controleer ook het configuratiescherm van uw provider. Veel hosts draaien een netwerkfirewall voor de VPS, buiten het besturingssysteem om, waardoor een poort die u in firewalld heeft geopend alsnog upstream kan worden geblokkeerd. De basisgids voor firewalld op een VPS behandelt zones en het onderscheid tussen runtime en permanent als dit model nieuw voor u is.

Stap 2: label de poort voor SELinux

sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t

-a voegt een nieuwe poorttoewijzing toe. -t ssh_port_t is het type dat SSH-poorten dragen. Het tweede commando geeft een overzicht van alles wat ssh_port_t nu omvat, zodat u kunt bevestigen dat uw nummer is toegevoegd voordat u de daemon aanpast.

Waarom SELinux de poort blokkeert

SELinux (Security-Enhanced Linux) voorziet elk object op het systeem van een label, en TCP-poortnummers zijn objecten zoals elk ander. De SSH-daemon draait binnen een domein genaamd sshd_t. Het beleid staat sshd_t toe om TCP-poorten met het label ssh_port_t te binden, en standaard is 22 de enige poort met dat label. Wanneer u de daemon vraagt om poort 2222 te binden, controleert de kernel het label, vindt het generieke type dat door het beleid aan dat nummer is toegewezen, en weigert de name_bind-toestemming op de socket.

Dit is de reden waarom deze fout niet lijkt op een firewallprobleem. De kernel weigert de actie nog voordat er een luisterende socket bestaat, waardoor sshd de fout rapporteert en afsluit. Een firewallprobleem is het spiegelbeeld: de daemon draait en functioneert naar behoren, maar pakketten worden onderweg naar binnen genegeerd.

getenforce vertelt u in welke modus de server zich bevindt. Op Permissive wordt een weigering geregistreerd maar niet afgedwongen, waardoor de poortwijziging lijkt te werken, maar vervolgens faalt zodra iemand setenforce 1 uitvoert of de server opnieuw opstart in de enforcing-modus. Voorzie de poort in beide gevallen van een label. De basisgids voor SELinux op een server behandelt modi, contexten en booleans uitgebreid. Poorten zijn niet de enige objecten waar dit tot problemen leidt; hetzelfde beleid voorkomt dat een container een gemounte host-directory leest totdat dat pad opnieuw is gelabeld. Dit is de reden waarom het installeren van Docker op Rocky Linux of AlmaLinux een SELinux-stap bevat die in handleidingen voor Ubuntu nooit wordt genoemd.

Stap 3: stel de poort in de sshd-configuratie in

Op Rocky Linux 9 en 10, AlmaLinux 9 en 10, en huidige Fedora-versies begint /etc/ssh/sshd_config met een include-regel. De meest overzichtelijke plek voor uw wijziging is daarom een drop-in-bestand. Zo worden uw aanpassingen niet overschreven bij pakketupdates.

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

Als grep geen Include-regel vindt, wat het geval is bij Rocky Linux 8 en andere oudere images, plaatst u Port 2222 direct in /etc/ssh/sshd_config. sshd -t parseert de volledige configuratie, inclusief drop-ins, en rapporteert syntaxfouten. Los eventuele meldingen op voordat u de service herstart; een configuratie die niet geparseerd kan worden, zorgt ervoor dat de daemon niet opnieuw opstart.

Port kan vaker dan één keer voorkomen en sshd luistert op elke vermelde poort. Het behouden van Port 22 naast Port 2222 gedurende de eerste dag is een eenvoudige veiligheidsmaatregel, mits u niet vergeet deze later te verwijderen.

Wordt uw sshd gestart door een socket-unit?

Sommige images starten SSH via systemd socket-activatie in plaats van als een continu draaiende service. Wanneer dit is geconfigureerd, beheert systemd de listening socket en draagt het verbindingen over aan sshd. Hierdoor wordt de Port-regel in sshd_config volledig genegeerd. Controleer dit voordat u iets herstart:

systemctl is-enabled sshd.socket

Een enabled-antwoord betekent dat de poort is ingesteld op de socket-unit en niet in sshd_config:

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

De lege ListenStream= is vereist. Waarden stapelen zich op via drop-in bestanden. Zonder een lege toewijzing om de lijst eerst te wissen, blijft de socket luisteren op zowel 22 als 2222. Pas dit toe met sudo systemctl daemon-reload en vervolgens sudo systemctl restart sshd.socket. Als de unit is uitgeschakeld of niet aanwezig is op uw server, is deze sectie niet op u van toepassing.

Stap 4: herstarten en testen vanuit een tweede terminal

sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshd

Houd deze terminal open. Log niet uit. Open een tweede terminal op uw eigen machine en maak verbinding via de nieuwe poort:

ssh -p 2222 youruser@203.0.113.10

Sluit de eerste sessie pas nadat het inloggen in de tweede sessie is gelukt. Als het niet werkt, beschikt u nog over een shell waarmee u alle wijzigingen ongedaan kunt maken. Deze gewoonte maakt het verschil tussen een wijziging van vijf minuten en een middag werk in de console van de provider.

Firewall drop of SELinux denial? Hoe maakt u het onderscheid

Vanaf uw laptop zien de twee fouten er nagenoeg identiek uit. Op de server verschillen ze echter volledig.

  • Als systemctl status sshd aangeeft dat de unit is mislukt, heeft de daemon zijn socket nooit ontvangen. Dit is een configuratiefout of een SELinux-denial.
  • Als de unit actief is en ss -tlnp laat zien dat sshd aan de nieuwe poort is gebonden, functioneert de daemon naar behoren en ligt het probleem op het netwerkpad: firewalld, de externe firewall van de provider, of het adres en de poort die u heeft aangeroepen.

Lees voor het SELinux-geval het audit-record in plaats van te gissen:

sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pager

Een name_bind-denial op klasse tcp_socket benoemt het proces in comm="sshd", het poortnummer in src= en het label dat de poort daadwerkelijk draagt in tcontext=. Dat laatste veld bevat het antwoord. Alles behalve ssh_port_t betekent dat stap 2 niet van toepassing was op de poort die u gebruikt; meestal is er sprake van een typefout in het nummer of het verkeerde protocol. Installeer setroubleshoot-server als u liever heeft dat sealert het record omzet in een leesbare zin.

Het bericht dat sshd zelf schrijft wanneer de kernel het binden weigert, ziet er als volgt uit:

error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.

Permission denied op een poort boven 1024, waar geen root-rechten nodig zijn om te binden, is het kenmerk van SELinux. Address already in use in diezelfde regel duidt op een ander defect: een ander proces houdt de poort bezet. Vanaf de clientzijde maakt het verschil tussen connection refused en connection timed out onderscheid tussen de twee netwerkgevallen, omdat een weigering betekent dat uw pakket de host heeft bereikt en er niets luisterde, terwijl een time-out betekent dat er helemaal geen antwoord kwam.

Poort 22 sluiten en clients bijwerken

Zodra meerdere aanmeldingen via de nieuwe poort zijn gelukt, kunt u poort 22 afsluiten:

sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Laat het SELinux-label op poort 22 ongewijzigd. Dit label is afkomstig van het basisbeleid en verleent geen rechten zodra de firewall geen pakketten meer doorlaat.

Pas vervolgens de clients aan, omdat elk hulpprogramma dat uitging van de standaardpoort nu moet worden bijgewerkt. Voeg dit eenmalig toe aan ~/.ssh/config op uw eigen machine in plaats van voor altijd -p te typen:

Host myvps
  HostName 203.0.113.10
  Port 2222
  User youruser

scp, sftp, rsync en Ansible lezen dit bestand allemaal. Back-uptaken, monitoring-checks en cron-scripts waarin poort 22 hard is gecodeerd doen dit niet; spoor deze dus op terwijl de wijziging nog vers in uw geheugen zit.

Wat het verplaatsen van de poort wel en niet oplevert

Het vermindert ruis in de logs. Geautomatiseerde scanners bestoken poort 22 constant; door de poort te verplaatsen verdwijnen de meeste van deze regels uit de journal, waardoor echte gebeurtenissen beter zichtbaar worden. Het is geen beveiligingsmaatregel. Elke scanner die het volledige poortbereik scant, vindt uw daemon en leest alsnog de versiebanner. Beschouw het wijzigen van de poort als onderhoud en implementeer de werkelijke beveiliging via authenticatie met alleen sleutels, waarbij inloggen met wachtwoorden is uitgeschakeld. De SSH-hardening handleiding voor een VPS doorloopt dit stap voor stap.

Alles hierboven werkt identiek op beide grote RHEL-rebuilds, aangezien deze uit dezelfde bronnen zijn opgebouwd. Zie Rocky Linux en AlmaLinux vergeleken als u nog tussen beide moet kiezen. Er zijn twee nagenoeg identieke rebuilds om uit te kiezen omdat CentOS in 2020 ophield er een te zijn; een wending die volledig wordt beschreven in het verhaal van Red Hat naar CentOS naar Rocky en AlmaLinux. Controleer welke release u daadwerkelijk heeft gekregen voordat u een oudere handleiding volgt, met cat /etc/os-release. Handleidingen geschreven voor Rocky Linux 8 scoren nog steeds goed en hun semanage en firewall-cmd stappen blijven correct, maar Rocky 8 heeft geen sshd_config.d include-regel en geen socket-unit om rekening mee te houden, waardoor het sshd-gedeelte van die handleidingen niet overeenkomt met een huidige machine.

fail2ban moet op de hoogte worden gesteld van de nieuwe poort

fail2ban bevindt zich niet in de basisrepositories. Het is afkomstig uit EPEL (extra packages for enterprise Linux):

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

Het subpakket fail2ban-firewalld zorgt ervoor dat fail2ban zijn bans via firewalld uitvoert; dit is de gewenste werkwijze op een server waar firewalld de regels beheert.

De standaard jail sshd stelt port = ssh in, en die naam wordt via /etc/services omgezet naar 22. Na uw wijziging bewaakt de jail een poort die niemand aanvalt, waardoor er niemand wordt verbannen terwijl het aantal mislukte inlogpogingen op 2222 oploopt. Stel de poort in als nummer in /etc/fail2ban/jail.local:

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

backend = systemd leest fouten uit de journal in plaats van uit /var/log/secure; dit is de veiligere keuze op een minimale installatie waar rsyslog mogelijk niet aanwezig is. Start het met sudo systemctl enable --now fail2ban en inspecteer de jail met sudo fail2ban-client status sshd. De jail-syntaxis is dezelfde als die wordt gebruikt in de fail2ban-configuratie voor SSH op Ubuntu 24.04. Alleen de pakketbron en de ban-actie verschillen.

Patchen is belangrijker dan de poort

Een server met een verplaatste SSH-poort en vier maanden aan niet-toegepaste beveiligingsupdates is er slechter aan toe dan een server die op poort 22 draait en zichzelf elke nacht patchet. Schakel unattended-upgrades in tijdens dezelfde sessie, terwijl u toch al als root bent ingelogd: automatische dnf-updates op Rocky Linux en AlmaLinux behandelt de timer en de keuze tussen het downloaden van updates en het daadwerkelijk toepassen ervan. Een geïnstalleerde update herstart de daemons die nog op de oude code draaien niet, dus controleren wat nog een herstart of reboot vereist is de minuut waard wanneer openssh-server of een bibliotheek waaraan het gekoppeld is in de batch voorbijkomt.

FAQ

Waarom start sshd niet na het wijzigen van de poort op Rocky Linux?

Dit komt bijna altijd door een ontbrekend SELinux-poortlabel. sshd draait in de sshd_t-domeinbeperking, en het beleid staat alleen toe dat de daemon bindt aan poorten met het label ssh_port_t, wat standaard alleen poort 22 is. De kernel weigert de bind-opdracht, waardoor de daemon afsluit in plaats van te luisteren. journalctl -u sshd bevat in dat geval een regel van het type error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.. Voer sudo semanage port -a -t ssh_port_t -p tcp 2222 uit met uw eigen poortnummer en herstart daarna de service. Als semanage niet gevonden wordt, installeer dan eerst policycoreutils-python-utils.

Heb ik semanage nog nodig als SELinux in permissive mode staat?

Ja. In permissive mode wordt de weigering wel gelogd, maar wordt de bind-opdracht alsnog toegestaan, waardoor het lijkt alsof de wijziging werkte. Het label ontbreekt echter nog steeds. Zodra iemand setenforce 1 uitvoert, of de server opstart met SELINUX=enforcing in /etc/selinux/config, zal sshd niet meer starten op die poort. Het toevoegen van het label kost slechts één commando en voorkomt een fout die anders weken later zonder duidelijke oorzaak zou optreden.

De poort is gelabeld en sshd draait, waarom verloopt mijn verbinding dan?

Een draaiende daemon betekent dat SELinux akkoord is, dus het pakket wordt onderweg geblokkeerd. Controleer sudo firewall-cmd --list-ports voor uw poort en bevestig dat u firewall-cmd --reload heeft uitgevoerd na de --permanent-regel, aangezien een permanente regel op zichzelf nooit de actieve firewall bereikt. Controleer daarna het configuratiescherm van uw host voor een aparte netwerkfirewall vóór de VPS. Dit is de tweede plek waar gebruikers worden geblokkeerd, en niets binnen het besturingssysteem zal dit tonen.

Welke poort moet ik gebruiken in plaats van 22?

Elke vrije TCP-poort tussen 1024 en 65535. Vermijd 2222 en 22222 op een productieserver, aangezien scanners deze direct na 22 proberen. Bevestig dat het nummer vrij is met sudo ss -tlnp, controleer of het SELinux-beleid het niet al heeft geclaimd met sudo semanage port -l, en vermijd poorten die zijn toegewezen aan services die u later mogelijk installeert. Een hoog, onthoudbaar nummer is prima, omdat u dit één keer in ~/.ssh/config zet en daarna nooit meer hoeft in te typen.