SSD Nodes Learn 🎉 VPS vanaf $5.50/mnd
Gidsen Matt ConnorDoor Matt Connor

SSH-poort wijzigen op Rocky Linux met SELinux en firewalld

Het wijzigen van de SSH-poort op RHEL-gebaseerde systemen vereist drie stappen. Leer hoe u firewalld, SELinux en sshd_config configureert zonder uw actieve sessie te verliezen.

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 beslist of het pakket de machine bereikt. SELinux beslist of sshd überhaupt op dat poortnummer mag binden. sshd_config bepaalt naar welke poort de daemon luistert. 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 een kwestie van éé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 u daar ufw gebruikt, voegt u één regel toe. Dat is het hele verschil. De RHEL-familie levert een verse installatie met actieve firewalld en SELinux in enforcing-modus, 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 hiermee kunt inloggen. Die console is uw toegangsweg 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. Het bevindt zich in policycoreutils-python-utils.

sudo dnf install -y policycoreutils-python-utils

Het uitvoeren van het commando vóór de installatie van dit pakket 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 dnf- en apt-commando's dit terug naar wat u al kent.

Kies een poort en controleer of deze niet in gebruik is

Elke vrije TCP-poort tussen 1024 en 65535 volstaat. 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 nummer 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 uitvoer. Als het beleid de poort al claimt, mislukt de semanage port -a in stap 2 met ValueError: Port tcp/2222 already defined; de oplossing is om een ander nummer te kiezen.

In deze handleiding wordt 2222 als voorbeeld gebruikt. Dit is echter ook de eerste poort die een scanner probeert na 22, dus kies op een echte server 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 in een domein genaamd sshd_t. Het beleid staat sshd_t toe om TCP-poorten te binden die het label ssh_port_t dragen, 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 het beleid aan dat nummer heeft toegewezen, en weigert de name_bind-toestemming op de socket.

Daarom lijkt dit probleem niet op een firewallkwestie. 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 correct en is gezond, maar pakketten worden onderweg naar binnen genegeerd.

getenforce vertelt u in welke modus de server zich bevindt. In Permissive wordt een weigering wel gelogd maar niet afgedwongen, waardoor de poortwijziging lijkt te werken, maar vervolgens faalt op de dag dat iemand setenforce 1 uitvoert of de server herstart in de enforcing-modus. Voorzie de poort in beide gevallen van een label. De SELinux-basisgids voor een server behandelt modi, contexten en booleans uitgebreid.

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. Pakketupdates overschrijven uw aanpassing dan niet.

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, plaats Port 2222 dan 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 kan worden geparseerd, 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 goedkoop vangnet, zolang u er maar aan denkt 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 luisterende socket en draagt het verbindingen over aan sshd, waardoor de Port-regel in sshd_config volledig wordt 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, dus 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 vervolgens 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 tweede inlogproces is geslaagd. Als het niet werkt, beschikt u nog steeds 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? Zo stelt u het verschil vast

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

  • Als systemctl status sshd aangeeft dat de unit is mislukt, heeft de daemon zijn socket nooit gekregen. Dit wijst op 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 in het netwerkpad: firewalld, de externe firewall van de provider, of het adres en de poort die u heeft aangeroepen.

Lees voor het SELinux-scenario het audit-logbestand 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 logbericht vertaalt naar een begrijpelijke 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 helpt het verschil tussen connection refused en connection timed out om de twee netwerkscenario's te scheiden, 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 sluiten:

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, aangezien elk hulpprogramma dat uitging van de standaardpoort nu een instructie nodig heeft. 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 ligt.

Wat het verplaatsen van de poort wel en niet oplevert

Het vermindert de 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 versie-banner. Beschouw de wijziging van de poort als onderhoud en implementeer de werkelijke beveiliging via authenticatie met uitsluitend sleutels, waarbij inloggen met wachtwoorden is uitgeschakeld. De SSH-hardeninghandleiding 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. 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-includeregel en geen socket-unit om rekening mee te houden. Daarom komt het sshd-gedeelte van die handleidingen niet overeen met een huidige server.

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 systeem 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 op het 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 bij 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 identiek aan die 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 in een slechtere staat dan een server die op poort 22 draait en zichzelf elke nacht bijwerkt. Schakel unattended updates in tijdens dezelfde sessie, terwijl u toch al root bent: automatische dnf-updates op Rocky Linux en AlmaLinux behandelt de timer en de keuze tussen het downloaden van updates en het daadwerkelijk installeren ervan.

FAQ

Waarom start sshd niet op nadat ik de poort heb gewijzigd op Rocky Linux?

Dit komt bijna altijd door een ontbrekend SELinux-poortlabel. sshd draait in een afgeschermde omgeving binnen het sshd_t-domein, en het beleid staat alleen toe dat het poorten bindt die zijn gelabeld als ssh_port_t. Standaard is dit alleen poort 22. De kernel weigert de bind-opdracht, waardoor de daemon afsluit in plaats van te luisteren. journalctl -u sshd bevat dan een regel in de vorm van 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 wordt gevonden, installeer dan eerst policycoreutils-python-utils.

Heb ik semanage nog steeds 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 is geslaagd. Het label ontbreekt echter nog steeds. Op het moment dat 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 aanleiding zou optreden.

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

Als de daemon draait, is SELinux akkoord; het pakket wordt dus onderweg naar binnen tegengehouden. 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 externe netwerkfirewall die voor de VPS staat. 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 het één keer in ~/.ssh/config zet en daarna nooit meer hoeft in te typen.