UFW IPv6 ఫైర్వాల్ లోపం: మీ VPS ఎలా సురక్షితం కాదు
మీ UFW నియమాలు IPv4 మాత్రమే కవర్ చేస్తే, సేవలు IPv6 ద్వారా పూర్తి ఇంటర్నెట్కు తెరుచుకుంటాయి. Ubuntu 24.04 VPS లో ఈ లోపం ఎక్కడ నుండి వస్తుందో తెలుసుకుని మూసివేయండి.
ఒక్క వాక్యంలో IPv6 ఫైర్వాల్ ఉల్లంఘన
మీ ఫైర్వాల్ IPv4 ని రక్షిస్తుంది. మీ VPS దాదాపు ఖచ్చితంగా ఒక పబ్లిక్ IPv6 చిరునామాను కూడా కలిగి ఉంటుంది. అనేక సేవలు దానిపై డిఫాల్ట్గా వింటూ ఉంటాయి. మీ ఫైర్వాల్ IPv4 ని మాత్రమే కవర్ చేస్తే, లేదా మీరు IPv4 ని మాత్రమే ఫిల్టర్ చేసే క్లౌడ్ ఫైర్వాల్పై ఆధారపడితే, ఆ ప్రతి సేవా IPv6 ద్వారా మొత్తం ఇంటర్నెట్ నుండి చేరుకోగలవు, అదే సమయంలో మీ IPv4 వైపు లాక్ చేయబడినట్లు కనిపిస్తుంది. మీరు curl తో ఒక పోర్ట్ ని పరీక్షిస్తారు, కనెక్షన్ తిరస్కరించబడిందని చూస్తారు, సురక్షితంగా ఉన్నామని భావిస్తారు. ఒక దుర్మార్గుడు అదే పోర్ట్కు IPv6 ద్వారా కనెక్ట్ అవుతాడు, సులభంగా లోపలికి ప్రవేశిస్తాడు.
ఈ గైడ్ సాధారణ Ubuntu 24.04 VPS లో ఆ అంతరం ఎక్కడ నుండి వస్తుందో, మీరు ఖచ్చితంగా ఏమి బహిర్గతం చేస్తున్నారో ఎలా చూడాలో, మరియు దానిని ఎలా మూసివేయాలో చూపిస్తుంది. ఇక్కడ UFW ప్రతినాయకుడు కాదు. ఆధునిక Ubuntu ఇన్స్టాలేషన్లో UFW ఇప్పటికే IPv6 ని నిర్వహిస్తుంది. బహిర్గతం దాని చుట్టూ ఉన్న పొరల నుండి వస్తుంది, మరియు మీకు తెలియని వింటూ ఉన్న సేవల నుండి వస్తుంది.
మీ VPS మొదట్లోనే IPv6లో ఎందుకు ఉంది
ఈరోజు దాదాపు ప్రతి VPS దాని IPv4 చిరునామాతో పాటు, తరచుగా ఒక పూర్తి /64తో సహా ఒక పబ్లిక్ IPv6 చిరునామాతో వస్తుంది. మీది తనిఖీ చేయండి:
ip -6 addr show scope global2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet6 2001:db8:2a::1/64 scope globalఆ 2001:db8:2a::1 అంతర్జాలంలో ఎక్కడి నుంచైనా రూట్ చేయబడుతుంది, సరిగ్గా మీ IPv4 చిరునామా లాగానే. ఇప్పుడు ఏమి వింటోందో చూడండి:
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 కాలమ్ను శ్రద్ధగా చదవండి. 0.0.0.0:22 అంటే "ప్రతి IPv4 చిరునామాపై వినండి." [::]:22 అంటే "ప్రతి IPv6 చిరునామాపై వినండి." 127.0.0.1:5432 లూప్బ్యాక్కు బైండ్ చేయబడి ఉంది మరియు అసలు పబ్లిక్ కాదు, కాబట్టి ఆ Postgres వరుస సురక్షితం. ఆ రెండు [::] వరుసలు మొత్తం అంతర్జాలానికి IPv6 ద్వారా స్పందిస్తాయి, మరియు ఆ docker-proxy వరస మీరు ప్రారంభించారని మర్చిపోయే రకం.
చాలా డెమన్లు డిఫాల్ట్గా ::కు బైండ్ అవుతాయి, ఎందుకంటే Linuxలో ఒక :: సాకెట్ సాధారణంగా IPv4ను కూడా అంగీకరిస్తుంది. కాబట్టి కొత్త సర్వర్ యొక్క డిఫాల్ట్ వైఖరి "రెండు స్టాక్లపై, అన్నిచోట్లా స్పందించడం." మీ ఫైర్వాల్ మాత్రమే దానికి ముందు ఉన్న అడ్డంకి, అందుకే ఒకే ఒక స్టాక్ను చూసే ఫైర్వాల్ నిజమైన సమస్య.
IPv6 అంతరం వాస్తవానికి ఎక్కడ నుండి వస్తుంది
నాలుగు సాధారణ మూలాలు ఉన్నాయి. ఒక నిర్దిష్ట సర్వర్లో మీకు వాటిలో ఒకటి లేదా ఒకేసారి అనేకం ఉండవచ్చు.
1. IPv4 మాత్రమే ఫిల్టర్ చేసే క్లౌడ్ ఫైర్వాల్. అనేక ప్రొవైడర్ ఫైర్వాల్లు మరియు సెక్యూరిటీ-గ్రూప్ ఉత్పత్తులు IPv4 చుట్టూ అభివృద్ధి చేయబడ్డాయి. అవి IPv6ని పట్టించుకోవు లేదా మీరు మాన్యువల్గా జోడించాల్సిన ప్రత్యేక IPv6 నియమాలు అవసరం. మీ ఏకైక ఫైర్వాల్ ప్రొవైడర్ డాష్బోర్డ్లో ఉన్నదే అయితే, అది IPv6ని కవర్ చేయకపోతే, IPv4లో పోర్ట్ 22 గురించి అది ఏమి చెప్పినా మీ [::] సేవలు ఓపెన్లోనే ఉంటాయి. మీ ప్రొవైడర్ ఫైర్వాల్ డాక్యుమెంటేషన్ని చదవండి. IPv6 అనే పదాన్ని ప్రత్యేకంగా వెతకండి.
2. ip6tables లేని మాన్యువల్ iptables. iptables కమాండ్ IPv4 టేబుల్లను మాత్రమే స్పృశిస్తుంది. IPv6కి పూర్తిగా వేరే కమాండ్ ఉంది, అదే ip6tables, దానికి సొంత ప్రత్యేక నియమాలు ఉన్నాయి. మీరు iptables -A INPUT ... లైన్లతో నిండిన ఫైర్వాల్ స్క్రిప్ట్ని వ్రాసి ఉంటే, సరిపోలే ip6tables నియమాలను ఎప్పుడూ వ్రాయకపోతే, మీ IPv6 ఫైర్వాల్ ఖాళీగా ఉంటుంది. డిఫాల్ట్ ACCEPT పాలసీతో ఖాళీ INPUT చైన్ ప్రతిదాన్ని అనుమతిస్తుంది:
sudo ip6tables -L INPUT -nChain INPUT (policy ACCEPT)
target prot opt source destinationఆ అవుట్పుట్ ఒకే స్క్రీన్లో మొత్తం ఉచ్చు. IPv4 ఫిల్టర్ చేయబడింది, IPv6 ప్రపంచాన్ని అంగీకరిస్తుంది.
3. మీ ఫైర్వాల్ని దాటి పోర్ట్లను పబ్లిష్ చేసే Docker. మీరు docker run -p 8080:80 రన్ చేసినప్పుడు, Docker దాని స్వంత నియమాలను UFW నియమాల ముందే చొప్పిస్తుంది. కాబట్టి ufw status ఆ పోర్ట్ తిరస్కరించబడిందని చెప్పినా కూడా పబ్లిష్ చేసిన పోర్ట్ చేరుకోగలదు. ఆధునిక Dockerలో అదే విషయం IPv6కి కూడా వర్తిస్తుంది. Docker UFWని ఎందుకు దాటుతుంది, మరియు కంటైనర్ పోర్ట్లను సరిగ్గా ఫిల్టర్ చేయడం ఎలా మెకానిజం మరియు పరిష్కారాలను వివరిస్తుంది. ఈ పబ్లిష్ చేసిన పోర్ట్లు ఎలా డిక్లేర్ చేయబడతాయో చూడటానికి VPSలో Docker Compose ప్రాథమికాలు చూడండి.
4. IPv6 ఆఫ్ చేయబడిన UFW. UFW IPv6ని హ్యాండిల్ చేస్తుంది, కానీ అది చెప్పినప్పుడు మాత్రమే. స్విచ్ని తనిఖీ చేయండి:
grep IPV6 /etc/default/ufwఆధునిక Ubuntu IPV6=yesతో వస్తుంది, కాబట్టి UFW ప్రతి నియమాన్ని రెండు స్టాక్లకు వర్తిస్తుంది. మీరు ఒక పాత ఇమేజ్ లేదా పాత గైడ్ నుండి IPV6=no చూస్తే, మీరు వ్రాసిన ప్రతి UFW నియమం IPv4 మాత్రమే, మరియు IPv6 నిర్వహించబడని స్థితిలో మిగిలిపోతుంది.
మీరు బహిర్గతం చేస్తున్నది ఏమిటో సరిగ్గా చూడండి
అంచనా వేయవద్దు. బాహ్యం నుండి దాన్ని కొలవండి. ముందుగా మీ లిజనర్లను జాబితా చేసి, ::కి బైండ్ అయిన ప్రతి దాన్ని గుర్తించండి:
sudo ss -tlnp | grep '::'తర్వాత, వేరే మెషీన్ నుండి, సర్వర్ యొక్క పబ్లిక్ IPv6 చిరునామాకు కనెక్ట్ అవ్వండి. మీరు క్లోజ్డ్ అని భావించే పోర్ట్ను ప్రయత్నించండి:
curl -6 -v http://[2001:db8:2a::1]:8080/అది ఒక పేజీ లేదా బ్యానర్ను అందిస్తే, ఆ పోర్ట్ IPv6పై ఓపెన్లో ఉంది. క్లోజ్డ్ పోర్ట్ మీకు Connection refused లేదా టైమౌట్ను ఇస్తుంది. పూర్తి వివరాల కోసం, సర్వర్ వెలుపల నుండి nmapతో ఆ IPv6 చిరునామాను స్కాన్ చేయండి:
nmap -6 2001:db8:2a::1nmap IPv6 ద్వారా ఓపెన్గా నివేదించే ప్రతి పోర్ట్, మీ IPv4 స్కాన్ ఏమి చూపించినా, మొత్తం ఇంటర్నెట్ చేరుకోగలిగే పోర్ట్. IPv4 మరియు IPv6 స్కాన్లను పక్కపక్కన పోల్చడం అంతరాన్ని కనుగొనడానికి వేగవంతమైన మార్గం: -6పై ఓపెన్లో ఉన్నప్పుడు IPv4పై క్లోజ్డ్లో ఉన్న ఏదైనా మీ ఫైర్వాల్ వదిలివేస్తున్న ఒక సర్వీస్.
అంతరాన్ని మూసివేయండి
UFW రెండు స్టాక్లను కవర్ చేసేలా చేయండి, మరియు డిఫాల్ట్గా డినై చేయండి. స్విచ్ను నిర్ధారించండి, తర్వాత డిఫాల్ట్-డినై ఇన్బౌండ్ పాలసీని సెట్ చేయండి మరియు మీకు అవసరమైనవాటిని మాత్రమే అనుమతించండి:
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 verboseమీరు IPV6=yes ను మార్చినప్పుడు UFW ఇప్పటికే యాక్టివ్లో ఉంటే, మీరు sudo ufw reload ను రన్ చేసే వరకు ఆ మార్పు అమల్లోకి రాదు.
ufw status ప్రతి రూల్ను రెండుసార్లు జాబితా చేస్తుంది, ఒకసారి ప్లెయిన్గా మరియు ఒకసారి (v6) సఫిక్స్తో. మీరు (v6) లైన్లను చూసినప్పుడు, UFW IPv6 ను ఫిల్టర్ చేస్తోంది:
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)మీరు iptables ను మాన్యువల్గా నిర్వహిస్తే, ప్రతి రూల్ను ip6tables లో కూడా మిర్రర్ చేయండి, లేదా nftables కు మారండి, దీనికి సంబంధించిన inet టేబుల్స్ IPv4 మరియు IPv6 రెండింటినీ ఒకే చోట కవర్ చేస్తాయి మరియు ఈ రకమైన తప్పులన్నింటినీ తొలగిస్తాయి. మీరు స్వయంగా రూల్స్ రాసుకున్నప్పుడు ఒకే nftables inet ఫిల్టర్ టేబుల్ అత్యుత్తమ పరిష్కారం.
మీరు పబ్లిక్గా ఉంచాలనుకోని సర్వీస్లను లూప్బ్యాక్కు బైండ్ చేయండి. డేటాబేస్, అడ్మిన్ ప్యానెల్, లేదా మెట్రిక్స్ ఎండ్పాయింట్కు దాదాపు ఎప్పుడూ పబ్లిక్ చిరునామా అవసరం ఉండదు. దాన్ని 127.0.0.1 మరియు ::1 కు బైండ్ చేయండి, తద్వారా అది ప్రారంభం నుండి రూటబుల్ చిరునామాపై లిజన్ చేయదు. Postgres కోసం, listen_addresses = 'localhost' సెట్ చేయండి. యాప్ సర్వర్ కోసం, దాన్ని 127.0.0.1 కు బైండ్ చేయండి మరియు ముందు రివర్స్ ప్రాక్సీని ఉంచండి. లిజనర్ను మూసివేయడం దాన్ని ఫైర్వాల్ చేయడం కంటే మెరుగైనది, ఎందుకంటే అప్పుడు అక్కడ చేరుకోవడానికి ఏమీ ఉండదు.
Docker యొక్క పబ్లిష్ చేసిన పోర్టులను గార్డ్ చేయడానికి UFW పై ఆధారపడవద్దు. కంటైనర్ పోర్టులను ప్రతి ఇంటర్ఫేస్కు కాకుండా ఒక నిర్దిష్ట చిరునామాకు పబ్లిష్ చేయండి, ఉదాహరణకు -p 127.0.0.1:8080:80, తద్వారా ఆ పోర్టు హోస్ట్ నుండి మరియు మీరు ఉద్దేశపూర్వకంగా ప్రాక్సీ చేసే దాని నుండి మాత్రమే చేరుకోగలుగుతుంది. ఒక కంటైనర్ నిజంగా పబ్లిక్ అయ్యే అవసరం ఉన్నప్పుడు, దాన్ని Traefik రివర్స్ ప్రాక్సీ వెనుక ఉంచండి మరియు ప్రతి యాప్ను కాకుండా ప్రాక్సీని మాత్రమే పబ్లిష్ చేయండి.
మీ ప్రొవైడర్ ఫైర్వాల్కు IPv6 రూల్స్ జోడించండి, లేదా అది IPv6 కోసం మీ ఫైర్వాల్ కాదని అంగీకరించండి మరియు ఆ పనిని హోస్ట్లో UFW లేదా nftables చేయనివ్వండి.
మీరు నిజంగా మూసివేశారో లేదో ధృవీకరించండి
మీ మార్పుల తర్వాత అదే బాహ్య పరీక్షను మళ్లీ నడపండి:
curl -6 -v http://[2001:db8:2a::1]:8080/
nmap -6 2001:db8:2a::1ఇంతకు ముందు స్పందించిన పోర్టు ఇప్పుడు తిరస్కరించాలి లేదా కనెక్షన్ టైమ్-అవుట్ కావాలి. nmap దాన్ని filtered లేదా closedగా నివేదించాలి. ఒక పోర్టు ఇంకా openగా ఉంటే, పైన పేర్కొన్న నాలుగు మూలల ద్వారా తిరిగి వెళ్లండి: ముందు ఎలాంటి రూల్ లేకుండా ::కి ఇంకా బౌండ్ అయి ఉన్న సర్వీస్, UFW కంటే ముందు ఉన్న Docker రూల్, లేదా IPv6ని అసలు చూడని ప్రొవైడర్ ఫైర్వాల్.
సున్నితమైన సర్వీసులను పబ్లిక్ ఇంటర్నెట్ నుండి పూర్తిగా దూరంగా ఉంచడం మరింత బలమైన పద్ధతి. SSH మరియు అడ్మిన్ ప్యానెల్లను WireGuard VPN వెనుక ఉంచండి మరియు వాటి పోర్టులకు ఫైర్వాల్ వేయండి, తద్వారా అవి టనెల్లో మాత్రమే స్పందిస్తాయి, మరియు IPv6 ఎక్స్పోజర్ ప్రశ్న వాటికి వర్తించడం ఆగిపోతుంది. పబ్లిక్గా ఉండే వాటిపై పడే బ్రూట్-ఫోర్స్ స్కాన్లను నెమ్మదిస్తే, డిఫాల్ట్-డినై ఫైర్వాల్ పైన SSH ముందు Fail2ban అమలు చేయండి.
పోర్టులు మీకు కొత్త అయితే, పోర్టులు అంటే ఏమిటి మరియు సర్వీసులు ఎలా వింటాయి అనేది ముందుగా చదవాల్సిన ప్రైమర్.
FAQ
UFW అప్రమేయంగా IPv6 ని నిరోధిస్తుందా?
ఆధునిక Ubuntu 24.04 సంస్థాపనలో, అవును. UFW అనేది IPV6=yes ను /etc/default/ufw నుండి చదువుతుంది మరియు ప్రతి నియమాన్ని IPv4 మరియు IPv6 రెండింటికీ వర్తిస్తుంది, మరియు ufw status అనేది IPv6 నియమాలను (v6) ప్రత్యయంతో చూపుతుంది. మీరు IPV6=no ఉపయోగించినప్పుడు (పాత ఇమేజ్ లేదా పాత ట్యుటోరియల్ నుండి), లేదా IPv4 ని మాత్రమే ఫిల్టర్ చేసే ప్రొవైడర్ ఫైర్వాల్పై ఆధారపడినప్పుడు, లేదా Docker ఏదైనా పోర్ట్ను UFW ను దాటి ప్రచురించినప్పుడు సమస్య వస్తుంది. దీనిని grep IPV6 /etc/default/ufw తో తనిఖీ చేయండి.
నా VPS IPv6 లో ఏమి బహిర్గతం చేస్తుందో నేను ఎలా తనిఖీ చేయగలను?
sudo ss -tlnp నడపండి మరియు స్థానిక చిరునామా [::] తో ప్రారంభమయ్యే ప్రతి లిసనర్ను గుర్తించండి, దీని అర్థం అది ప్రతి IPv6 ఇంటర్ఫేస్పై స్పందిస్తుంది. తరువాత, వేరే మెషీన్ నుండి, సర్వర్ యొక్క పబ్లిక్ IPv6 చిరునామాను curl -6 -v http://[YOUR:IPV6::ADDR]:PORT/ తో నేరుగా పరీక్షించండి, లేదా దానిని nmap -6 YOUR:IPV6::ADDR తో స్కాన్ చేయండి. IPv6 స్కాన్లో ఓపెన్గా ఉన్న ఏ పోర్ట్ అయినా IPv4 లో క్లోజ్గా ఉంటే, అది మీ అంతరం.
UFW దానిని నిరోధించబడిందని చెప్పినప్పుడు నేను నా Docker కంటైనర్ పోర్ట్ను ఎలా చేరుకోగలను?
మీరు ఒక పోర్ట్ను -p తో ప్రచురించినప్పుడు, Docker దాని స్వంత ఫైర్వాల్ నియమాలను UFW నియమాల ముందు చొప్పిస్తుంది, కాబట్టి ufw status దానిని తిరస్కరించబడిందని చూపినప్పటికీ, ప్రచురించబడిన పోర్ట్ చేరుకోవడానికి వీలుగా ఉంటుంది. ఇది IPv4 లో జరుగుతుంది, మరియు Docker యొక్క IPv6 మద్దతు ఆన్ చేయబడినప్పుడు IPv6 లో కూడా జరుగుతుంది. -p 127.0.0.1:8080:80 వంటి ఒక నిర్దిష్ట చిరునామాకు ప్రచురించండి, లేదా కంటైనర్ను రివర్స్ ప్రాక్సీ వెనుక ఉంచి, ప్రాక్సీని మాత్రమే ప్రచురించండి.
నా IPv4 ఫైర్వాల్ బలంగా ఉంటే నాకు ఇంకా IPv6 ఫైర్వాల్ అవసరమా?
అవును. IPv4 మరియు IPv6 అనేవి వేర్వేరు ఫైర్వాల్ నియమాలతో కూడిన వేర్వేరు నెట్వర్క్ స్టాక్లు. సంపూర్ణమైన IPv4 నియమాల సమితి IPv6 ట్రాఫిక్కు ఏమీ చేయదు. మీ VPS కి పబ్లిక్ IPv6 చిరునామా ఉంటే, మరియు దాదాపు అన్నీ ఉంటే, :: పై లిసన్ అవుతున్న ఏ సేవ అయినా IPv6 ఫైర్వాల్ నియమం లేదా లూప్బ్యాక్ బైండింగ్ దానిని ఆపే వరకు IPv6 ద్వారా చేరుకోవడానికి వీలుగానే ఉంటుంది.
నేను ఒక సేవను IPv4 మాత్రమే, లేదా localhost మాత్రమే లిసన్ చేసేలా ఎలా చేయగలను?
సేవ యొక్క బైండ్ చిరునామాను దాని స్వంత కాన్ఫిగ్లో సెట్ చేయండి. IPv4 లూప్బ్యాక్ మాత్రమే కావాలంటే 127.0.0.1 కు బైండ్ చేయండి, లేదా IPv6 లిసనర్ లేకుండా అన్ని IPv4 చిరునామాల కోసం 0.0.0.0 కు బైండ్ చేయండి. Postgres అనేది listen_addresses ఉపయోగిస్తుంది, SSH అనేది ListenAddress ఉపయోగిస్తుంది, మరియు చాలా యాప్ సర్వర్లు హోస్ట్ లేదా బైండ్ ఫ్లాగ్ను బహిర్గతం చేస్తాయి. ఫలితాన్ని sudo ss -tlnp తో నిర్ధారించుకోండి మరియు Local Address ఇకపై [::] చూపించదని తనిఖీ చేయండి.