Rocky Linux లో SSH పోర్ట్ను మార్చడం ఎలా?
Rocky Linux లేదా AlmaLinux లో SSH పోర్ట్ను మార్చేటప్పుడు firewalld, SELinux మరియు sshd_config సెట్టింగ్లను ఎలా సరిచేయాలో తెలుసుకోండి. కనెక్షన్ కట్ అవ్వకుండా ఈ దశలను అనుసరించండి.
SSH పోర్ట్ను మార్చడానికి ఇక్కడ మూడు దశలు ఎందుకు అవసరం
Rocky Linux, AlmaLinux, CentOS Stream లేదా Fedora లలో SSH పోర్ట్ను మార్చడానికి కేవలం ఒక సవరణ సరిపోదు. కొత్త పోర్ట్పై కనెక్షన్ పనిచేస్తుందో లేదో నిర్ణయించడంలో మూడు వేర్వేరు వ్యవస్థలు పాత్ర పోషిస్తాయి. ప్యాకెట్ మెషీన్కు చేరుతుందో లేదో firewalld నిర్ణయిస్తుంది. ఆ పోర్ట్ నంబర్ను బైండ్ చేయడానికి sshd అనుమతి ఉందో లేదో SELinux నిర్ణయిస్తుంది. sshd_config ఏ పోర్ట్ కోసం daemon అడగాలో నిర్ణయిస్తుంది. SELinux దశను విస్మరిస్తే daemon ప్రారంభం కావడానికి నిరాకరిస్తుంది. firewalld దశను విస్మరిస్తే అది ప్రారంభమై, వింటుంది (listen), కానీ ఎవరూ దానిని చేరుకోలేరు.
Ubuntu లో ఇదే పని ఒక సవరణ మరియు రీస్టార్ట్తో పూర్తవుతుంది, ఎందుకంటే Ubuntu SELinux కు బదులుగా AppArmor ను ఉపయోగిస్తుంది మరియు sshd ఏ పోర్ట్లను బైండ్ చేయవచ్చో పరిమితం చేసే ప్రొఫైల్ను కలిగి ఉండదు. అక్కడ ufw రన్ అవుతుంటే, మీరు ఒక రూల్ను జోడిస్తే సరిపోతుంది. తేడా అంతా ఇదే. RHEL కుటుంబానికి చెందిన OSలు కొత్త ఇన్స్టాలేషన్లో firewalld రన్ అవుతూ, SELinux ఎన్ఫోర్సింగ్ మోడ్లో ఉంటాయి, ఈ రెండూ పోర్ట్ నంబర్ల విషయంలో కఠినంగా ఉంటాయి.
ఈ పనిని ఈ క్రమంలో చేయండి, అప్పుడు మీ ప్రస్తుత సెషన్ ప్రతి దశలోనూ అలాగే ఉంటుంది:
- firewalld లో కొత్త పోర్ట్ను తెరవండి, ప్రస్తుతానికి పోర్ట్ 22 ను అలాగే ఉంచండి.
semanageఉపయోగించి కొత్త పోర్ట్ కోసం SELinux లేబుల్ను జోడించండి.- sshd కాన్ఫిగరేషన్లో పోర్ట్ను సెట్ చేయండి.
sshdను రీస్టార్ట్ చేయండి, ఆపై మొదటి టెర్మినల్ను మూసివేసే ముందు రెండవ టెర్మినల్ నుండి కొత్త పోర్ట్ ద్వారా లాగిన్ అవ్వండి.
మీరు ప్రారంభించడానికి ముందే మీ ప్రొవైడర్ వెబ్ కన్సోల్ (VNC లేదా సీరియల్) ఎక్కడ ఉందో కనుగొనండి మరియు దాని ద్వారా లాగిన్ అవ్వగలరో లేదో తనిఖీ చేయండి. మార్పు విఫలమైతే తిరిగి లోపలికి రావడానికి ఆ కన్సోలే మీకు మార్గం. పోర్ట్ మార్పు అనేది వినియోగదారులు తాము ఇప్పుడే డబ్బు చెల్లించిన సర్వర్ నుండి తమను తాము లాక్ చేసుకోవడానికి అత్యంత సాధారణ కారణాలలో ఒకటి.
ముందుగా, semanage ను ఇన్స్టాల్ చేయండి
semanage అనేది SELinux పాలసీ సెట్టింగ్లను సవరించే సాధనం, అయితే Rocky Linux లేదా AlmaLinux యొక్క కనిష్ట (minimal) ఇన్స్టాలేషన్లో ఇది ఉండదు. ఇది policycoreutils-python-utils ప్యాకేజీలో ఉంటుంది.
sudo dnf install -y policycoreutils-python-utilsఆ ప్యాకేజీని ఇన్స్టాల్ చేయకుండానే కమాండ్ను రన్ చేస్తే sudo: semanage: command not found అని వస్తుంది, ఆ సమయంలోనే చాలామంది పాఠకులు SELinux ఇన్స్టాల్ కాలేదని భావించి ఈ దశను వదిలేస్తారు. SELinux ఇన్స్టాల్ అయి ఉంటుంది. కేవలం నిర్వహణ సాధనం మాత్రమే లోపించింది. మీకు dnf సింటాక్స్ కొత్తగా ఉంటే, dnf మరియు apt కమాండ్ సమానార్థకాలు మీకు ఇప్పటికే తెలిసిన వాటితో దీన్ని పోల్చి చూపిస్తాయి.
ఒక పోర్ట్ను ఎంచుకుని, దానిని ఏదీ ఉపయోగించడం లేదని నిర్ధారించుకోండి
1024 నుండి 65535 మధ్య ఉన్న ఏదైనా ఖాళీ TCP పోర్ట్ సరిపోతుంది. మీరు ఒక పోర్ట్ను ఖరారు చేసే ముందు ఈ రెండు తనిఖీలు చేయండి:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222మొదటి కమాండ్, ఆ పోర్ట్ నంబర్పై ఇప్పటికే ఏదైనా ప్రాసెస్ వింటుందో (listening) లేదో చూపిస్తుంది. రెండవ కమాండ్, SELinux పాలసీ ఆ పోర్ట్ను ఇప్పటికే వేరే సర్వీస్ రకానికి కేటాయించిందో లేదో చూపిస్తుంది. పోర్ట్ ఖాళీగా ఉంటే, ఈ రెండు కమాండ్లు ఎటువంటి అవుట్పుట్ను చూపవు. ఒకవేళ పాలసీ ఇప్పటికే ఆ పోర్ట్ను కేటాయించి ఉంటే, 2వ దశలోని semanage port -a కమాండ్ ValueError: Port tcp/2222 already defined ఎర్రర్తో విఫలమవుతుంది. అప్పుడు వేరే పోర్ట్ నంబర్ను ఎంచుకోవడమే దీనికి పరిష్కారం.
ఈ గైడ్ అంతటా ఉదాహరణ కోసం 2222 పోర్ట్ను ఉపయోగిస్తున్నాము. సాధారణంగా స్కాన్ చేసేవారు 22 తర్వాత ప్రయత్నించే మొదటి పోర్ట్ ఇదే, కాబట్టి నిజమైన సర్వర్లలో అంత సులభంగా దొరకని పోర్ట్ను ఎంచుకోండి.
దశ 1: firewalld లో పోర్ట్ను తెరవడం
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent కమాండ్ నియమాన్ని డిస్క్లోని zone ఫైల్లో రాస్తుంది, కానీ నడుస్తున్న firewall లో ఎటువంటి మార్పు చేయదు. --reload కమాండ్ డిస్క్లో ఉన్న కాన్ఫిగరేషన్ను నడుస్తున్న firewall లోకి లోడ్ చేస్తుంది. ఒకవేళ మీరు reload చేయకపోతే, ఆ నియమం అలాగే ఉంటుంది కానీ firewalld తదుపరిసారి రీస్టార్ట్ అయ్యే వరకు ఏ పని చేయదు; ఈ ప్రక్రియ ఎందుకు విఫలమైందో అర్థం కాకపోవడానికి ఇది అత్యంత సాధారణ కారణాలలో ఒకటి.
ప్రస్తుతానికి ssh సర్వీస్ ఎంట్రీని అలాగే ఉంచండి. ఆ ఎంట్రీ పోర్ట్ 22ను తెరిచి ఉంచుతుంది, మీరు పరీక్షలు చేస్తున్నప్పుడు ఇది మీకు బ్యాకప్ లాగా పనిచేస్తుంది.
మీ సర్వీస్ ప్రొవైడర్ కంట్రోల్ ప్యానెల్ను కూడా ఒకసారి తనిఖీ చేయండి. చాలా హోస్టింగ్ సంస్థలు ఆపరేటింగ్ సిస్టమ్కు వెలుపల, VPS ముందు ఒక నెట్వర్క్ firewall ను నిర్వహిస్తాయి; కాబట్టి మీరు firewalld లో తెరిచిన పోర్ట్ కూడా upstream లో బ్లాక్ చేయబడవచ్చు. VPS కోసం firewalld ప్రాథమిక మార్గదర్శిని లో zones గురించి మరియు runtime వర్సెస్ permanent మధ్య తేడాల గురించి వివరించబడింది, ఒకవేళ ఈ పద్ధతి మీకు కొత్త అయితే దానిని చూడండి.
దశ 2: SELinux కోసం పోర్ట్ను లేబుల్ చేయడం
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a కొత్త పోర్ట్ కేటాయింపును జోడిస్తుంది. -t ssh_port_t అనేది SSH పోర్ట్లకు ఉండే రకం. రెండవ కమాండ్ ప్రస్తుతం ssh_port_t పరిధిలోకి వచ్చే అన్నింటినీ జాబితా చేస్తుంది, తద్వారా మీరు డెమన్ను తాకడానికి ముందే మీ పోర్ట్ నంబర్ చేర్చబడిందో లేదో నిర్ధారించుకోవచ్చు.
SELinux ఎందుకు పోర్ట్ను నిరోధిస్తుంది
SELinux (security-enhanced Linux) సిస్టమ్లోని ప్రతి ఆబ్జెక్ట్కు ఒక లేబుల్ను కేటాయిస్తుంది, TCP పోర్ట్ నంబర్లు కూడా ఇతర ఆబ్జెక్ట్ల వలె పరిగణించబడతాయి. SSH daemon అనేది sshd_t అనే డొమైన్లో పరిమితం చేయబడి నడుస్తుంది. పాలసీ ప్రకారం sshd_t అనేది ssh_port_t అని లేబుల్ చేయబడిన TCP పోర్ట్లకు మాత్రమే bind అవ్వగలదు, డిఫాల్ట్గా ఈ లేబుల్ ఉన్న ఏకైక పోర్ట్ 22 మాత్రమే. మీరు daemon ను 2222 పోర్ట్కు bind అవ్వమని కోరినప్పుడు, kernel ఆ లేబుల్ను తనిఖీ చేస్తుంది, ఆ నంబర్కు కేటాయించిన సాధారణ రకపు పాలసీని కనుగొంటుంది మరియు socket పై name_bind అనుమతిని నిరాకరిస్తుంది.
అందుకే ఈ వైఫల్యం firewall సమస్యలా అనిపించదు. listening socket ఏర్పడకముందే kernel దీనిని నిరాకరిస్తుంది, కాబట్టి sshd ఆ error ను రిపోర్ట్ చేసి నిలిచిపోతుంది. firewall సమస్య దీనికి భిన్నంగా ఉంటుంది: daemon నడుస్తూనే ఉంటుంది, కానీ వచ్చే packets మధ్యలోనే తొలగించబడతాయి.
getenforce మీ సర్వర్ ఏ మోడ్లో ఉందో తెలియజేస్తుంది. Permissive లో ఉన్నప్పుడు, నిరాకరణ (denial) రికార్డ్ చేయబడుతుంది కానీ అమలు చేయబడదు, కాబట్టి పోర్ట్ మార్పు పని చేస్తున్నట్లు కనిపిస్తుంది, కానీ ఎవరైనా setenforce 1 రన్ చేసినప్పుడు లేదా సర్వర్ enforcing మోడ్లోకి reboot అయినప్పుడు అది విఫలమవుతుంది. ఏది ఏమైనా పోర్ట్ను లేబుల్ చేయడం అవసరం. సర్వర్ కోసం SELinux ప్రాథమిక మార్గదర్శిని మోడ్లు, కాంటెక్స్ట్లు మరియు బూలియన్ల గురించి వివరంగా వివరిస్తుంది.
దశ 3: sshd కాన్ఫిగరేషన్లో పోర్ట్ను సెట్ చేయడం
Rocky Linux 9 మరియు 10, AlmaLinux 9 మరియు 10, మరియు ప్రస్తుత Fedora వెర్షన్లలో, /etc/ssh/sshd_config ఒక include లైన్తో ప్రారంభమవుతుంది. కాబట్టి, మీ మార్పులను చేయడానికి ఒక drop-in ఫైల్ను ఉపయోగించడం సరైన పద్ధతి. దీనివల్ల ప్యాకేజీ అప్డేట్లు జరిగినప్పుడు మీ మార్పులు చెరిగిపోవు.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tఒకవేళ grep లో Include లైన్ లేకపోతే (Rocky Linux 8 మరియు ఇతర పాత ఇమేజ్లలో ఇలాగే ఉంటుంది), అప్పుడు Port 2222 ను నేరుగా /etc/ssh/sshd_config లో చేర్చండి. sshd -t మొత్తం కాన్ఫిగరేషన్ను, అంటే drop-in ఫైళ్లతో సహా పరిశీలిస్తుంది మరియు సింటాక్స్ లోపాలను తెలియజేస్తుంది. మీరు సర్వీస్ను రీస్టార్ట్ చేసే ముందు అది చూపించే ఏ లోపాన్నైనా సరిచేయండి, ఎందుకంటే కాన్ఫిగరేషన్ పార్సింగ్ విఫలమైతే, daemon మళ్ళీ ప్రారంభం కాదు.
Port ఒకటి కంటే ఎక్కువసార్లు కనిపించవచ్చు, అప్పుడు sshd జాబితా చేయబడిన ప్రతి పోర్ట్ వద్ద వింటుంది (listens). మొదటి రోజున Port 22 తో పాటు Port 2222 ను కూడా ఉంచడం ఒక సురక్షితమైన పద్ధతి, అయితే తర్వాత దాన్ని తొలగించడం మర్చిపోవద్దు.
మీ sshd ఒక socket unit ద్వారా ప్రారంభించబడిందా?
కొన్ని images SSH ను నిరంతరం నడిచే service గా కాకుండా, systemd socket activation ద్వారా ప్రారంభిస్తాయి. అక్కడ ఆ అమరిక ఉన్నప్పుడు, listening socket ను systemd నిర్వహిస్తుంది మరియు connections ను sshd కి అందిస్తుంది, కాబట్టి sshd_config లోని Port లైన్ పూర్తిగా విస్మరించబడుతుంది. మీరు దేనినైనా restart చేసే ముందు దీనిని తనిఖీ చేయండి:
systemctl is-enabled sshd.socketఒక enabled సమాధానం అంటే, port అనేది sshd_config లో కాకుండా socket unit లో సెట్ చేయబడిందని అర్థం:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222కేవలం ListenStream= మాత్రమే అవసరం. drop-in ఫైళ్లలో విలువలు ఒకదానికొకటి కలుస్తాయి (accumulate), కాబట్టి జాబితాను ముందుగా ఖాళీ చేయకుండా, socket 22 తో పాటు 2222 పోర్టులో కూడా వింటూనే ఉంటుంది. దీనిని sudo systemctl daemon-reload తో వర్తింపజేసి, ఆపై sudo systemctl restart sshd.socket చేయండి. ఒకవేళ ఆ unit మీ సర్వర్లో disable చేయబడినా లేదా లేకపోయినా, ఈ విభాగం మీకు వర్తించదు.
Step 4: restart, then test from a second terminal
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdఈ terminal ను అలాగే ఉంచండి. దీని నుండి log out అవ్వకండి. మీ సొంత machine లో రెండవ terminal ను తెరిచి, కొత్త port ద్వారా connect అవ్వండి:
ssh -p 2222 youruser@203.0.113.10రెండవ login విజయవంతమైన తర్వాత మాత్రమే మొదటి session ను మూసివేయండి. ఒకవేళ అది పని చేయకపోతే, మీరు చేసిన మార్పులను వెనక్కి తీసుకోవడానికి మీకు shell అందుబాటులో ఉంటుంది. ఈ చిన్న అలవాటు వల్ల ఐదు నిమిషాల పనికి బదులుగా మధ్యాహ్నం అంతా provider console ముందు గడపాల్సిన అవసరం ఉండదు.
Firewall drop లేదా SELinux denial? వీటి మధ్య తేడాను ఎలా గుర్తించాలి
మీ ల్యాప్టాప్ నుండి చూసినప్పుడు ఈ రెండు వైఫల్యాలు దాదాపు ఒకేలా కనిపిస్తాయి. కానీ సర్వర్ స్థాయిలో వీటి మధ్య చాలా తేడా ఉంటుంది.
- ఒకవేళ
systemctl status sshdఆ unit విఫలమైందని చూపిస్తే, ఆ daemon తన socket ను పొందలేదని అర్థం. ఇది configuration లోపం లేదా SELinux denial కావచ్చు. - ఒకవేళ unit active లో ఉండి,
ss -tlnpద్వారా sshd కొత్త port కు bound అయిందని కనిపిస్తే, daemon సరిగ్గానే పనిచేస్తోంది. సమస్య నెట్వర్క్ మార్గంలో ఉంది: అంటే firewalld, ప్రొవైడర్ యొక్క ప్రత్యేక firewall, లేదా మీరు కనెక్ట్ అవ్వడానికి ప్రయత్నించిన address మరియు port లలో సమస్య ఉండవచ్చు.
SELinux సమస్య కోసం, ఊహించడం మానేసి audit record ను చదవండి:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagername_bind denial, tcp_socket class పై జరిగినప్పుడు, అది comm="sshd" లోని process ను, src= లోని port నంబర్ను, మరియు ఆ port కు ప్రస్తుతం ఉన్న label ను tcontext= లో చూపిస్తుంది. ఆ చివరి field లోనే సమాధానం ఉంటుంది. ssh_port_t కాకుండా మరేదైనా ఉంటే, మీరు ఉపయోగిస్తున్న port కు step 2 వర్తించలేదని అర్థం; సాధారణంగా ఇది port నంబర్లో టైపింగ్ తప్పు లేదా తప్పుడు protocol వల్ల జరుగుతుంది. audit record ను సులభంగా అర్థమయ్యే వాక్యాలుగా మార్చడానికి sealert కావాలనుకుంటే, setroubleshoot-server ను ఇన్స్టాల్ చేయండి.
Kernel bind అవ్వడానికి అనుమతించనప్పుడు sshd స్వయంగా రాసే సందేశం ఇలా ఉంటుంది:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.1024 పైన ఉన్న port పై Permission denied రావడం, అంటే bind అవ్వడానికి root అనుమతులు అవసరం లేని చోట, ఇది SELinux సంకేతం. అదే లైన్లో Address already in use కనిపిస్తే అది వేరే లోపం: మరొక process ఆ port ను ఆక్రమించి ఉందని అర్థం. క్లయింట్ వైపు నుండి, connection refused మరియు connection timed out మధ్య తేడా నెట్వర్క్ సమస్యలను వేరు చేస్తుంది. ఎందుకంటే connection refused అంటే మీ packet హోస్ట్కు చేరింది కానీ అక్కడ ఏ సేవ వినడం లేదు అని, connection timed out అంటే అసలు ఏ సమాధానం రాలేదని అర్థం.
పోర్ట్ 22ను మూసివేసి మీ క్లయింట్లను అప్డేట్ చేయండి
కొత్త పోర్ట్ ద్వారా అనేక లాగిన్లు విజయవంతంగా జరిగిన తర్వాత, 22వ పోర్ట్ను తొలగించండి:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allపోర్ట్ 22పై ఉన్న SELinux లేబుల్ను అలాగే వదిలేయండి. ఇది బేస్ పాలసీ నుండి వస్తుంది, మరియు ఫైర్వాల్ ప్యాకెట్లను అనుమతించడం ఆపివేసిన తర్వాత ఇది దేనినీ అనుమతించదు.
ఆ తర్వాత క్లయింట్లను సరిచేయండి, ఎందుకంటే డిఫాల్ట్ పోర్ట్ను ఉపయోగిస్తున్న ప్రతి టూల్కు ఇప్పుడు కొత్త పోర్ట్ గురించి తెలియజేయాలి. ప్రతిసారీ -p అని టైప్ చేసే బదులు, మీ స్వంత మెషీన్లో ఒక్కసారిగా ~/.ssh/config లో ఈ క్రింది విధంగా నమోదు చేయండి:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync మరియు Ansible అన్నీ ఆ ఫైల్ను చదువుతాయి. పోర్ట్ 22ను హార్డ్కోడ్ చేసిన బ్యాకప్ జాబ్లు, మానిటరింగ్ చెక్లు మరియు cron స్క్రిప్ట్లు ఆ ఫైల్ను చదవవు, కాబట్టి ఈ మార్పు మీ గుర్తులో తాజాగా ఉన్నప్పుడే వాటిని వెతికి సరిచేయండి.
పోర్ట్ మార్చడం వల్ల కలిగే ప్రయోజనాలు మరియు పరిమితులు
ఇది లాగ్ ఫైల్స్లో అనవసరమైన సమాచారాన్ని తగ్గిస్తుంది. ఆటోమేటెడ్ స్కానర్లు నిరంతరం port 22 పై దాడులు చేస్తుంటాయి, పోర్ట్ మార్చడం వల్ల ఆ లాగ్ ఎంట్రీలు తగ్గుతాయి, తద్వారా నిజమైన ఈవెంట్లను గుర్తించడం సులభం అవుతుంది. అయితే, ఇది భద్రతా చర్య కాదు. పూర్తి పోర్ట్ పరిధిని స్కాన్ చేసే ఏ స్కానర్ అయినా మీ daemon ను కనుగొని, దాని version banner ను చదవగలదు. పోర్ట్ మార్పును కేవలం నిర్వహణలో భాగంగా మాత్రమే చూడండి. నిజమైన భద్రత కోసం password లాగిన్లను నిలిపివేసి, key-only authentication ను అమలు చేయండి. దీని గురించి VPS కోసం SSH హార్డెనింగ్ గైడ్ లో దశలవారీగా వివరించబడింది.
పైన పేర్కొన్నవన్నీ రెండు ప్రధాన RHEL రీబిల్డ్స్పై ఒకేలా పనిచేస్తాయి, ఎందుకంటే అవి ఒకే మూలాల నుండి నిర్మించబడ్డాయి. మీరు ఇంకా దేనిని ఎంచుకోవాలో నిర్ణయించుకోకపోతే Rocky Linux మరియు AlmaLinux ల మధ్య పోలిక చూడండి. ఏదైనా పాత గైడ్ను అనుసరించే ముందు, cat /etc/os-release ఉపయోగించి మీకు ఏ release ఇవ్వబడిందో తనిఖీ చేయండి. Rocky Linux 8 కోసం రాసిన గైడ్లు ఇప్పటికీ బాగానే ఉన్నప్పటికీ, వాటిలోని semanage మరియు firewall-cmd దశలు సరైనవే అయినప్పటికీ, Rocky 8 లో sshd_config.d include లైన్ మరియు socket unit ఉండవు. కాబట్టి, ఆ గైడ్లలోని sshd కి సంబంధించిన అంశాలు ప్రస్తుత సిస్టమ్లతో సరిపోలవు.
fail2ban కు కొత్త పోర్ట్ గురించి తెలియజేయాలి
fail2ban బేస్ రిపోజిటరీలలో ఉండదు. ఇది EPEL (extra packages for enterprise Linux) నుండి వస్తుంది:
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldfail2ban-firewalld సబ్ప్యాకేజీ fail2ban తన నిషేధాలను (bans) firewalld ద్వారా అమలు చేసేలా చేస్తుంది, firewalld రూల్సెట్ను నియంత్రించే సర్వర్లో మీకు ఇదే కావాలి.
స్టాక్ sshd జైల్ port = ssh ను సెట్ చేస్తుంది, ఆ పేరు /etc/services ద్వారా 22 కి రిజాల్వ్ అవుతుంది. మీరు మార్పు చేసిన తర్వాత, ఆ జైల్ ఎవరూ దాడి చేయని పోర్ట్ను పర్యవేక్షిస్తుంది, కాబట్టి 2222 పోర్ట్ వద్ద విఫలమైన లాగిన్ ప్రయత్నాలు పెరుగుతున్నా అది ఎవరినీ నిషేధించదు. /etc/fail2ban/jail.local లో పోర్ట్ను నంబర్ ద్వారా సెట్ చేయండి:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd వైఫల్యాలను /var/log/secure నుండి కాకుండా జర్నల్ నుండి చదువుతుంది, rsyslog అందుబాటులో లేని మినిమల్ ఇన్స్టాలేషన్లో ఇది సురక్షితమైన ఎంపిక. దీన్ని sudo systemctl enable --now fail2ban తో ప్రారంభించండి మరియు sudo fail2ban-client status sshd తో జైల్ స్థితిని పరిశీలించండి. జైల్ సింటాక్స్ Ubuntu 24.04 లో SSH కోసం fail2ban సెటప్ లో ఉపయోగించిన దానిలాగే ఉంటుంది. ప్యాకేజీ సోర్స్ మరియు నిషేధ చర్య (ban action) మాత్రమే మారుతాయి.
పోర్ట్ కంటే ప్యాచింగ్ ముఖ్యం
SSH పోర్ట్ను మార్చి, నాలుగు నెలలుగా సెక్యూరిటీ అప్డేట్లు చేయని సర్వర్, పోర్ట్ 22పై ఉండి ప్రతి రాత్రి ఆటోమేటిక్గా ప్యాచింగ్ చేసుకునే సర్వర్ కంటే ప్రమాదకరమైన స్థితిలో ఉంటుంది. మీరు ఇప్పటికే root యూజర్గా లాగిన్ అయి ఉన్నప్పుడే, అదే సెషన్లో unattended updates ను ఎనేబుల్ చేయండి: Rocky Linux మరియు AlmaLinux లలో ఆటోమేటిక్ dnf అప్డేట్లు అనే గైడ్, టైమర్ను సెట్ చేయడం మరియు అప్డేట్లను డౌన్లోడ్ చేసి ఇన్స్టాల్ చేసే విధానాల గురించి వివరిస్తుంది.
FAQ
Rocky Linux లో port మార్చిన తర్వాత sshd ఎందుకు ప్రారంభం కాదు?
దాదాపు అన్ని సందర్భాల్లో SELinux port label లేకపోవడమే దీనికి కారణం. sshd అనేది sshd_t డొమైన్లో పరిమితంగా (confined) నడుస్తుంది, మరియు పాలసీ ప్రకారం ఇది కేవలం ssh_port_t అని లేబుల్ చేయబడిన పోర్టులకు మాత్రమే bind అవ్వగలదు. డిఫాల్ట్గా ఇది కేవలం 22వ పోర్టుకు మాత్రమే పరిమితం. Kernel ఈ bind అభ్యర్థనను తిరస్కరిస్తుంది, కాబట్టి daemon వినడం (listening) ప్రారంభించకుండానే నిలిచిపోతుంది. అప్పుడు journalctl -u sshd లో error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. వంటి లైన్ కనిపిస్తుంది. మీ పోర్ట్ నంబర్తో sudo semanage port -a -t ssh_port_t -p tcp 2222 కమాండ్ను రన్ చేసి, ఆపై సర్వీస్ను రీస్టార్ట్ చేయండి. ఒకవేళ semanage కమాండ్ దొరకకపోతే, ముందుగా policycoreutils-python-utils ప్యాకేజీని ఇన్స్టాల్ చేయండి.
SELinux permissive mode లో ఉన్నప్పుడు కూడా semanage అవసరమా?
అవును. Permissive mode లో ఉన్నప్పుడు, ఆ అభ్యర్థన తిరస్కరించబడినట్లు రికార్డ్ అవుతుంది కానీ bind అవ్వడానికి అనుమతి లభిస్తుంది, కాబట్టి మార్పు విజయవంతమైనట్లు కనిపిస్తుంది. కానీ వాస్తవానికి లేబుల్ ఇంకా ఉండదు. ఎవరైనా setenforce 1 రన్ చేసినప్పుడు, లేదా /etc/selinux/config లో SELINUX=enforcing తో సిస్టమ్ బూట్ అయినప్పుడు, sshd ఆ పోర్టుపై ప్రారంభం కావడం ఆగిపోతుంది. లేబుల్ను జోడించడం అనేది ఒకే కమాండ్ పని, ఇది భవిష్యత్తులో ఎటువంటి స్పష్టమైన కారణం లేకుండా వచ్చే వైఫల్యాలను నివారిస్తుంది.
పోర్ట్కు లేబుల్ ఉంది మరియు sshd నడుస్తోంది, మరి నా కనెక్షన్ ఎందుకు time out అవుతోంది?
Daemon నడుస్తోందంటే SELinux పరంగా అంతా సవ్యంగా ఉన్నట్లే, కాబట్టి ప్యాకెట్ లోపలికి వచ్చే దారిలోనే డ్రాప్ అవుతోంది. మీ పోర్ట్ కోసం sudo firewall-cmd --list-ports ను తనిఖీ చేయండి. --permanent రూల్ జోడించిన తర్వాత firewall-cmd --reload రన్ చేశారో లేదో నిర్ధారించుకోండి, ఎందుకంటే కేవలం permanent రూల్ మాత్రమే రన్ అవుతున్న ఫైర్వాల్పై ప్రభావం చూపదు. ఆ తర్వాత, VPS ముందు ఏదైనా నెట్వర్క్ ఫైర్వాల్ ఉందేమో మీ హోస్ట్ కంట్రోల్ ప్యానెల్లో తనిఖీ చేయండి. చాలామంది ఇక్కడే బ్లాక్ అవుతుంటారు, దీని గురించి ఆపరేటింగ్ సిస్టమ్ లోపల ఎటువంటి సమాచారం కనిపించదు.
22వ పోర్టుకు బదులుగా ఏ పోర్ట్ వాడాలి?
1024 నుండి 65535 మధ్య ఉన్న ఏదైనా ఖాళీ TCP పోర్టును వాడవచ్చు. నిజమైన సర్వర్లపై 2222 మరియు 22222 పోర్టులను వాడకండి, ఎందుకంటే స్కానర్లు 22 తర్వాత వీటినే ప్రయత్నిస్తాయి. sudo ss -tlnp తో ఆ పోర్ట్ ఖాళీగా ఉందో లేదో నిర్ధారించుకోండి, sudo semanage port -l తో SELinux పాలసీ ఇప్పటికే దాన్ని కేటాయించలేదని చూసుకోండి, మరియు భవిష్యత్తులో మీరు ఇన్స్టాల్ చేసే సర్వీసులకు కేటాయించిన పోర్టులను వదిలేయండి. గుర్తుంచుకోవడానికి కష్టంగా ఉండే పెద్ద నంబర్ను ఎంచుకోవడం మంచిది, ఎందుకంటే మీరు దాన్ని ఒక్కసారి ~/.ssh/config లో రాస్తే సరిపోతుంది, మళ్ళీ మళ్ళీ టైప్ చేయాల్సిన అవసరం ఉండదు.