Durva cucc

Docker és az IPv6

Docker 2022. aug 26.

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!

Tagek