1{ pkgs, lib, ... }:
2{
3 name = "systemd-resolved";
4 meta.maintainers = [ lib.maintainers.elvishjerricco ];
5
6 nodes.server =
7 { lib, config, ... }:
8 let
9 exampleZone = pkgs.writeTextDir "example.com.zone" ''
10 @ SOA ns.example.com. noc.example.com. 2019031301 86400 7200 3600000 172800
11 @ A ${(lib.head config.networking.interfaces.eth1.ipv4.addresses).address}
12 @ AAAA ${(lib.head config.networking.interfaces.eth1.ipv6.addresses).address}
13 '';
14 in
15 {
16 networking.firewall.enable = false;
17 networking.useDHCP = false;
18
19 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [
20 {
21 address = "fd00::1";
22 prefixLength = 64;
23 }
24 ];
25
26 services.knot = {
27 enable = true;
28 settings = {
29 server.listen = [
30 "0.0.0.0@53"
31 "::@53"
32 ];
33 template.default.storage = exampleZone;
34 zone."example.com".file = "example.com.zone";
35 };
36 };
37 };
38
39 nodes.client =
40 { nodes, ... }:
41 let
42 inherit (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses) address;
43 in
44 {
45 networking.nameservers = [ address ];
46 networking.interfaces.eth1.ipv6.addresses = lib.mkForce [
47 {
48 address = "fd00::2";
49 prefixLength = 64;
50 }
51 ];
52 services.resolved.enable = true;
53 services.resolved.fallbackDns = [ ];
54 networking.useNetworkd = true;
55 networking.useDHCP = false;
56 systemd.network.networks."40-eth0".enable = false;
57
58 testing.initrdBackdoor = true;
59 boot.initrd = {
60 systemd.enable = true;
61 systemd.initrdBin = [ pkgs.iputils ];
62 network.enable = true;
63 services.resolved.enable = true;
64 };
65 };
66
67 testScript =
68 { nodes, ... }:
69 let
70 address4 = (lib.head nodes.server.networking.interfaces.eth1.ipv4.addresses).address;
71 address6 = (lib.head nodes.server.networking.interfaces.eth1.ipv6.addresses).address;
72 in
73 ''
74 start_all()
75 server.wait_for_unit("multi-user.target")
76
77 def test_client():
78 query = client.succeed("resolvectl query example.com")
79 assert "${address4}" in query
80 assert "${address6}" in query
81 client.succeed("ping -4 -c 1 example.com")
82 client.succeed("ping -6 -c 1 example.com")
83
84 client.wait_for_unit("initrd.target")
85 test_client()
86 client.switch_root()
87
88 client.wait_for_unit("multi-user.target")
89 test_client()
90 '';
91}