1let
2 mkNodeIfStateConfig =
3 {
4 pkgs,
5 id,
6 wgPriv,
7 wgPeerPubKey,
8 wgPeerId,
9 }:
10 {
11 enable = true;
12 settings = {
13 namespaces.outside.interfaces.eth1 = {
14 addresses = [ "2001:0db8:a::${builtins.toString id}/64" ];
15 link = {
16 state = "up";
17 kind = "physical";
18 };
19 };
20 interfaces = {
21 wg0 = {
22 addresses = [ "2001:0db8:b::${builtins.toString id}/64" ];
23 link = {
24 state = "up";
25 kind = "wireguard";
26 bind_netns = "outside";
27 };
28 wireguard = {
29 private_key = "!include ${pkgs.writeText "wg_priv.key" wgPriv}";
30 listen_port = 51820;
31 peers."${wgPeerPubKey}" = {
32 endpoint = "[2001:0db8:a::${builtins.toString wgPeerId}]:51820";
33 allowedips = [ "::/0" ];
34 };
35 };
36 };
37 };
38 routing.routes = [
39 {
40 to = "2001:0db8:b::/64";
41 dev = "wg0";
42 }
43 ];
44 };
45 };
46in
47{
48 name = "ifstate-initrd-wireguard";
49
50 nodes = {
51 foo =
52 { pkgs, ... }:
53 {
54 imports = [ ../../modules/profiles/minimal.nix ];
55
56 virtualisation.interfaces.eth1.vlan = 1;
57
58 # Initrd IfState enforces stage 2 ifstate using assertion.
59 networking.ifstate = {
60 enable = true;
61 settings.interfaces = { };
62 };
63
64 boot.initrd = {
65 network = {
66 enable = true;
67 ifstate =
68 mkNodeIfStateConfig {
69 inherit pkgs;
70 id = 1;
71 wgPriv = "6KmLyTyrN9OZIOCkdpiAwoVoeSiwvyI+mtn1wooKSEU=";
72 wgPeerPubKey = "olFuE7u5pVwSeWLFtrXSvD8+aCDBiKNKCLjLb/dgXiA=";
73 wgPeerId = 2;
74 }
75 // {
76 package = pkgs.ifstate.override {
77 withConfigValidation = false;
78 };
79 allowIfstateToDrasticlyIncreaseInitrdSize = true;
80 };
81 };
82 systemd = {
83 enable = true;
84 network.enable = false;
85 services.boot-blocker = {
86 before = [ "initrd.target" ];
87 wantedBy = [ "initrd.target" ];
88 script = "sleep infinity";
89 serviceConfig.Type = "oneshot";
90 };
91 };
92 };
93 };
94
95 bar =
96 { pkgs, ... }:
97 {
98 imports = [ ../../modules/profiles/minimal.nix ];
99
100 virtualisation.interfaces.eth1.vlan = 1;
101
102 networking = {
103 ifstate = mkNodeIfStateConfig {
104 inherit pkgs;
105 id = 2;
106 wgPriv = "QN89cvFD0C8z1MSpUaJa1YBXt2MaIQegVkEYROi71Fg=";
107 wgPeerPubKey = "5qeKbAGc7wh9Xg0MoMXqXCSmp9TawmtI1bVk/vp3Cn4=";
108 wgPeerId = 1;
109 };
110 };
111 };
112 };
113 testScript = # python
114 ''
115 start_all()
116
117 bar.wait_for_unit("default.target")
118
119 bar.wait_until_succeeds("ping -c 1 2001:0db8:b::1")
120 '';
121}