From c4e84425171bf9a3987aac4630eb953fe5308b78 Mon Sep 17 00:00:00 2001 From: Yadunand Prem Date: Mon, 22 Sep 2025 00:27:04 +0800 Subject: [PATCH] initial simple dns with block --- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 29 ++++++++++++++++++++++++++ go.mod | 13 ++++++++++++ go.sum | 14 +++++++++++++ main.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 167 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..4004e31 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1758262103, + "narHash": "sha256-aBGl3XEOsjWw6W3AHiKibN7FeoG73dutQQEqnd/etR8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "12bd230118a1901a4a5d393f9f56b6ad7e571d01", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..20ae92a --- /dev/null +++ b/flake.nix @@ -0,0 +1,29 @@ +{ + description = "System"; + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-utils = { + url = "github:numtide/flake-utils"; + }; + }; + + outputs = + { nixpkgs, flake-utils, ... }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + devShells = { + default = pkgs.mkShell { + buildInputs = with pkgs; [ + go + gopls + codex + ]; + }; + }; + } + ); +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..29d1e9c --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module git.yadunut.dev/yadunut/nutdns + +go 1.25.0 + +require github.com/miekg/dns v1.1.68 + +require ( + golang.org/x/mod v0.24.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sync v0.14.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/tools v0.33.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..f7cf092 --- /dev/null +++ b/go.sum @@ -0,0 +1,14 @@ +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= +github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= diff --git a/main.go b/main.go new file mode 100644 index 0000000..71ce85d --- /dev/null +++ b/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "log" + "strings" + + "github.com/miekg/dns" +) + +const upstream = "1.1.1.1:53" + +var blocklist = map[string]bool{ + "x.com.": true, +} + +func handleDNS(w dns.ResponseWriter, r *dns.Msg) { + m := new(dns.Msg) + m.SetReply(r) + + c := new(dns.Client) + for _, q := range r.Question { + log.Printf("question: %s", q.Name) + if blocklist[strings.ToLower(q.Name)] { + res, err := dns.NewRR(q.Name + " 60 IN A 0.0.0.0") + if err != nil { + log.Fatal(err) + } + m.Answer = append(m.Answer, res) + } else { + req := new(dns.Msg) + req.Question = append(req.Question, q) + res, _, err := c.Exchange(req, upstream) + if err != nil { + log.Fatal(err) + } + m.Answer = append(m.Answer, res.Answer...) + + } + } + w.WriteMsg(m) +} + +func main() { + + dns.HandleFunc(".", handleDNS) + + server := &dns.Server{Addr: ":8053", Net: "udp"} + log.Println("Starting DNS Server on :53") + log.Fatal(server.ListenAndServe()) +}