UFW IPv6 సమస్య: VPSలో తెరిచి ఉన్న ports ఎలా మూసివేయాలి
UFW మరియు cloud firewall IPv4కే పరిమితమైతే VPS services IPv6 ద్వారా అందరికీ తెరిచి ఉంటాయి. Ubuntu 24.04లో కారణం, ports పరిశీలన, పరిష్కారం తెలుసుకోండి.
ఒక వాక్యంలో IPv6 firewall సమస్య
మీ firewall IPv4 ను రక్షిస్తుంది. మీ VPS కు public IPv6 address కూడా ఉండే అవకాశం చాలా ఎక్కువ, అలాగే అనేక services default గా దానిపై listen చేస్తాయి. మీ firewall IPv4 ను మాత్రమే కవర్ చేస్తే, లేదా IPv4 ను మాత్రమే filter చేసే cloud firewall పై ఆధారపడితే, IPv4 వైపు సురక్షితంగా కనిపిస్తున్నప్పటికీ ఆ services అన్నీ IPv6 ద్వారా మొత్తం internet నుంచి చేరుకోగలిగే స్థితిలో ఉంటాయి. మీరు curl తో port ను test చేసి connection refused అని చూస్తారు, కాబట్టి సురక్షితంగా ఉన్నామని భావిస్తారు. కానీ attacker అదే port కు IPv6 ద్వారా connect అయి లోపలికి ప్రవేశిస్తాడు.
సాధారణ Ubuntu 24.04 VPS లో ఈ gap ఎక్కడి నుంచి వస్తుందో, మీరు ఖచ్చితంగా ఏ ports ను బయటకు expose చేస్తున్నారో ఎలా చూడాలో, దాన్ని ఎలా మూసివేయాలో ఈ guide చూపిస్తుంది. ఇక్కడ UFW కారణం కాదు. ఆధునిక Ubuntu install లో UFW ఇప్పటికే IPv6 ను handle చేస్తుంది. Exposure కు కారణం దాని చుట్టూ ఉన్న layers మరియు ఏ services listen చేస్తున్నాయో మీకు తెలియకపోవడమే.
మీ VPS అసలు IPv6పై ఎందుకు అందుబాటులో ఉంది
ఈరోజు దాదాపు ప్రతి VPSకూ దాని IPv4 address తో పాటు public IPv6 address కూడా అందుతుంది. చాలాసార్లు ఇది మొత్తం /64 అయి ఉంటుంది. మీదాన్ని పరిశీలించండి:
ip -6 addr show scope global2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet6 2001:db8:2a::1/64 scope globalఆ 2001:db8:2a::1 internetలో ఎక్కడి నుంచైనా route చేయగలిగేది. ఇది మీ IPv4 address లాగే ఉంటుంది. ఇప్పుడు ఏ సేవలు listeningలో ఉన్నాయో చూడండి:
sudo ss -tlnpState Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 [::]:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:8080 docker-proxyLocal Address column ను జాగ్రత్తగా పరిశీలించండి. 0.0.0.0:22 అంటే “ప్రతి IPv4 addressపై listen చేయి” అని అర్థం. [::]:22 అంటే “ప్రతి IPv6 addressపై listen చేయి” అని అర్థం. 127.0.0.1:5432 loopbackకు bind అయి ఉంటుంది. ఇది public కాదు. అందువల్ల Postgres line సురక్షితంగా ఉంది. రెండు [::] lines మొత్తం internet నుంచి IPv6 ద్వారా వచ్చే అభ్యర్థనలకు సమాధానం ఇస్తాయి. docker-proxy line మీరు ప్రారంభించిన విషయం మరిచిపోయే రకమైన సేవకు చెందుతుంది.
చాలా daemons సాధారణంగా :: కు bind అవుతాయి. Linuxలో :: socket సాధారణంగా IPv4 అభ్యర్థనలను కూడా స్వీకరిస్తుంది. అందువల్ల కొత్త server యొక్క default స్థితి ఇలా ఉంటుంది: “రెండు stacksపై, అన్ని interfacesలో అభ్యర్థనలకు సమాధానం ఇవ్వడం.” దీనికి అడ్డుగా నిలిచేది మీ firewall మాత్రమే. అందుకే ఒకే stackను మాత్రమే చూసే firewall నిజమైన సమస్యగా మారుతుంది.
IPv6 లో ఖాళీ వాస్తవంగా ఎక్కడి నుంచి వస్తుంది
సాధారణంగా దీనికి నాలుగు కారణాలు ఉంటాయి. ఒక serverలో వీటిలో ఒకటి లేదా ఒకేసారి అనేక కారణాలు ఉండవచ్చు.
1. IPv4 ను మాత్రమే filter చేసే cloud firewall. అనేక provider firewalls మరియు security-group products మొదట IPv4 చుట్టూ రూపొందించబడ్డాయి. అవి IPv6 ను పట్టించుకోకపోవచ్చు లేదా మీరు మాన్యువల్గా జోడించాల్సిన ప్రత్యేక IPv6 rules అవసరం కావచ్చు. మీ ఏకైక firewall provider dashboard లో ఉన్నదే అయి, అది IPv6 ను కవర్ చేయకపోతే, IPv4 లో port 22 గురించి అది ఏమి చూపించినా మీ [::] services తెరిచి ఉంటాయి. మీ provider firewall documentation చదివి, ముఖ్యంగా IPv6 అనే పదం కోసం చూడండి.
2. ip6tables లేకుండా స్వయంగా రాసిన iptables. iptables command IPv4 tables ను మాత్రమే మారుస్తుంది. IPv6 కోసం పూర్తిగా వేరు command అయిన ip6tables ఉంటుంది. దీనికి వేరు rules ఉంటాయి. మీరు iptables -A INPUT ... lines తో firewall script రాసి, వాటికి సరిపోలే ip6tables rules ఎప్పుడూ రాయకపోతే, మీ IPv6 firewall ఖాళీగా ఉంటుంది. Default ACCEPT policy ఉన్న ఖాళీ INPUT chain ప్రతిదానినీ అనుమతిస్తుంది:
sudo ip6tables -L INPUT -nChain INPUT (policy ACCEPT)
target prot opt source destinationఒకే screen పై కనిపించే మొత్తం సమస్య ఇదే. IPv4 filter అవుతుంది, కానీ IPv6 ప్రపంచం మొత్తాన్ని అంగీకరిస్తుంది.
3. Docker ports ను మీ firewall ను దాటి నేరుగా publish చేయడం. మీరు docker run -p 8080:80 అమలు చేసినప్పుడు, Docker తన rules ను UFW rules కంటే ముందుగా చేర్చుతుంది. అందువల్ల ufw status ఆ port ను deny చేసినట్లు చూపించినా, published port ను చేరుకోవచ్చు. Modern Docker లో ఇదే విషయం IPv6 పైనా వర్తిస్తుంది. Docker UFW ను ఎందుకు దాటుతుంది, container ports ను సరిగ్గా ఎలా filter చేయాలి లో ఈ విధానం మరియు పరిష్కారాలు వివరించబడ్డాయి. ఈ published ports ఎలా declare అవుతాయో తెలుసుకోవడానికి VPS పై Docker Compose ప్రాథమిక అంశాలు చూడండి.
4. IPv6 నిలిపివేయబడిన UFW. UFW IPv6 ను నిర్వహించగలదు. అయితే దానికి ఆ విధంగా పనిచేయమని చెప్పినప్పుడే అది IPv6 ను నిర్వహిస్తుంది. ఈ switch ను తనిఖీ చేయండి:
grep IPV6 /etc/default/ufwModern Ubuntu లో IPV6=yes ఉంటుంది. అందువల్ల UFW ప్రతి rule ను రెండు stacks పైనా వర్తింపజేస్తుంది. పాత image లేదా పాత guide నుంచి వచ్చిన IPV6=no కనిపిస్తే, మీరు రాసిన ప్రతి UFW rule IPv4 కు మాత్రమే వర్తిస్తుంది. IPv6 మాత్రం నిర్వహణ లేకుండా మిగిలిపోతుంది.
మీరు బయటికి ఖచ్చితంగా ఏమి అందుబాటులో ఉంచుతున్నారో చూడండి
ఊహించవద్దు. బయట నుంచి కొలవండి. ముందుగా listening చేస్తున్న ports ను జాబితా చేసి, :: కు bind అయిన ప్రతి port ను గుర్తించండి:
sudo ss -tlnp | grep '::'తరువాత, వేరే machine నుంచి server యొక్క public IPv6 address కు connect అయి, మూసి ఉందని మీరు భావించే port ను ప్రయత్నించండి:
curl -6 -v http://[2001:db8:2a::1]:8080/అది page లేదా banner ను చూపిస్తే, ఆ port IPv6 పై open గా ఉంది. మూసి ఉన్న port మీకు Connection refused లేదా timeout ను ఇస్తుంది. ఈ రెండు failures ఒకే signal కావు. refused మరియు timed out మధ్య తేడా host సమాధానం ఇచ్చి మీ connection ను తిరస్కరించిందా, లేదా firewall మీ packet ను ఎలాంటి response లేకుండా drop చేసిందా అన్నది తెలియజేస్తుంది. పూర్తి దృశ్యం కోసం, server వెలుపల ఉన్న machine నుంచి nmap తో IPv6 address ను scan చేయండి:
nmap -6 2001:db8:2a::1IPv6 పై nmap open గా చూపించే ప్రతి port ను మొత్తం internet చేరుకోగలదు. మీ IPv4 scan ఏది చూపించినా ఇది వర్తిస్తుంది. IPv4 మరియు IPv6 scans ను పక్కపక్కన పోల్చడం ద్వారా తేడాను వేగంగా గుర్తించవచ్చు: -6 పై open గా ఉండి IPv4 పై closed గా ఉన్నది ఏదైనా, మీ firewall లో నియంత్రణకు అందని service.
లోటును పూడ్చండి
UFW రెండు stackలను కవర్ చేసేలా చేసి, డిఫాల్ట్గా నిరాకరించండి. మార్పును నిర్ధారించి, inbound traffic కోసం default-deny విధానాన్ని సెట్ చేయండి. అవసరమైన వాటిని మాత్రమే అనుమతించండి:
sudo sed -i 's/^IPV6=no/IPV6=yes/' /etc/default/ufw
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verboseIPV6=yes మార్చే సమయంలో UFW ఇప్పటికే activeగా ఉంటే, sudo ufw reload అమలు చేసే వరకు ఈ మార్పు అమలులోకి రాదు.
ufw status ప్రతి నియమాన్ని రెండుసార్లు చూపిస్తుంది: ఒకసారి సాధారణంగా, మరోసారి (v6) suffixతో. (v6) lines కనిపిస్తే, UFW IPv6 trafficను filter చేస్తోంది:
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)మీరు iptablesను చేతితో నిర్వహిస్తే, ప్రతి నియమాన్ని ip6tablesలో కూడా ప్రతిబింబించండి, లేదా nftablesకు మారండి. nftablesలోని inet tables IPv4 మరియు IPv6 రెండింటినీ ఒకే చోట కవర్ చేస్తాయి. దీంతో ఈ తరహా తప్పిదాలన్నీ నివారించవచ్చు. మీరే rules రాస్తున్నప్పుడు, ఒకే nftables inet filter table ఉపయోగించడం అత్యంత సరళమైన పరిష్కారం. మీ VPS Ubuntuకు బదులుగా Rocky లేదా AlmaLinux నడుపుతుంటే, configure చేయడానికి UFW ఉండదు. అప్పుడు మీరు నిర్వహించాల్సిన front end firewalld, ఇది రెండు stackలకు ఒకేసారి తన zone rulesను వర్తింపజేస్తుంది.
Publicగా ఉంచకూడని servicesను loopbackకు bind చేయండి. Database, admin panel లేదా metrics endpointకు సాధారణంగా public address అవసరం ఉండదు. దాన్ని 127.0.0.1 మరియు ::1కు bind చేయండి. అప్పుడు అది routable addressపై అసలు listen చేయదు. Postgres కోసం listen_addresses = 'localhost' సెట్ చేయండి. App server కోసం దాన్ని 127.0.0.1కు bind చేసి, ముందు reverse proxy ఉంచండి. Listenerను మూసివేయడం firewallతో అడ్డుకోవడం కంటే మెరుగైనది. ఎందుకంటే అప్పుడు చేరుకోవడానికి ఏమీ ఉండదు.
Docker ప్రచురించిన portsను కాపాడటానికి UFWపై మాత్రమే ఆధారపడకండి. Container portsను ప్రతి interfaceకు కాకుండా నిర్దిష్ట addressకు publish చేయండి. ఉదాహరణకు -p 127.0.0.1:8080:80 ఉపయోగించండి. అప్పుడు ఆ port host నుంచి మరియు మీరు ఉద్దేశపూర్వకంగా proxy చేసిన వాటి నుంచి మాత్రమే చేరుకోగలరు. Container నిజంగా publicగా ఉండాల్సి వస్తే, దాన్ని Traefik reverse proxy వెనుక ఉంచండి. ప్రతి appను కాకుండా proxyను మాత్రమే publish చేయండి.
మీ provider firewallకు IPv6 rules జోడించండి, లేదా IPv6 కోసం అది మీ firewall కాదని అంగీకరించి, hostపై UFW లేదా nftables ఆ బాధ్యతను నిర్వహించేలా చేయండి.
మీరు నిజంగా మూసివేశారో నిర్ధారించండి
మార్పులు చేసిన తర్వాత అదే బాహ్య పరీక్షను మళ్లీ అమలు చేయండి:
curl -6 -v http://[2001:db8:2a::1]:8080/
nmap -6 2001:db8:2a::1ముందు స్పందించిన port ఇప్పుడు connection ను నిరాకరించాలి లేదా timeout కావాలి. nmap దానిని filtered లేదా closed గా చూపాలి. ఏదైనా port ఇంకా open గా ఉంటే, పై నాలుగు మూలాలను మళ్లీ పరిశీలించండి: ఎలాంటి rule ముందూ లేకుండా :: కు ఇప్పటికీ bind అయి ఉన్న service, UFW కంటే ముందు అమలవుతున్న Docker rule, లేదా IPv6 traffic ను అసలు పరిశీలించని provider firewall.
సున్నితమైన services ను public internet కు పూర్తిగా దూరంగా ఉంచడం మరింత సురక్షితం. SSH మరియు admin panels ను WireGuard VPN వెనుక ఉంచండి మరియు వాటి ports ను firewall ద్వారా tunnel పై మాత్రమే స్పందించేలా చేయండి. అప్పుడు IPv6 exposure ప్రశ్న వాటికి వర్తించదు. public గా మిగిలే services పై జరిగే brute-force scans ను నెమ్మదించడానికి, default-deny firewall పై SSH ముందు Fail2ban అమలు చేయండి.
ports మీకు కొత్తవైతే, ముందుగా చదవాల్సిన ప్రాథమిక వివరణ ports అంటే ఏమిటి, services ఎలా listen చేస్తాయి.
FAQ
UFW డిఫాల్ట్గా IPv6 ను బ్లాక్ చేస్తుందా?
ఆధునిక Ubuntu 24.04 ఇన్స్టాలేషన్లో అవును. UFW /etc/default/ufw నుంచి IPV6=yes ను చదివి, ప్రతి rule ను IPv4 మరియు IPv6 రెండింటికీ వర్తింపజేస్తుంది. ufw status IPv6 rules ను (v6) suffix తో చూపిస్తుంది. IPV6=no పాత image లేదా పాత tutorial నుంచి వచ్చినప్పుడు సమస్య ఏర్పడుతుంది. IPv4 ను మాత్రమే filter చేసే provider firewall పై ఆధారపడినప్పుడు కూడా ఇదే సమస్య వస్తుంది. Docker, UFW ను దాటి port ను publish చేసినప్పుడు కూడా ఇది జరుగుతుంది. ఈ switch ను grep IPV6 /etc/default/ufw తో తనిఖీ చేయండి.
నా VPS IPv6 పై ఏ ports ను బయటకు అందుబాటులో ఉంచుతుందో ఎలా తనిఖీ చేయాలి?
sudo ss -tlnp ను అమలు చేసి, local address [::] తో ప్రారంభమయ్యే ప్రతి listener ను గుర్తించండి. అంటే అది ప్రతి IPv6 interface పై అభ్యర్థనలను స్వీకరిస్తుందని అర్థం. తరువాత వేరే machine నుంచి server యొక్క public IPv6 address ను నేరుగా curl -6 -v http://[YOUR:IPV6::ADDR]:PORT/ తో పరీక్షించండి. లేదా nmap -6 YOUR:IPV6::ADDR తో scan చేయండి. IPv6 scan లో open గా ఉండి, IPv4 లో closed గా ఉన్న port మీ భద్రతా లోపం.
UFW port ను blocked గా చూపిస్తున్నప్పటికీ నా Docker container port ను ఎందుకు చేరుకోగలుగుతున్నాను?
-p తో port ను publish చేసినప్పుడు Docker, UFW rules కంటే ముందు తన స్వంత firewall rules ను చేర్చుతుంది. అందువల్ల ufw status దాన్ని denied గా చూపించినప్పటికీ published port కు చేరుకోవచ్చు. ఇది IPv4 పై జరుగుతుంది. Docker యొక్క IPv6 support ఆన్లో ఉన్నప్పుడు IPv6 పై కూడా ఇదే జరుగుతుంది. -p 127.0.0.1:8080:80 వంటి నిర్దిష్ట address కు publish చేయండి. లేదా container ను reverse proxy వెనుక ఉంచి, proxy ను మాత్రమే publish చేయండి.
నా IPv4 firewall బలంగా ఉంటే ఇంకా IPv6 firewall అవసరమా?
అవును. IPv4 మరియు IPv6 వేర్వేరు firewall rules కలిగిన వేర్వేరు network stacks. IPv4 rules ఎంత సమగ్రంగా ఉన్నా అవి IPv6 traffic పై ఎలాంటి ప్రభావం చూపవు. మీ VPS కు public IPv6 address ఉంటే, దాదాపు అన్నింటికీ ఉన్నట్లే, :: పై listening చేస్తున్న ఏ service అయినా IPv6 ద్వారా చేరుకోగలిగే స్థితిలో ఉంటుంది. IPv6 firewall rule లేదా loopback binding దాన్ని ఆపే వరకు ఇది అలాగే ఉంటుంది.
ఒక service ను IPv4 పై మాత్రమే లేదా localhost పై మాత్రమే listen చేయించే విధానం ఏమిటి?
ఆ service యొక్క సొంత config లో bind address ను సెట్ చేయండి. IPv4 loopback కు మాత్రమే bind చేయాలంటే 127.0.0.1 ను ఉపయోగించండి. IPv6 listener లేకుండా అన్ని IPv4 addresses పై bind చేయాలంటే 0.0.0.0 ను ఉపయోగించండి. Postgres కోసం listen_addresses, SSH కోసం ListenAddress ఉపయోగిస్తారు. చాలా app servers host లేదా bind flag ను అందిస్తాయి. ఫలితాన్ని sudo ss -tlnp తో నిర్ధారించండి. అలాగే Local Address లో ఇకపై [::] కనిపించదని తనిఖీ చేయండి.