Jinsi ya kulinda VPS yako dhidi ya mwanya wa IPv6
UFW inaweza kulinda IPv4 pekee ikiwa usanidi haujakamilika. Jifunze jinsi ya kuzuia huduma zinazofunguka kupitia IPv6 kwenye Ubuntu 24.04 na kufunga milango ya hatari.
Mtego wa firewall ya IPv6 kwa sentensi moja
Firewall yako inalinda IPv4, lakini VPS yako karibu kila mara ina anwani ya umma ya IPv6, na huduma nyingi husikiliza kwenye anwani hiyo kwa chaguo-msingi. Ikiwa firewall yako inashughulikia IPv4 pekee, au unategemea firewall ya wingu inayochuja IPv4 pekee, kila huduma kati ya hizo inaweza kufikiwa kutoka Internet nzima kupitia IPv6 wakati upande wako wa IPv4 ukionekana umefungwa. Unapojaribu port kwa curl na kuona muunganisho umekataliwa, unajihisi salama, lakini mshambuliaji anaweza kuunganisha kwenye port hiyo hiyo kupitia IPv6 na kuingia.
Mwongozo huu unaonyesha chanzo cha mwanya huu kwenye VPS ya kawaida ya Ubuntu 24.04, jinsi ya kuona unachokiweka wazi, na jinsi ya kukifunga. UFW si mhalifu hapa; kwenye usakinishaji wa kisasa wa Ubuntu, UFW tayari inashughulikia IPv6. Mwanya huu hutokana na matabaka yanayoizunguka, na huduma ambazo hukujua kuwa zinasikiliza.
Kwa nini VPS yako inatumia IPv6 tangu mwanzo
Karibu kila VPS leo inakuja na anwani ya umma ya IPv6, mara nyingi ikiwa ni /64 nzima, sambamba na anwani yake ya IPv4. Angalia yako:
ip -6 addr show scope global2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet6 2001:db8:2a::1/64 scope global2001:db8:2a::1 hiyo inaweza kufikiwa kutoka popote kwenye mtandao, sawa kabisa na anwani yako ya IPv4. Sasa angalia kinachosikiliza:
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-proxySoma safu ya Local Address kwa makini. 0.0.0.0:22 inamaanisha "sikiliza kwenye kila anwani ya IPv4." [::]:22 inamaanisha "sikiliza kwenye kila anwani ya IPv6." 127.0.0.1:5432 imefungwa kwenye loopback na si ya umma hata kidogo, kwa hivyo mstari wa Postgres uko salama. Mistari miwili ya [::] inajibu mtandao mzima kupitia IPv6, na ile ya docker-proxy ni aina ile ambayo unasahau kuwa uliianzisha.
Daemons nyingi hufungwa kwenye :: kama usanidi wa awali, kwa sababu kwenye Linux socket ya :: kwa kawaida hukubali IPv4 pia. Kwa hivyo, hali ya kawaida ya seva mpya ni "jibu kwenye stack zote mbili, kila mahali." Firewall yako ndiyo kitu pekee kilichosimama mbele ya hilo, ndiyo maana firewall inayoona stack moja tu ni tatizo kubwa.
Chanzo halisi cha pengo la IPv6
Kuna vyanzo vinne vya kawaida. Kwenye seva moja unaweza kuwa na kimoja kati ya hivi au kadhaa kwa wakati mmoja.
1. Firewall ya wingu inayochuja IPv4 pekee. Firewall nyingi za watoa huduma na bidhaa za security-group zilikua zikilenga IPv4 na ama hupuuza IPv6 au zinahitaji sheria tofauti za IPv6 ambazo lazima uongeze kwa mkono. Ikiwa firewall yako pekee ni ile iliyo kwenye dashibodi ya mtoa huduma na haijumuishi IPv6, huduma zako za [::] ziko wazi bila kujali inachosema kuhusu port 22 kwenye IPv4. Soma nyaraka za firewall ya mtoa huduma wako na utafute neno IPv6 mahususi.
2. iptables zilizosanidiwa kwa mkono bila ip6tables. Amri ya iptables inagusa meza za IPv4 pekee. IPv6 ina amri tofauti kabisa, ip6tables, yenye sheria zake tofauti. Ikiwa uliandika hati ya firewall iliyojaa mistari ya iptables -A INPUT ... na hukuwahi kuandika sheria zinazolingana za ip6tables, firewall yako ya IPv6 haina kitu, na INPUT chain tupu yenye sera ya default ya ACCEPT inaruhusu kila kitu:
sudo ip6tables -L INPUT -nChain INPUT (policy ACCEPT)
target prot opt source destinationPato hilo ndilo mtego mzima kwenye skrini moja. IPv4 imechujwa, IPv6 inakubali kila kitu kutoka ulimwenguni.
3. Docker inayochapisha ports moja kwa moja kupita firewall yako. Unapoendesha docker run -p 8080:80, Docker huweka sheria zake mbele ya zile za UFW, kwa hivyo port iliyochapishwa inaweza kufikiwa hata wakati ufw status inasema port hiyo imekataliwa, na kwenye Docker ya kisasa hali hiyo hiyo inatumika kupitia IPv6. Kwa nini Docker inapita UFW, na jinsi ya kuchuja ports za container ipasavyo inaelezea utaratibu huo na marekebisho yake. Tazama misingi ya Docker Compose kwenye VPS kwa jinsi ports hizi zilizochapishwa zinavyotangazwa.
4. UFW ikiwa IPv6 imezimwa. UFW inashughulikia IPv6, lakini pale tu inapoelekezwa kufanya hivyo. Angalia swichi hiyo:
grep IPV6 /etc/default/ufwUbuntu ya kisasa inakuja na IPV6=yes, kwa hivyo UFW inatumia kila sheria kwenye stacks zote mbili. Ikiwa unaona IPV6=no, kutoka kwenye image ya zamani au mwongozo wa zamani, kila sheria ya UFW uliyoiandika ni ya IPv4 pekee, na IPv6 inaachwa bila kusimamiwa.
Ona hasa unachokiweka wazi
Usikisie. Pima kutoka nje. Kwanza orodhesha wasikilizaji wako na uandike kila mmoja aliyefungwa kwenye :::
sudo ss -tlnp | grep '::'Kisha, kutoka kwa mashine nyingine, unganisha kwenye anwani ya IPv6 ya umma ya seva na ujaribu port unayoamini imefungwa:
curl -6 -v http://[2001:db8:2a::1]:8080/Ikiwa hiyo itarudisha ukurasa au banner, port hiyo iko wazi kwenye IPv6. Port iliyofungwa inakupa Connection refused au timeout. Hitilafu hizo mbili si ishara sawa, na tofauti kati ya refused na timed out inakuambia kama mwenyeji alijibu na kukukataa au firewall ilitupa pakiti yako kimya kimya. Kwa picha kamili, changanua anwani ya IPv6 ukitumia nmap ukiwa nje ya seva:
nmap -6 2001:db8:2a::1Kila port ambayo nmap inaripoti kuwa wazi kupitia IPv6 ni port ambayo Internet nzima inaweza kuifikia, bila kujali uchanganuzi wako wa IPv4 ulionyesha nini. Kulinganisha uchanganuzi wa IPv4 na IPv6 kando kando ndiyo njia ya haraka zaidi ya kupata pengo: chochote kilicho wazi kwenye -6 lakini kimefungwa kwenye IPv4 ni huduma ambayo firewall yako inaikosa.
Ziba mwanya
Fanya UFW ijumuishe stack zote mbili, na uweke sera ya msingi ya kukataa (deny). Thibitisha mabadiliko hayo, kisha weka sera ya msingi ya kukataa maombi ya ndani (inbound) na uruhusu tu kile unachohitaji:
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 verboseIkiwa UFW ilikuwa tayari inafanya kazi ulipobadilisha IPV6=yes, mabadiliko hayataanza kutumika hadi utakapokimbiza sudo ufw reload.
ufw status huorodhesha kila sheria mara mbili, mara moja ikiwa ya kawaida na mara nyingine ikiwa na kiambishi cha (v6). Unapoona mistari ya (v6), UFW inachuja IPv6:
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)Ikiwa unasimamia iptables kwa mkono, nakili kila sheria kwenye ip6tables, au hamia kwenye nftables, ambapo meza zake za inet hufunika IPv4 na IPv6 sehemu moja na kuondoa aina hii nzima ya makosa. Meza moja ya kuchuja ya inet katika nftables ndiyo suluhisho safi zaidi unapojitungia sheria mwenyewe. Ikiwa VPS yako inaendesha Rocky au AlmaLinux badala ya Ubuntu, hakuna UFW ya kusanidi na firewalld ndiyo kiolesura unachokisimamia badala yake, ambacho hutumia sheria zake za zone kwenye stack zote mbili kwa wakati mmoja.
Funga huduma ambazo hutaki ziwe za umma kwenye loopback. Database, paneli ya usimamizi, au endpoint ya metrics mara nyingi haihitaji anwani ya umma hata kidogo. Ifunge kwenye 127.0.0.1 na ::1 ili isisikilize kamwe kwenye anwani inayoweza kufikika (routable address). Kwa Postgres, weka listen_addresses = 'localhost'. Kwa seva ya programu, ifunge kwenye 127.0.0.1 na uweke reverse proxy mbele yake. Kufunga listener ni bora kuliko kuifungia kwa firewall, kwa sababu hapo hakutakuwa na kitu cha kufikika.
Usiitumainie UFW kulinda port zilizochapishwa (published ports) za Docker. Chapisha port za container kwenye anwani mahususi badala ya kila interface, kwa mfano -p 127.0.0.1:8080:80, ili port hiyo ifikike tu kutoka kwa host na chochote unachokielekeza kwake kwa makusudi kupitia proxy. Wakati container inapaswa kuwa ya umma, iweke nyuma ya Traefik reverse proxy na uchapishe proxy pekee, si kila programu.
Ongeza sheria za IPv6 kwenye firewall ya mtoa huduma wako, au kubali kuwa hiyo si firewall yako kwa ajili ya IPv6 na uache UFW au nftables kwenye host ifanye kazi hiyo badala yake.
Thibitisha kuwa umefunga kweli
Endesha jaribio lilelile la nje tena baada ya kufanya mabadiliko yako:
curl -6 -v http://[2001:db8:2a::1]:8080/
nmap -6 2001:db8:2a::1Port iliyojibu awali sasa inapaswa kukataa muunganisho au kuisha muda (time out), na nmap inapaswa kuripoti kuwa imechujwa (filtered) au imefungwa (closed). Ikiwa port bado iko wazi, pitia tena vyanzo vinne vilivyo hapo juu: huduma iliyobaki imefungwa kwenye :: bila sheria yoyote mbele yake, sheria ya Docker iliyopo mbele ya UFW, au firewall ya mtoa huduma ambayo haikuwahi kuona IPv6 hata kidogo.
Kuweka huduma nyeti nje ya Internet ya umma kabisa ni njia bora zaidi. Weka SSH na paneli za utawala nyuma ya WireGuard VPN na uwekee firewall ports zake ili zijibu tu kupitia tunnel, na swali la kufichuliwa kwa IPv6 halitawahusu tena. Ili kupunguza kasi ya skani za brute-force zinazopiga chochote kilichobaki hadharani, weka Fail2ban mbele ya SSH juu ya firewall ya default-deny.
Ikiwa dhana ya ports ni ngeni kwako, nini maana ya ports na jinsi huduma zinavyosikiliza ndiyo mwongozo wa kuanzia kusoma.
FAQ
Je, UFW huzuia IPv6 kwa chaguo-msingi?
Kwenye usakinishaji wa kisasa wa Ubuntu 24.04, ndiyo. UFW husoma IPV6=yes kutoka /etc/default/ufw na kutumia kila sheria kwa IPv4 na IPv6, na ufw status huonyesha sheria za IPv6 zikiwa na kiambishi cha (v6). Mtego hujitokeza wakati IPV6=no (kutoka kwa image ya zamani au mafunzo ya zamani), unapotegemea firewall ya mtoa huduma inayochuja IPv4 pekee, au wakati Docker inapochapisha port kupita UFW. Kagua swichi hiyo kwa kutumia grep IPV6 /etc/default/ufw.
Ninawezaje kukagua kile ambacho VPS yangu inakifichua kwenye IPv6?
Tekeleza sudo ss -tlnp na uandike kila msikilizaji ambaye anwani yake ya ndani inaanza na [::], jambo linalomaanisha kuwa inajibu kwenye kila interface ya IPv6. Kisha, kutoka kwa mashine nyingine, jaribu anwani ya umma ya IPv6 ya seva moja kwa moja kwa kutumia curl -6 -v http://[YOUR:IPV6::ADDR]:PORT/, au ichanganue kwa nmap -6 YOUR:IPV6::ADDR. Port yoyote iliyo wazi kwenye uchanganuzi wa IPv6 lakini imefungwa kwenye IPv4 ndiyo mwanya wako.
Kwa nini ninaweza kufikia port ya Docker container yangu wakati UFW inasema imefungwa?
Docker huingiza sheria zake za firewall mbele ya zile za UFW unapochapisha port kwa kutumia -p, kwa hivyo port iliyochapishwa inafikika ingawa ufw status inaorodhesha kama imekataliwa. Hii hutokea kwenye IPv4, na pia kwenye IPv6 wakati usaidizi wa IPv6 wa Docker umewashwa. Chapisha kwenye anwani mahususi kama vile -p 127.0.0.1:8080:80, au weka container nyuma ya reverse proxy na uchapishe proxy hiyo pekee.
Je, bado ninahitaji firewall ya IPv6 ikiwa firewall yangu ya IPv4 ni imara?
Ndiyo. IPv4 na IPv6 ni stack za mtandao tofauti zenye sheria tofauti za firewall. Seti kamilifu ya sheria za IPv4 haifanyi kazi yoyote kwa trafiki ya IPv6. Ikiwa VPS yako ina anwani ya umma ya IPv6, na karibu zote zinayo, basi huduma yoyote inayosikiliza kwenye :: inabaki kufikika kupitia IPv6 hadi sheria ya firewall ya IPv6 au bind ya loopback itakapoisimamisha.
Ninawezaje kuifanya huduma isikilize kwenye IPv4 pekee, au kwenye localhost pekee?
Weka anwani ya bind ya huduma kwenye usanidi wake wenyewe. Bind kwenye 127.0.0.1 kwa ajili ya IPv4 loopback pekee, au 0.0.0.0 kwa anwani zote za IPv4 bila msikilizaji wa IPv6. Postgres hutumia listen_addresses, SSH hutumia ListenAddress, na seva nyingi za programu hutoa flag ya host au bind. Thibitisha matokeo kwa sudo ss -tlnp na uhakikishe kuwa Local Address haionyeshi tena [::].