Knot Háttér

Knot Resolver és SPR problémák.

Docker 2022. máj 29.

A mai nap folyamán frissítést kapott a ZeroLogDNS ami rengeteg fejtörést okozott. Volt egy kisebb probléma a szolgáltatással ami igazából átlagfelhasználóként nem volt észrevehető viszont engem idegesített és, ha valamit csinálunk akkor vagy jól vagy sehogy! :D

Van egy cuki kis weboldal ahol lehet tesztelni, hogy mennyire használ random portokat a DNS szerver. Itt most az ephemeral portokra gondolok. A teszteken a régi megoldással is nagyon jó eredményeket értünk el és szinte kimaxoltuk a DNS biztonságot. A probléma csak az volt, hogy a random domain ahová a tesztelős weblap irányított át, nem mindig oldott fel.

Még mielőtt részletesebben mesélnék a problémáról azelőtt nézzük meg, hogyan is működik az SPR teszt.

A weblap ami teszteli a DNS szerverünket futtat egy Authoritatív DNS szervert. Ez a szerver figyeli a beérkező csatlakozásokat és azoknak az ephemeral portjait. A weblap olyan domainekre tesz kéréseket amelyeket a tesztelő DNS szerver szolgál ki. Ezeket a domaineket nyilván az a DNS szerver oldja fel amit mi használunk.

Miért random a domain? A legtöbb DNS szerver a sebesség érdekében cache-eli a kiszolgált domain-eket. Amennyiben a domain random a DNS szerverünknek mindig újra meg kell kérdeznie a teszt weblap authoritatív DNS szerverétől, hogy mi a random domain IP címe. Ezzel a módszerrel biztosítva van a tesztelő weblap számára az, hogy a mi DNS szerverünk csatlakozzon rá és ne cache-ből szolgálja ki a kéréseket.

A probléma

Eddig a ZeroLogDNS unbound-ot használt DNS szervernek. Jó cucc az unbound viszont arra, hogy miért nem old fel random domaineket nem találtam megoldást pedig össze vissza mindent IS megpróbáltam a config-ban sőt még a kernelt is tweakeltem miatta.

Szóval rengeteg próbálkozás után arra a döntésre jutottam, hogy lecserélem. Nem volt teljesen tiszta, hogy mire. Nézelődtem az interneten stabil és gyors DNS szerverek után amik képesek Redis-t használni cache-nek és nem sokat találtam. Az első amit kipróbáltam az a Knot Resolver volt és később ez is maradt.

Persze itt elő is jött a probléma. Ameddig unbound-ot használtunk közel tökéletes SPR értékeket kaptunk, viszont csere után ez megváltozott.

Itt a futtatott teszt(knot):

Látszódik, hogy az összes létező portból konkrétan csak a felét használja. Ez azt jelenti, hogy egy támadó számára "könnyen" spoofolható a DNS.

Rengeteget olvastam a Knot dokumentációját viszont erről nem találtam semmit. Később kaptam egy fülest, hogy a knot a rendszer számára hagyja a random portok generálását. Ez unbound-nál nem így volt ezért is értünk el vele sokkal jobb eredményeket.

Gondoltam magamban akkor okés semmi gáz. Ezt könnyen orvosolhatjuk. Hát nem így volt! De legalább érdekesen telt a napom. :D

Gyorsan meg is nyitottam a(z) /etc/sysctl.conf file-t és bele tettem a következő sort: net.ipv4.ip_local_port_range = 1024 65000

Ment a reboot majd újra teszt. Hát... Szomorúan konstatáltam, hogy semmi nem változott. Na itt már a sírás kerülgetett. Megjegyzem a ZeroLogDNS 100% docker-ben fut. Tehát én is dockerben futtattam és teszteltem mindent.

Nagyon sokat keresgettem, olvasgattam blogokat, cikket majd ránéztem a Docker és Docker Compose dokumentációra is. Felcsillant a szemem mikor megláttam a --sysctl illetve a sysctls opciót.

Én mindenre Docker Compose-t használok mivel sokkal átláthatóbb illetve könnyebben kezelhető mint a CLI. Hozzá is csaptam a docker-compose.yml konfigurációhoz a következő sorokat:

    sysctls:
        - net.ipv4.ip_local_port_range=1024 65000
        

Ment is a docker-compose down majd docker-compose up.

Újra leteszteltem és tökéletes eredményt értünk el!

Így sikerült fixelni a problémákat!

Remélem tetszett ez a kis blogposzt és hasznosnak találjátok! Amennyiben kérdésed van vagy csak szeretnél beszélni a témáról ne habozz csatlakozni discord szerverünkre!
Meghívót IDE kattintva vagy az oldal tetején/alján találsz.

SPR(Source Port Randomization) Tesztelő weblapok:

GRC | DNS Nameserver Spoofability Test
GRC’s DNS Nameserver spoofability testing facility
Web-based DNS Randomness Test | DNS-OARC

Tagek