Rocky மற்றும் AlmaLinux-ல் firewalld அமைப்பது எப்படி?
Rocky அல்லது AlmaLinux VPS-ல் SSH மற்றும் web port-களை திறப்பது எப்படி என்பதை அறிக. --permanent flag-ன் முக்கியத்துவம் மற்றும் zones பயன்பாடு குறித்த முழுமையான வழிகாட்டி.
firewalld என்றால் என்ன, Rocky மற்றும் AlmaLinux ஏன் அதை வழங்குகின்றன
firewalld என்பது Rocky Linux, AlmaLinux மற்றும் பிற Red Hat Enterprise Linux (RHEL) மறுபதிப்புகளில் இயல்பாக நிறுவப்பட்டிருக்கும் firewall மேலாளர் ஆகும். இந்த இரண்டு விநியோகங்களும் இந்தத் தேர்வை தாங்களாகவே எடுக்காமல், மரபு வழியாகப் பெற்றன. CentOS தனது போக்கை மாற்றிக்கொண்ட பிறகு, Red Hat-ன் பணிகளை Rocky மற்றும் AlmaLinux எவ்வாறு மறுசீரமைத்தன என்பதைப் புரிந்துகொண்டால், இது ஏன் என்பது தெளிவாகும். இது பாக்கெட்டுகளை நேரடியாக ஆய்வு செய்வதில்லை. இது சேமிக்கப்பட்ட உள்ளமைவை (configuration) வைத்துக்கொண்டு, அதை nftables விதிகளாக மாற்றுகிறது. firewall-cmd என்ற ஒரே கட்டளையைப் பயன்படுத்தி, server இயங்கிக்கொண்டிருக்கும்போதே மாற்றங்களைச் செய்ய முடியும். இந்த வழிகாட்டியில் உள்ள எந்தவொரு விஷயமும் இந்த இரண்டு விநியோகங்களுக்கும் இடையில் மாறுபடாது, ஏனெனில் Rocky மற்றும் AlmaLinux-ஐ வேறுபடுத்தும் விஷயங்கள் இணக்கத்தன்மை உறுதிமொழி மற்றும் ஆதரிக்கப்படும் CPU-களின் வரம்பு மட்டுமே, firewall அல்ல.
Ubuntu VPS-ல் ufw எவ்வாறு செயல்படுகிறது என்பது உங்களுக்கு ஏற்கனவே தெரிந்தால், இதன் பணியும் உங்களுக்குப் புரியும். ufw-ல் இல்லாத இரண்டு கருத்துகளை firewalld சேர்க்கிறது. முதலாவது zones: பாக்கெட்டுகள் வகைப்படுத்தப்படும் ஒரு பெயரிடப்பட்ட கொள்கை (policy). இரண்டாவது, நேரடி விதிகளுக்கும் (live rules) சேமிக்கப்பட்ட விதிகளுக்கும் (saved rules) இடையிலான பிரிவினை; இதுதான் --permanent flag மற்றும் இந்த கருவியில் குழப்பத்தை ஏற்படுத்தும் மிகப்பெரிய காரணியாகும்.
கீழே உள்ள அனைத்தும் உங்கள் சொந்த server-ல் நீங்கள் இயக்கும் கட்டளைகளாகும். ஒவ்வொரு மாற்றத்தையும் மற்றொரு கணினியிலிருந்து சோதிக்கவும், ஏனெனில் server-ல் சரியாகத் தோன்றும் ஒரு விதி, இணையத்திலிருந்து பார்க்கும்போது தவறாக இருக்கலாம்.
வேறெதையும் செய்வதற்கு முன் SSH-ஐத் திறக்கவும்
Rocky மற்றும் AlmaLinux நிறுவல்களில் பெரும்பாலானவற்றில் firewalld ஏற்கனவே நிறுவப்பட்டு இயங்கிக்கொண்டிருக்கும், மேலும் அதன் இயல்புநிலை கட்டமைப்பு SSH-ஐ அனுமதிக்கிறது. சில குறைந்தபட்ச (minimal) cloud images-ல் இது நீக்கப்பட்டிருக்கலாம். எனவே, ஊகிப்பதற்குப் பதிலாகச் சரிபார்க்கவும்.
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --statefirewall-cmd --state கட்டளையானது running-ஐ அச்சிடும். ஒருவேளை service நிறுத்தப்பட்டிருந்தால், மற்ற அனைத்து firewall-cmd அழைப்புகளும் FirewallD is not running என்று பதிலளித்து, non-zero exit status-ஐத் தரும். ஒரு கட்டளை எந்த மாற்றத்தையும் செய்யவில்லை என்று தோன்றினால், முதலில் இதைத்தான் சரிபார்க்க வேண்டும்.
தற்போது அனுமதிக்கப்பட்டுள்ளவை என்னவென்று இப்போது படிக்கவும்.
sudo firewall-cmd --list-allஉண்மையான output-ல் இன்னும் சில வரிகள் இருக்கும். அவற்றில் முக்கியமானவை இவை:
public (active)
target: default
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
rich rules:services: வரியில் உள்ள ssh தான் உங்கள் session தொடர்ந்து இயங்குவதற்குக் காரணம். அது இல்லை என்றால், வேறெந்த மாற்றத்தைச் செய்வதற்கு முன்பும் அதைச் சேர்க்கவும். ஏனெனில், SSH விதி இல்லாமல் firewall-ஐத் தொடங்கினால், உங்கள் session துண்டிக்கப்பட்டு, மீண்டும் உள்ளே நுழைய முடியாமல் போய்விடும்.
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reloadtarget: default என்பது, எதனுடனும் பொருந்தாத packet-கள் ICMP (internet control message protocol) host-prohibited பதிலுடன் நிராகரிக்கப்படும் என்பதைக் குறிக்கிறது. இதனால், மூடப்பட்ட port-ஐ அணுகும் client-க்கு உடனடியாக No route to host என்று காட்டும். target-ஐ DROP என அமைத்தால், server எந்தப் பதிலும் அளிக்காது (silent); இதனால் scanner-கள் timeout ஆகும் வரை காத்திருக்கும்.
sudo firewall-cmd --permanent --zone=public --set-target=DROP
sudo firewall-cmd --reloadஅதை இயக்குவதற்கு முன் அதன் விளைவை அறிந்துகொள்ளுங்கள்: DROP அமைப்பானது server ping-க்கு பதிலளிப்பதையும் நிறுத்திவிடும், எனவே உங்கள் கண்காணிப்பு அமைப்புகளும் (monitoring) எந்தத் தகவலையும் பெறாது.
எனது விதி ஏன் மறைந்துவிட்டது? --permanent flag
firewalld ஒரே நேரத்தில் இரண்டு உள்ளமைவுகளை (configurations) வைத்திருக்கிறது. runtime உள்ளமைவு என்பது kernel தற்போது அமல்படுத்தும் விதிகளாகும். permanent உள்ளமைவு என்பது /etc/firewalld/zones/public.xml-ல் சேமிக்கப்பட்டு, reload அல்லது reboot-க்குப் பிறகு மீண்டும் செயல்பாட்டுக்கு வருபவை ஆகும்.
--permanent இல்லாமல் ஒரு கட்டளையை இயக்கினால், அது runtime-ஐ மட்டுமே மாற்றும். இது உடனடியாகச் செயல்படும், ஆனால் அடுத்த reload அல்லது boot-க்குப் பிறகு மறைந்துவிடும். --permanent உடன் ஒரு கட்டளையை இயக்கினால், அது கோப்பில் மாற்றங்களைச் செய்யும், ஆனால் தற்போது இயங்கிக்கொண்டிருக்கும் எதையும் மாற்றாது; எனவே நீங்கள் reload செய்யும் வரை port மூடப்பட்டே இருக்கும். இதில் எந்தவொரு பிழையும் இல்லை. இரண்டுமே பயனர்களுக்கு ஆச்சரியத்தை அளிக்கலாம், ஏனெனில் கட்டளை இரண்டு முறைகளிலும் success என்ற செய்தியையே வெளியிடுகிறது.
ஒவ்வொரு முறையும் இரண்டு கட்டளைகளையும் சேர்த்துப் பயன்படுத்தவும்.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reloadநீங்கள் இரண்டு உள்ளமைவுகளையும் சரிபார்க்கலாம்; நீங்கள் செய்த பிழை எது என்பதைக் கண்டறிய இதுவே விரைவான வழியாகும்.
sudo firewall-cmd --list-services
sudo firewall-cmd --permanent --list-servicesமுதல் கட்டளை தற்போது இயங்கும் விதிகளை வெளியிடும். இரண்டாவது கட்டளை சேமிக்கப்பட்ட விதிகளை வெளியிடும். தற்போது இயங்கும் தொகுப்பில் ஒரு service இருந்து, சேமிக்கப்பட்ட தொகுப்பில் அது இல்லை என்றால், அடுத்த reload-ன் போது அந்த விதி நீக்கப்படும். சேமிக்கப்பட்ட தொகுப்பில் ஒரு விதி இருந்து, தற்போது இயங்கும் தொகுப்பில் அது இல்லை என்றால், நீங்கள் reload செய்ய மறந்துவிட்டீர்கள் என்று அர்த்தம். sudo firewall-cmd --runtime-to-permanent தற்போது இயங்கும் அனைத்து விதிகளையும் சேமிக்கப்பட்ட கோப்பிற்கு நகலெடுக்கும்; இது சோதனைகளுக்குப் பிறகு மிகவும் பயனுள்ளதாக இருக்கும்.
--reload connection tracking நிலையைப் பாதுகாக்கும், எனவே உங்கள் SSH session துண்டிக்கப்படாது. --complete-reload kernel modules-ஐயும் reload செய்யும், இதனால் அந்த நிலை இழக்கப்படும்; இது பொதுவாக உங்கள் session உட்பட அனைத்து திறந்த இணைப்புகளையும் துண்டித்துவிடும். சாதாரண reload-ஐப் பயன்படுத்தவும்.
இதில் ஒரு பாதுகாப்பு அம்சம் உள்ளது. ஒரு runtime விதி தானாகவே காலாவதியாகும்படி அமைக்கலாம்.
sudo firewall-cmd --add-service=http --timeout=5mஇந்த விதி ஐந்து நிமிடங்களுக்குப் பிறகு தானாகவே நீக்கப்படும். இதை --permanent உடன் இணைக்க முடியாது, அதுவே இதன் நோக்கம்: நீங்கள் உறுதியாக இல்லாத ஒரு மாற்றத்தைச் சோதிக்க இது பயன்படுகிறது. பழைய பாதுகாப்பு முறையே சிறந்தது. விதிகளை மாற்றும்போது இரண்டாவது SSH session-ஐத் திறந்து வைத்திருங்கள்; புதிய விதிகள் சரியாகச் செயல்படுகின்றன என்பதை உறுதிப்படுத்தும் வரை அதை மூடாதீர்கள்.
Zones மற்றும் VPS-ல் default zone மட்டும் ஏன் முக்கியமானது
Zone என்பது அதனுடன் இணைக்கப்பட்ட trust level-ஐக் கொண்ட அனுமதிகளின் தொகுப்பாகும். firewalld ஒவ்வொரு உள்வரும் packet-ஐயும் சரியாக ஒரு zone-ல் வகைப்படுத்துகிறது. இது packet-ன் source address-ஐ ஒவ்வொரு zone-ன் sources: பட்டியலுடனும் முதலில் ஒப்பிடுகிறது. எதுவும் பொருந்தவில்லை எனில், உள்வரும் interface எந்த zone-உடன் இணைக்கப்பட்டுள்ளதோ அதைப் பயன்படுத்துகிறது. ஒரு interface எந்த zone-உடனும் இணைக்கப்படவில்லை எனில், packet default zone-க்குச் செல்கிறது.
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zonesஒரே ஒரு network interface கொண்ட VPS-ல், முதல் விடை பெரும்பாலும் public ஆக இருக்கும்; இதுவே நீங்கள் பயன்படுத்தப்போகும் ஒரே zone ஆகும். --zone= argument இல்லாத firewall-cmd கட்டளைகள் default zone-ல் செயல்படும்; இதனால்தான் இந்த வழிகாட்டியில் உள்ள ஒவ்வொரு சிறிய கட்டளையும் zone-ஐக் குறிப்பிடாமலேயே வேலை செய்கிறது.
ஒரு மதிய நேரத்தை வீணடிக்கும் தோல்வி இதோ. ஒருவேளை interface வேறொரு zone-உடன் இணைக்கப்பட்டிருந்தால், உங்கள் விதிகள் public-ல் அமையும், ஆனால் traffic வேறொரு இடத்தில் கையாளப்படும். இதனால் நீங்கள் சேர்க்கும் எதற்கும் எந்த விளைவும் இருக்காது, எந்த எச்சரிக்கையும் வராது. --get-active-zones அந்த இணைப்பைக் காட்டுகிறது:
public
interfaces: eth0interface வேறொரு zone பெயரின் கீழ் இருந்தால், --zone= மூலம் உங்கள் விதிகளை அங்கே எழுதவும் அல்லது interface-ஐ மாற்றவும்.
sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reloadRocky மற்றும் AlmaLinux-ல் NetworkManager தான் interface-களை நிர்வகிக்கிறது, மேலும் connection தொடங்கும் போது அது zone-ஐ மீண்டும் உறுதிப்படுத்துகிறது. எனவே, reboot செய்தாலும் உங்கள் மாற்றங்கள் மாறாமல் இருக்க, அங்கேயும் இதை அமைக்கவும். முதல் கட்டளையிலிருந்து connection பெயரைப் பெறவும், ஏனெனில் அது பெரும்பாலும் device பெயராக இருப்பதில்லை.
sudo nmcli connection show
sudo nmcli connection modify "System eth0" connection.zone publicSource matching என்பது interface matching-ஐ விட முன்னுரிமை பெறும்; இதன் மூலமே ஒரு குறிப்பிட்ட address-க்குத் தனிப்பட்ட policy-ஐ வழங்க முடியும். உள்ளமைக்கப்பட்ட trusted zone அனைத்தையும் அனுமதிக்கிறது.
sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.10/32
sudo firewall-cmd --reloadஅதில் கவனமாக இருக்கவும். இது அந்த address-க்கு server-ல் உள்ள அனைத்து port-களையும் திறந்துவிடும், நீங்கள் private என்று நினைத்த database-ம் இதில் அடங்கும். ஒரு host-ஐ மட்டும் அனுமதிக்காமல், ஒரு குறிப்பிட்ட port-ஐ மட்டும் அனுமதிக்க விரும்பினால் rich rule-ஐப் பயன்படுத்தவும்.
firewalld service என்றால் என்ன?
ஒரு service என்பது XML கோப்பாக வழங்கப்பட்ட, பெயரிடப்பட்ட ports தொகுப்பாகும். --add-service=https என்பது 443/tcp-ஐத் திறக்கிறது, ஏனெனில் /usr/lib/firewalld/services/https.xml என்பது https எதைக் குறிக்கிறது என்பதை வரையறுக்கிறது.
sudo firewall-cmd --get-services
sudo firewall-cmd --info-service=https--info-service அந்தப் பெயருக்குப் பின்னால் மறைந்திருக்கும் ports-ஐக் காட்டுகிறது:
https
ports: 443/tcpஒரு பெயர் இருக்கும்போது அதையே பயன்படுத்தவும். இது ஆறு மாதங்களுக்குப் பிறகு --list-all-ல் பார்க்கும்போது தெளிவாகப் புரியும், மேலும் Cockpit போன்ற தொகுப்புகள் அவற்றின் சொந்த service கோப்பை நிறுவுகின்றன. வரையறை இல்லாத எதற்கும் --add-port-ஐப் பயன்படுத்தவும்.
கவனிக்க வேண்டிய இடைவெளி: ssh service என்பது 22/tcp-ஐ மட்டுமே குறிக்கும். நீங்கள் SSH-ஐ மற்றொரு port-க்கு மாற்றியிருந்தால், server-ல் SSH access-ஐ பலப்படுத்துதல் பகுதியில் உள்ளபடி, --add-service=ssh நீங்கள் உண்மையில் பயன்படுத்தும் port-ஐத் திறக்காது.
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reloadRHEL-ஐ மீண்டும் கட்டமைக்கும்போது அந்தத் கதவில் இரண்டாவது பூட்டு இருக்கும். SELinux (security-enhanced Linux) port எண்களுக்கு லேபிள்களை இடுகிறது, மேலும் sshd அதன் லேபிள்களுக்கு வெளியே உள்ள ஒரு port-ல் bind செய்ய அனுமதிக்கப்படாது. அப்போது அது தொடங்க மறுக்கும் மற்றும் log-ல் error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. என்று காட்டும். முதலில் அந்த port-க்கு லேபிளிடுங்கள்.
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222தற்போது எந்தெந்த ports திறந்திருக்கின்றன என்பதை எவ்வாறு பார்ப்பது?
sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo nft list table inet firewalld | head -n 40முதல் இரண்டு கட்டளைகளும் firewalld-ன் தரவுகளைக் காட்டுகின்றன. மூன்றாவது கட்டளை, kernel-ல் உள்ள firewalld-க்கு சொந்தமான அட்டவணையில் உள்ள விதிகளை நேரடியாகப் படிக்கிறது. இவை அனைத்தும் ஒரே தகவலைக் காட்ட வேண்டும்.
இவை மட்டும் போதாது. வேறொரு கணினியிலிருந்து சோதிக்கவும்:
nc -zv 203.0.113.20 443இந்தச் சோதனையை server-லேயே இயக்க வேண்டாம். loopback interface-க்கு வரும் அனைத்து இணைப்புகளையும் firewalld அனுமதிக்கும், எனவே உங்கள் விதிகள் எப்படி இருந்தாலும் curl http://localhost:8080 வெற்றி பெறும். இந்தச் சோதனை service இயங்குகிறது என்பதை மட்டுமே உறுதிப்படுத்தும். இது firewall-ஐப் பற்றி எதையும் தெரிவிக்காது.
இணைய போர்ட்டை அனுமதித்தல்
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-servicesகடைசியாக இயக்கிய கட்டளை, ஏற்கனவே இருந்தவற்றுடன் http https-ஐயும் பட்டியலிட வேண்டும். தளம் இன்னும் பதிலளிக்கவில்லை என்றால், firewall-ல் சிக்கல் இருக்க வாய்ப்பில்லை. ஒரு விதி பாக்கெட்டை (packet) மட்டுமே அனுமதிக்கும். அதை ஏற்கும் வகையில் ஒரு process அந்த போர்ட்டில் இயங்கிக்கொண்டிருக்க வேண்டும்.
sudo ss -tlnp0.0.0.0:443 அல்லது *:443 எனக் காட்டப்படும் socket, எந்த முகவரியிலிருந்தும் வரும் இணைப்புகளை ஏற்கும். 127.0.0.1:443 எனக் காட்டப்படும் socket, loopback-ல் மட்டுமே பதிலளிக்கும்; எந்த firewall விதியாலும் அதை வெளியிலிருந்து அணுக முடியாது. Linux-ல் போர்ட்கள் மற்றும் லிசனிங் சாக்கெட்டுகள் இந்த வேறுபாட்டைப் பற்றி விரிவாக விளக்குகிறது.
ஒரு port-ஐ மீண்டும் மூடுவது எப்படி?
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reloadஇங்கும் --permanent விதி பொருந்தும், இது இந்த திசையில் இன்னும் தீவிரமாகச் செயல்படும். ஒரு service-ஐ runtime-ல் இருந்து மட்டும் நீக்கினால், port மூடப்பட்டது போலத் தோன்றும்; ஆனால் அடுத்த முறை reload அல்லது reboot செய்யும்போது, சேமிக்கப்பட்ட கோப்பிலிருந்து அது மீண்டும் திறக்கப்படும். இது நீங்கள் கவனிக்காத ஒரு பாதுகாப்பு ஓட்டையாக அமையும், ஏனெனில் நீங்கள் செய்த சரிபார்ப்பு (check) வெற்றிகரமாக முடிந்திருக்கும்.
ஒருபோதும் இல்லாத ஒன்றை நீக்க முயற்சித்தால், அது Warning: NOT_ENABLED: http என்று காட்டும், ஆனாலும் exit code 0-ஐயே தரும். ஒரே விஷயத்தை இரண்டு முறை சேர்த்தால் Warning: ALREADY_ENABLED: http என்று காட்டும். இவை இரண்டுமே பாதுகாப்பானவை. தவறாக எழுதப்பட்ட பெயர் வேறுபட்டது: Error: INVALID_SERVICE என்றால், firewalld-ல் அந்தப் பெயரில் எந்த வரையறையும் இல்லை என்றும், எதையும் மாற்றவில்லை என்றும் பொருள்.
உங்கள் --list-all-ல் cockpit என்று காட்டப்பட்டு, நீங்கள் port 9090-ல் உள்ள Cockpit web console-ஐப் பயன்படுத்தவில்லை என்றால், அதை நீக்கிவிடவும். திறந்திருக்கும் ஒவ்வொரு port-ம் நீங்கள் patch செய்து பராமரிக்க வேண்டிய ஒரு service ஆகும். நீங்கள் வைத்திருக்க முடிவு செய்யும் service-களுக்கு, dnf-automatic மூலம் security updates-ஐ ஒரு குறிப்பிட்ட கால இடைவெளியில் தானாகவே நிறுவலாம், இதனால் அந்தப் பணியைச் செய்ய நீங்கள் நினைவில் வைத்திருக்க வேண்டிய அவசியமில்லை. இருப்பினும், ஒரு patch-ஐ நிறுவுவது என்பது அதை இயக்குவது போன்றதல்ல; எனவே, updates வந்த பிறகு needs-restarting கட்டளையைப் பயன்படுத்தி, எந்தெந்த services இன்னும் பழைய libraries-ஐப் பயன்படுத்துகின்றன என்பதைக் கண்டறியலாம்.
ஒரு குறிப்பிட்ட source address-க்கு மட்டும் port-ஐக் கட்டுப்படுத்துதல்
Plain service name மூலம் நீங்கள் விரும்பும் கட்டுப்பாட்டைச் செயல்படுத்த முடியாதபோது, Rich rules-ஐப் பயன்படுத்தலாம். SSH-ஐ ஒரு அலுவலக முகவரிக்கு மட்டும் கட்டுப்படுத்த இரண்டு கட்டளைகள் தேவை; இதில் இரண்டாவது கட்டளையைத்தான் பலரும் மறந்துவிடுகிறார்கள்.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="ssh" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reloadZone என்பது அனுமதிகளின் தொகுப்பாகும்; இது முதல் பொருத்தத்துடன் நின்றுவிடும் வரிசைப்படுத்தப்பட்ட பட்டியல் அல்ல. Rich rule ஒரு குறிப்பிட்ட முகவரிக்கு மட்டும் accept அனுமதியைச் சேர்க்கிறது. இது யாரையும் தடுக்காது. ssh இன்னும் services: வரியில் இருக்கும் வரை, ஒட்டுமொத்த இணையமும் port 22-ஐ அணுக முடியும்; இந்த rich rule-ஆல் எந்த மாற்றத்தையும் ஏற்படுத்த முடியாது. எனவே, பொதுவான entry-ஐ நீக்க வேண்டும், இல்லையெனில் இந்த குறுகிய கட்டுப்பாடு வெறும் அலங்காரமாகவே இருக்கும்.
Service name இல்லாத port-க்கு, அதற்குப் பதிலாக port எண்ணைக் குறிப்பிடவும்.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port port="5432" protocol="tcp" accept'அதிகப்படியான நெட்வொர்க் இடையூறுகளைத் தவிர்க்கவும், பதிவுகளைப் பராமரிக்கவும், log element-ஐ action-க்கு முன்னால் வைக்க வேண்டும்; Rich rule மொழியின் கட்டமைப்பு இவ்வாறே எதிர்பார்க்கிறது.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" log prefix="fw-drop " level="info" limit value="3/m" drop'
sudo firewall-cmd --reload
sudo journalctl -k -g fw-droplimit மதிப்பு, அதிகப்படியான பாக்கெட்டுகள் journal-ஐ நிரப்புவதைத் தடுக்கிறது. SSH-ஐ ஒரு குறிப்பிட்ட முகவரிக்கு மட்டும் கட்டுப்படுத்தும் முன், அந்த முகவரி நிலையானது என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள். மாறும் IP முகவரி கொண்ட வீட்டு இணைய இணைப்பைப் பயன்படுத்தினால், IP மாறும் நாளில் நீங்கள் வெளியேற்றப்படுவீர்கள். எனவே, முதலில் உங்கள் provider-ன் console access சரியாகச் செயல்படுகிறதா என்பதைச் சோதித்துக்கொள்ளுங்கள்.
ufw கட்டளைகளும் அவற்றின் firewall-cmd இணையான கட்டளைகளும்
ஒரே பணிகள், வெவ்வேறு கருவிகள். ஒவ்வொரு --permanent வரியையும் தொடர்ந்து ஒரு sudo firewall-cmd --reload இருக்க வேண்டும், இது போன்ற பட்டியல்களில் காட்ட முடியாத ஒரே விஷயம் இதுதான்.
sudo ufw enableஎன்பதுsudo systemctl enable --now firewalldஆகிறதுsudo ufw disableஎன்பதுsudo systemctl disable --now firewalldஆகிறதுsudo ufw status verboseஎன்பதுsudo firewall-cmd --list-allஆகிறதுsudo ufw allow OpenSSHஎன்பதுsudo firewall-cmd --permanent --add-service=sshஆகிறதுsudo ufw allow 443/tcpஎன்பதுsudo firewall-cmd --permanent --add-port=443/tcpஆகிறதுsudo ufw delete allow 443/tcpஎன்பதுsudo firewall-cmd --permanent --remove-port=443/tcpஆகிறதுsudo ufw allow from 203.0.113.10 to any port 22என்பது மேலே காட்டப்பட்டுள்ள rich rule ஆகிறதுsudo ufw reloadஎன்பதுsudo firewall-cmd --reloadஆகிறதுsudo ufw default deny incomingஎன்பதுpubliczone எவ்வாறு செயல்படுகிறது என்பதைக் குறிக்கிறது, மேலும்--set-target=DROPஎன்பது அதன் அமைதியான (silent) பதிப்பாகும்sudo ufw logging onஎன்பதுsudo firewall-cmd --set-log-denied=allஆகிறது
ஒரு முக்கிய வேறுபாட்டைத் தெளிவாகக் குறிப்பிடுவது அவசியம். ufw ஒரு எண்ணிடப்பட்ட பட்டியலைப் பராமரிக்கிறது, எனவே நீங்கள் ஒரு விதியை 1-வது இடத்தில் சேர்க்க முடியும். firewalld-ல் விதி எண்கள் கிடையாது, எனவே "இந்த விதியை முதலில் வைக்கவும்" என்பதற்கு அங்கு அர்த்தமில்லை. இரண்டு firewalld உள்ளீடுகள் ஒன்றுக்கொன்று முரணாகத் தோன்றினால், பொதுவான (broad) accept விதியே வெற்றிபெறும், ஏனெனில் அந்தத் தொகுப்பில் எதையும் மறுக்கும் (deny) விதி இல்லை. நீங்கள் அந்தப் பொதுவான உள்ளீட்டை நீங்களே நீக்க வேண்டும்.
Firewall மூடப்பட்டிருந்தாலும் எனது Docker container ஏன் அணுக முடிகிறது?
ஏனெனில், வெளியிடப்பட்ட (published) container port, உங்கள் zone கட்டுப்படுத்தும் firewall பகுதிக்குச் செல்வதில்லை. docker run -d -p 8080:80 nginx, Docker-ஐ அதன் சொந்த NAT (network address translation) மற்றும் forwarding விதிகளை எழுதச் சொல்கிறது. 8080 port-க்கு வரும் ஒரு packet மாற்றியமைக்கப்பட்டு, container-க்கு அனுப்பப்படுகிறது; எனவே அது host-க்கு வழங்கப்படாமல், நேரடியாக forward செய்யப்படுகிறது. உங்கள் zone-ல் உள்ள services: மற்றும் ports: வரிகள், host-க்கு வழங்கப்படும் packet-களை மட்டுமே கட்டுப்படுத்துகின்றன. Docker-ன் விதிகள் forward பாதையைக் கட்டுப்படுத்துகின்றன, அவை அவற்றை ஏற்றுக்கொள்கின்றன.
இதன் விளைவாக, sudo firewall-cmd --list-all கட்டளையில் 8080 port காட்டப்படாது, ஆனால் மற்றொரு machine-லிருந்து nc -zv 203.0.113.20 8080 மூலம் இணைக்க முடியும். Docker என்ன நிறுவியுள்ளது என்பதைப் பாருங்கள்:
sudo iptables -t nat -L DOCKER -nஇதற்கான தீர்வு publish flag-ல் உள்ளது. Port-ஐ loopback-ல் பிணைத்து (bind), அதன் முன்னால் ஒரு reverse proxy-ஐ வைக்கவும்.
docker run -d -p 127.0.0.1:8080:80 nginxஇப்போது container, server-ல் உள்ள curl http://127.0.0.1:8080-க்கு மட்டுமே பதிலளிக்கும், வெளியிலிருந்து வரும் எதற்கும் பதிலளிக்காது. Ubuntu பயனர்களும் இதே சிக்கலைச் சந்திக்கின்றனர், இது Docker containers ஏன் ufw-ஐத் தாண்டி ports-ஐ வெளியிடுகின்றன என்பதில் விவரிக்கப்பட்டுள்ளது. Rocky மற்றும் AlmaLinux-ன் base repositories-ல் உள்ள Rootful Podman-ம் அதே NAT அணுகுமுறையில்தான் ports-ஐ வெளியிடுகிறது, எனவே zone list-ஐ நம்புவதை விட, மற்றொரு machine-லிருந்து சோதித்துப் பாருங்கள். அந்த மேலோட்டமான செயல்பாடே இந்த distributions-ல் Docker Engine-ஐ நிறுவுவதற்கு Ubuntu வழிகாட்டியில் இல்லாத சில கூடுதல் படிகள் தேவைப்படுவதற்குக் காரணம்; Podman ஏற்கனவே docker கட்டளையைக் கொண்டிருப்பதே இதற்கான தொடக்கம்.
Reboot-க்கு பிறகும் நிலைத்திருக்கச் செய்தல் மற்றும் நீங்கள் சந்திக்கும் பிழைகள்
sudo systemctl is-enabled firewalld
sudo systemctl status firewalldenabled மற்றும் active (running) ஆகியவை உங்களுக்குத் தேவையானவை. இயங்கிக்கொண்டிருக்கும் ஆனால் enable செய்யப்படாத firewall, முதல் reboot வரை மட்டுமே உங்களைப் பாதுகாக்கும். புதிய VPS-ல் முதல் பத்து நிமிடங்கள் என்ற பட்டியலில், SSH keys மற்றும் updates-க்கு அடுத்தபடியாக இந்தச் சரிபார்ப்பைச் சேர்க்க வேண்டும்.
Raw nftables கட்டளைகளும் firewalld-ம் ஒன்றாகச் செயல்படாது. firewalld என்பது inet firewalld என்ற table-ஐக் கட்டுப்படுத்துகிறது. sudo nft flush ruleset அதை நீக்கிவிடும், அதன் பிறகு server அனைத்துத் தொடர்புகளுக்கும் திறந்துவிடும். firewall-cmd --list-all உங்கள் கட்டளைகளைக் காட்டும், ஏனெனில் kernel-ல் உள்ளதை விட, தான் கருதுவதையே firewalld அறிக்கையாகத் தரும். sudo firewall-cmd --reload விதிகளை மீண்டும் நிறுவும். விதிகளை firewall-cmd மூலம் எழுதினால் மட்டுமே, reload செய்த பிறகு அவை மீண்டும் வரும்.
ஒரே server-ல் இரண்டு firewall மேலாளர்கள். firewalld-க்கு அருகில் ufw அல்லது iptables-services-ஐ நிறுவுவது, ஒன்றையொன்று அறியாத இரண்டு நிரல்களை விதிகளை எழுத அனுமதிக்கும். இதில் எது கடைசியாகத் தொடங்குகிறதோ அதுவே வெற்றி பெறும். ஏதேனும் ஒன்றை மட்டும் தேர்வு செய்யவும். Rocky மற்றும் AlmaLinux-ல், distribution ஆதரவு கொண்ட firewalld-ஐப் பயன்படுத்துவதே சிறந்தது.
Server-க்கு முன்னால் உள்ள provider firewall. பல VPS panels-ல் தனிப்பட்ட network firewall இருக்கும். --list-all ஒரு port திறந்திருப்பதாகக் காட்டியும், வெளியிலிருந்து இணைப்பு தோல்வியடைந்தால், server-ல் மாற்றங்களைச் செய்வதற்கு முன் panel-ஐச் சரிபார்க்கவும். இது தலைகீழாகவும் நடக்கும்: panel-ல் விதி திறந்திருந்தாலும், firewalld packet-ஐ நிராகரித்தால் இணைப்பு கிடைக்காது.
sudo இல்லாமல் firewall-cmd-ஐ இயக்குதல். ஒவ்வொரு மாற்றத்திற்கும் root அதிகாரம் தேவை. அது இல்லையென்றால், அங்கீகாரச் சரிபார்ப்பால் கோரிக்கை நிராகரிக்கப்படும், எதுவும் மாற்றப்படாது. இது கட்டளை புறக்கணிக்கப்பட்டது போலத் தோன்றும்.
பெரும்பாலான நாட்களுக்கு இந்த ஆறு கட்டளைகள் போதுமானவை: நிலையை அறிய --list-all, எதையாவது திறக்க --permanent --add-service அல்லது --add-port, அதை மூட --permanent --remove-service, சேமிக்கப்பட்ட கோப்பைச் செயல்படுத்த --reload, மற்றும் சோதனைகளுக்குப் பிறகு --runtime-to-permanent. Zone என்பது public, flag என்பது --permanent, மேலும் உண்மையான சரிபார்ப்பு மற்றொரு machine-லிருந்து மட்டுமே கிடைக்கும்.
FAQ
reboot செய்த பிறகு எனது firewalld விதி ஏன் மறைந்துவிட்டது?
அந்த விதி runtime configuration-ல் மட்டுமே சேர்க்கப்பட்டது. sudo firewall-cmd --add-service=http உடனடியாகச் செயல்படும், ஆனால் அடுத்த முறை reload செய்யும்போது அல்லது reboot செய்யும்போது அது நீக்கப்படும், ஏனெனில் /etc/firewalld/zones/public.xml-ல் உள்ள சேமிக்கப்பட்ட configuration மாற்றப்படவில்லை. --permanent-ஐச் சேர்த்து, பின் sudo firewall-cmd --reload-ஐ இயக்கவும். நீங்கள் ஏற்கனவே கைமுறையாகச் சேர்த்த விதிகளைத் தக்கவைக்க, sudo firewall-cmd --runtime-to-permanent-ஐ இயக்கவும்; இது தற்போதைய விதிகளைச் சேமிக்கப்பட்ட கோப்பிற்கு நகலெடுக்கும்.
--permanent கொண்டு விதியைச் சேர்த்த பிறகு ஏன் எந்த மாற்றமும் இல்லை?
ஏனெனில் --permanent கோப்பை மட்டுமே எழுதும், இயங்கிக்கொண்டிருக்கும் firewall-ஐ மாற்றாது. sudo firewall-cmd --reload மூலம் சேமிக்கப்பட்ட configuration kernel-ல் ஏற்றப்படும் வரை அந்த port மூடியே இருக்கும். sudo firewall-cmd --list-services மற்றும் sudo firewall-cmd --permanent --list-services-ஐ ஒப்பிட்டுப் பார்க்கவும்: சேமிக்கப்பட்ட பட்டியலில் ஒரு entry இருந்து, தற்போதைய பட்டியலில் அது இல்லை என்றால், நீங்கள் reload செய்யத் தவறிவிட்டீர்கள் என்று அர்த்தம்.
நான் --add-service அல்லது --add-port எதைப் பயன்படுத்த வேண்டும்?
நீங்கள் இயக்கும் சேவைக்கு ஒரு பெயர் இருக்கும்போது --add-service-ஐப் பயன்படுத்தவும். இது உங்கள் நோக்கத்தைத் தெளிவாகக் குறிக்கும், மேலும் அந்தப் பெயர் எந்தெந்த ports-ஐ உள்ளடக்கியது என்பதை sudo firewall-cmd --info-service=https காட்டும். உங்கள் சேவைக்கு எந்த வரையறையும் இல்லாதபோது அல்லது அது standard அல்லாத port-ல் இயங்கும்போது --add-port-ஐப் பயன்படுத்தவும். ssh சேவை என்பது 22/tcp-ஐ மட்டுமே குறிக்கும், எனவே SSH-ஐ 2222-க்கு மாற்றினால், --add-port=2222/tcp மற்றும் அந்த port-க்கான SELinux label தேவைப்படும்.
firewall-cmd-ல் port மூடப்பட்டிருப்பதாகக் காட்டியும், எனது Docker container ஏன் அணுக முடிகிறது?
ஒரு published port, Docker-ன் சொந்த NAT விதிகளால் மாற்றப்பட்டு container-க்கு அனுப்பப்படுகிறது. எனவே, அந்த packet host-க்கு வழங்கப்படுவதில்லை; ஒரு zone-ன் service மற்றும் port பட்டியல்கள் host-க்கு வரும் packets-ஐ மட்டுமே கட்டுப்படுத்தும். --list-all எதையும் காட்டாதபோதும், container இணையத்திலிருந்து பதிலளிக்கும். அதற்குப் பதிலாக docker run -d -p 127.0.0.1:8080:80 nginx மூலம் loopback-ல் publish செய்து, முன்னால் ஒரு reverse proxy-ஐ அமைக்கவும்.
firewalld-க்கு பதிலாக Rocky Linux-ல் ufw-ஐ நிறுவலாமா?
ஒரே server-ல் இரண்டு firewall மேலாளர்கள் இருந்தால், அவை ஒன்றுக்கொன்று தெரியாமல் விதிகளை எழுதும். எந்த சேவை கடைசியாகத் தொடங்குகிறதோ அதன் விதிகளே நிலைத்திருக்கும். Rocky Linux மற்றும் AlmaLinux-ல் firewalld மட்டுமே ஆதரிக்கப்படும் கருவி; அது ஏற்கனவே நிறுவப்பட்டிருக்கும், மேலும் அது ufw பயன்படுத்தும் அதே nftables backend-ஐத்தான் இயக்குகிறது. default zone மற்றும் --permanent flag-ஐப் புரிந்துகொண்டால், இந்த முழு கருவியையும் நீங்கள் எளிதாகக் கையாளலாம்.