Docker és az IPv6
Pár napja elkezdtem gondolkozni azon, hogy a knot resolver dockerben miért nem beszélget az upstream DNS szerverekkel IPv6-on. Idegesített... Idegesített mert valami, aminek működnie kellene MIÉRT nem működik???
Szépen gondoltam egyet és beléptem az egyik szerverbe amelyiken a knot resolver fut, majd átnéztem a hálózatot. Elsőnek megpróbáltam pingelni IPv6-on a containerből, természetesen sikertelenül. Oké, itt már gondolkoztam, hogy valószínűleg semmilyen IPv6 elérhetőség nincs a containerből, ezért megnéztem a docker hálózatokat. Mint kiderült IPv6 supportnak az ég egy adta világon sehol semmi nyoma.
Fel is pattintottam a fox barátom és kacsakacsmenj segítségével rákerestem, hogy lehet dockerben aktiválni az IPv6 supportot. Elolvastam a hivatalos dokumentációt és megcsináltam a következő lépéseket:
Létrehoztam egy daemon.json
nevezetű fájlt a(z) /etc/docker
könyvtárba.
Kimásoltam a dokumentációban megadott konfigurációs fájlt.
Itt kicsit eltértem a leírtaktól és egy saját privát IPv6-os címet adtam meg.
A daemon.json
fájl tartalma a következőképpen nézett ki:
{
"ipv6": true,
"fixed-cidr-v6": "fd00:d4d7:1b7e:7e29::/64"
}
Elmentettem majd újraindítottam a docker szolgáltatást.
Megnéztem az alapértelmezett bridge hálózatot, hogy van-e végre IPv6 support.
docker network inspect bridge | grep -i "ipv6"
Yeeey, a docker szerint van.
Felfuttattam egy containert az alap bridge hálózaton, majd elkezdtem pingelni a google.com-ot IPv6-on: ping google.com -6
Hát... Válasz az nem volt :D
Miért?
Azért, mert container még mindig nem tud kapcsolatot létesíteni, mivel a publikus IPv6 hálózat és a docker hálózat között nincs összeköttetés, ergo nincs routing. Ezt természetesen eddig nem volt probléma, hiszen a docker IPv4-en mindent automatikusan meg tud csinálni. Hát, úgy látszik, hogy csak IPv4-en gigachad!
A docker elég erős kapcsolatban áll az iptables-el. Ennek köszönhetően tudunk hálózatokat összekötni-elszeparálni egymástól, portokat kiengedni és egyéb finomságokat csinálni a hálózatain belül.
Na most az egyik hatalmas probléma vele, hogy az ip6tables-hez alapvetően semmi köze nincsen. Ebbe később majd belemászok... mert van :D
Ez abból derült ki, hogy megnéztem a következő paranccsal: ip6tables -L
Semmit sem találtam ami dockerrel kapcsolatos, ami igazából elég sok mindent megmagyaráz.
Itt már elkezdtem keresgélni az interneten, hogy mégis milyen megoldások vannak erre?
ip6tables
Mondtam, hogy belemászok, nem?
Szóval a docker-ben mégis csak van IPv6 support, bár nem out of the box. Egy kis mókolással rá lehet venni, hogy használja az ip6tables-t.
Amit mókolást már megcsináltam a daemon.json
-el, igazából nem is olyan haszontalan. 2 sort kell csak hozzáadni a daemon.json
-höz, hogy működjön.
Itt a varázslat:
{
"ipv6": true,
"fixed-cidr-v6": "fd00:d4d7:1b7e:7e29::/64",
"ip6tables": true,
"experimental": true
}
Újra kell indítani a docker service-t és mehet a teszt.
Újra elindítottam egy containert az alapértelmezett bridge hálózaton majd megpingeltem a google.com-ot: ping google.com -6
PING google.com(fra24s12-in-x0e.1e100.net (2a00:1450:4001:831::200e)) 56 data bytes
64 bytes from fra24s12-in-x0e.1e100.net (2a00:1450:4001:831::200e): icmp_seq=1 ttl=118 time=2.97 ms
64 bytes from fra24s12-in-x0e.1e100.net (2a00:1450:4001:831::200e): icmp_seq=2 ttl=118 time=2.78 ms
64 bytes from fra24s12-in-x0e.1e100.net (2a00:1450:4001:831::200e): icmp_seq=3 ttl=118 time=2.77 ms
64 bytes from fra24s12-in-x0e.1e100.net (2a00:1450:4001:831::200e): icmp_seq=4 ttl=118 time=2.73 ms
JUHÉÉÉ, működik!
Persze azért megnéztem a dnscheck.tools weblapon is, hogy végre kommunikál-e a DNS szerver IPv6-on és... Hát. Nem. >:(
Gondolkoztam, gondolkoztam majd megvilágosodtam. A hálózat amin a container van nem az alapértelmezett bridge. Egy olyan hálózaton volt amin nem volt engedélyezve az IPv6. Szóval a containereket amik ugyan azon a hálózaton voltak lekapcsoltam, majd töröltem a hálózatot.
Létrehoztam egy újat a saját paramétereimmel illetve IPv6 támogatással.
Valahogy így néz ki a parancs:
docker network create --subnet="fdbf:50d6:93cd:55d3::/64" \
--gateway="fd00:50d6:93cd:55d3::1" --ipv6 \
--subnet="172.18.0.0/16" --gateway="172.18.0.1" ehhh
Persze az ehhh
helyett olyan nevet adunk amit akarunk :D
Elindítottam egy containert ezen a hálózaton, megpróbáltam pingelni belőle IPv6-on és szerencsére sikeres volt.
Rápakoltam a containereket erre a hálózatra, újra felnéztem a dnscheck.tools oldalra és VÉGRE valahára a DNS szerver már IPv6-on is kommunikált.
FIGYELEM, ez a megoldás egyáltalán nem ajánlott, amennyiben nem egy hobbiprojektről van szó. Bármi olyan történik, aminek nem kellene nem vállalok felelősséget! Szint úgy a docker sem, mivel az IPv6 támogatás jelenleg teszt fázisban van.
Végszó
Nagyon szépen köszönöm, hogy elolvastad a cikkem és nagyon remélem, hogy választ kaptál a kérdéseidre. Amennyiben nem, szeretettel várlak a Discord szerveremre, amihez az oldal tetején és alján találsz meghívót!