1{ lib, ... }:
2
3let
4 certs = import ./common/acme/server/snakeoil-certs.nix;
5 domain = certs.domain;
6in
7
8{
9 name = "wstunnel";
10
11 meta.platforms = lib.platforms.linux;
12
13 nodes = {
14 server = {
15 virtualisation.vlans = [ 1 ];
16
17 security.pki.certificateFiles = [ certs.ca.cert ];
18
19 networking = {
20 useNetworkd = true;
21 useDHCP = false;
22 firewall.enable = false;
23 };
24
25 systemd.network.networks."01-eth1" = {
26 name = "eth1";
27 networkConfig.Address = "10.0.0.1/24";
28 };
29
30 services.wstunnel = {
31 enable = true;
32 servers.my-server = {
33 listen = {
34 host = "10.0.0.1";
35 port = 443;
36 };
37 tlsCertificate = certs.${domain}.cert;
38 tlsKey = certs.${domain}.key;
39 };
40 };
41 };
42
43 client = {
44 virtualisation.vlans = [ 1 ];
45
46 security.pki.certificateFiles = [ certs.ca.cert ];
47
48 networking = {
49 useNetworkd = true;
50 useDHCP = false;
51 firewall.enable = false;
52 extraHosts = ''
53 10.0.0.1 ${domain}
54 '';
55 };
56
57 systemd.network.networks."01-eth1" = {
58 name = "eth1";
59 networkConfig.Address = "10.0.0.2/24";
60 };
61
62 services.wstunnel = {
63 enable = true;
64 clients.my-client = {
65 autoStart = false;
66 connectTo = "wss://${domain}:443";
67 localToRemote = [ "tcp://8080:localhost:2080" ];
68 remoteToLocal = [ "tcp://2081:localhost:8081" ];
69 };
70 };
71 };
72 };
73
74 testScript = # python
75 ''
76 start_all()
77 server.wait_for_unit("wstunnel-server-my-server.service")
78 client.wait_for_open_port(443, "10.0.0.1")
79
80 client.systemctl("start wstunnel-client-my-client.service")
81 client.wait_for_unit("wstunnel-client-my-client.service")
82
83 with subtest("connection from client to server"):
84 server.succeed("nc -l 2080 >/tmp/msg &")
85 client.sleep(1)
86 client.succeed('nc -w1 localhost 8080 <<<"Hello from client"')
87 server.succeed('grep "Hello from client" /tmp/msg')
88
89 with subtest("connection from server to client"):
90 client.succeed("nc -l 8081 >/tmp/msg &")
91 server.sleep(1)
92 server.succeed('nc -w1 localhost 2081 <<<"Hello from server"')
93 client.succeed('grep "Hello from server" /tmp/msg')
94
95 client.systemctl("stop wstunnel-client-my-client.service")
96 '';
97}