UFW na IPv6: Jinsi ya Kufunga Mwanya wa VPS
Ubuntu 24.04 inaweza kuwa na IPv6 ya umma huku firewall ikichuja IPv4 pekee. Jua kwa nini port zinaonekana zimefungwa, lakini zinapatikana kupitia IPv6, na jinsi ya kuzifunga.
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 ina IPv6 tangu mwanzo
Karibu kila VPS leo hutolewa ikiwa na anwani ya umma ya IPv6, mara nyingi ikiwa na /64 nzima, pamoja na anwani yake ya IPv4. Thibitisha yako:
ip -6 addr show scope global2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet6 2001:db8:2a::1/64 scope global2001:db8:2a::1 katika mwongozo huu ni kiambishi cha muda kutoka 2001:db8::/32, kilichotengwa kwa ajili ya nyaraka na hakipitishwi kwenye mtandao. Anwani halisi ambayo seva yako inaonyesha kwenye mstari huo inaweza kufikiwa kutoka mahali popote kwenye mtandao, sawa kabisa na anwani yako ya IPv4. Sasa angalia huduma zinazosikiliza:
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-proxyChunguza kwa makini safu ya Local Address. 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 kabisa, kwa hiyo mstari wa Postgres uko salama. Mistari miwili ya [::] hujibu mtandao mzima kupitia IPv6, na mstari wa docker-proxy ni ule unaoweza kusahau kuwa uliuanzisha.
Daemons nyingi hufungamana na :: kwa usanidi wa awali, kwa sababu kwenye Linux socket ya :: kwa kawaida hupokea IPv4 pia. Kwa hiyo, hali ya kawaida ya seva mpya ni “jibu kupitia stacks zote mbili, kila mahali.” Firewall yako ndiyo kitu pekee kilicho mbele ya huduma hizo, ndiyo maana firewall inayoona stack moja tu ni tatizo kubwa.
Chanzo halisi cha pengo la IPv6
Kuna vyanzo vitatu vya kawaida. Kwenye seva fulani unaweza kuwa na chanzo kimoja au kadhaa kwa wakati mmoja.
1. Cloud firewall inayochuja IPv4 pekee. Firewalls nyingi za watoa huduma na bidhaa za security group zilitengenezwa awali kwa kuzingatia IPv4. Baadhi hupuuza IPv6, au zinahitaji uongeze mwenyewe rules tofauti za IPv6. Ikiwa firewall yako pekee ni ile iliyo kwenye dashboard ya mtoa huduma na haichuji IPv6, huduma zako za [::] ziko wazi bila kujali inachosema kuhusu port 22 kwenye IPv4. Soma nyaraka za firewall za mtoa huduma wako na utafute neno IPv6 hasa.
2. iptables iliyosanidiwa mwenyewe bila ip6tables. Amri ya iptables inahusu tables za IPv4 pekee. IPv6 ina amri yake tofauti, ip6tables, pamoja na rules zake tofauti. Ukiandika script ya firewall iliyojaa mistari ya iptables -A INPUT ... bila kuandika rules zinazolingana za ip6tables, firewall yako ya IPv6 huwa tupu. INPUT chain iliyo tupu yenye sera ya msingi ya ACCEPT huruhusu kila kitu:
sudo ip6tables -L INPUT -nChain INPUT (policy ACCEPT)
target prot opt source destinationOutput hiyo inaonyesha tatizo lote kwenye skrini moja. IPv4 inachujwa, lakini IPv6 inakubali trafiki kutoka kila mahali.
3. Docker kuchapisha ports moja kwa moja na kupita firewall yako. Unapoendesha docker run -p 8080:80, Docker huweka rules zake kabla ya rules za UFW. Kwa hiyo, port iliyochapishwa inaweza kufikiwa hata wakati ufw status inasema port hiyo imekataliwa. Docker ya sasa husimamia rules za ip6tables kwa chaguo-msingi. Kwa hiyo, IPv6 ikiwa imewezeshwa kwenye network ya container, hali hiyo hutokea pia kupitia IPv6. Kwa nini Docker hupita UFW, na jinsi ya kuchuja ports za containers ipasavyo inaeleza utaratibu huo na marekebisho yake. Soma Misingi ya Docker Compose kwenye VPS ili kujua jinsi ports hizi zilizochapishwa zinavyotangazwa.
Dokezo kuhusu switch ya IPv6 ya UFW. UFW hushughulikia IPv6, na switch hiyo iko kwenye file moja. Ikague:
grep IPV6 /etc/default/ufwUbuntu ya kisasa huja na IPV6=yes, kwa hiyo UFW hutumia kila rule kwenye stacks zote mbili. Ukiona IPV6=no, kutoka kwenye image ya zamani au mwongozo wa zamani, IPv6 haijaachwa wazi. Kwa setting hiyo, UFW inayotumika hudondosha trafiki yote ya IPv6 isipokuwa ile ya loopback interface. Hivyo tatizo huwa upande mwingine: chochote ulichokusudia kutoa kupitia IPv6 huacha kujibu. Iweke kuwa yes ikiwa unataka UFW ichuje IPv6 kwa kutumia rules zako badala ya kuizuia kabisa.
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 port imefungwa kweli
Tekeleza tena jaribio lilelile la nje baada ya kufanya mabadiliko yako:
curl -6 -v http://[2001:db8:2a::1]:8080/
nmap -6 2001:db8:2a::1Port iliyojibu hapo awali inapaswa sasa kukataa muunganisho au muda wa ombi kuisha, na nmap inapaswa kuiripoti kuwa imechujwa au imefungwa. Ikiwa port bado iko wazi, kagua tena vyanzo vitatu vilivyo hapo juu: huduma ambayo bado imefungwa kwenye :: bila sheria mbele yake, sheria ya Docker iliyo mbele ya UFW, au firewall ya mtoa huduma ambayo haikuwahi kushughulikia IPv6.
Kuzima kabisa huduma nyeti zisitumike kwenye Internet ya umma ni hatua imara zaidi. Weka SSH na paneli za usimamizi nyuma ya VPN ya WireGuard na zuia port zake kwa firewall ili zijibu kupitia tunnel pekee; hivyo, swali la huduma hizo kufikiwa kupitia IPv6 halitatumika tena. Ili kupunguza kasi ya ukaguzi wa brute-force unaolenga huduma yoyote inayobaki hadharani, tumia Fail2ban mbele ya SSH pamoja na firewall yenye sera chaguo-msingi ya kukataa.
Ikiwa dhana ya port bado ni mpya kwako, port ni nini na huduma husikiliza vipi ni utangulizi wa kusoma kwanza.
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 hutumia kila rule kwa IPv4 na IPv6, huku ufw status ikionyesha rules za IPv6 zikiwa na suffix ya (v6). Tatizo hutokea unapotegemea firewall ya mtoa huduma inayochuja IPv4 pekee, unapotumia rules za iptables zilizoandikwa kwa mkono bila mwenzake wa ip6tables, au Docker inapochapisha port inayopita UFW. IPV6=no (kutoka image ya zamani au tutorial ya zamani) haifungui IPv6: ikiwa imewekwa, UFW inayofanya kazi hudondosha traffic yote ya IPv6 isipokuwa ya loopback. Kagua switch hiyo kwa grep IPV6 /etc/default/ufw.
Ninawezaje kuangalia VPS yangu inafichua nini kupitia IPv6?
Endesha sudo ss -tlnp na utambue kila listener ambaye local address yake inaanza na [::]. Hii inamaanisha anajibu kwenye interface zote za IPv6. Kisha, kutoka kwenye mashine tofauti, jaribu public IPv6 address ya seva moja kwa moja kwa curl -6 -v http://[YOUR:IPV6::ADDR]:PORT/, au ichanganue kwa nmap -6 YOUR:IPV6::ADDR. Port yoyote iliyo wazi kwenye scan ya IPv6 lakini imefungwa kwenye IPv4 ndiyo pengo lako.
Kwa nini ninaweza kufikia port ya Docker container yangu wakati UFW inasema imezuiwa?
Docker huweka rules zake za firewall kabla ya UFW unapochapisha port kwa -p. Kwa hiyo, port iliyochapishwa inaweza kufikiwa ingawa ufw status inaionyesha kuwa imekataliwa. Hii hutokea kwenye IPv4, na pia kwenye IPv6 wakati support ya IPv6 ya Docker imewashwa. Chapisha kwenye address mahususi kama -p 127.0.0.1:8080:80, au weka container nyuma ya reverse proxy na uchapishe proxy pekee.
Je, bado ninahitaji firewall ya IPv6 ikiwa firewall yangu ya IPv4 ni thabiti?
Ndiyo. IPv4 na IPv6 ni network stacks tofauti zenye rules tofauti za firewall. Seti kamili ya rules za IPv4 haifanyi chochote kwa traffic ya IPv6. Ikiwa VPS yako ina public IPv6 address, na karibu zote zinayo, basi service yoyote inayosikiliza kwenye :: itaendelea kufikiwa kupitia IPv6 hadi rule ya IPv6 ya firewall au binding ya loopback iizuie.
Ninawezaje kufanya service isikilize IPv4 pekee, au localhost pekee?
Weka bind address ya service kwenye config yake yenyewe. Bind kwenye 127.0.0.1 kwa IPv4 loopback pekee, au 0.0.0.0 kwa IPv4 addresses zote bila listener wa IPv6. Postgres hutumia listen_addresses, SSH hutumia ListenAddress, na app servers nyingi zina host au bind flag. Thibitisha matokeo kwa sudo ss -tlnp na uangalie kwamba Local Address haionyeshi tena [::].