at master 1.9 kB view raw
1# This is a simple distributed test involving a topology with two 2# separate virtual networks - the "inside" and the "outside" - with a 3# client on the inside network, a server on the outside network, and a 4# router connected to both that performs Network Address Translation 5# for the client. 6{ pkgs, lib, ... }: 7let 8 routerBase = lib.mkMerge [ 9 { 10 virtualisation.vlans = [ 11 2 12 1 13 ]; 14 networking.nftables.enable = true; 15 networking.nat.internalIPs = [ "192.168.1.0/24" ]; 16 networking.nat.externalInterface = "eth1"; 17 } 18 ]; 19in 20{ 21 name = "dublin-traceroute"; 22 meta = with pkgs.lib.maintainers; { 23 maintainers = [ baloo ]; 24 }; 25 26 nodes.client = 27 { nodes, ... }: 28 { 29 imports = [ ./common/user-account.nix ]; 30 virtualisation.vlans = [ 1 ]; 31 32 networking.defaultGateway = 33 (builtins.head nodes.router.networking.interfaces.eth2.ipv4.addresses).address; 34 networking.nftables.enable = true; 35 36 programs.dublin-traceroute.enable = true; 37 }; 38 39 nodes.router = 40 { ... }: 41 { 42 virtualisation.vlans = [ 43 2 44 1 45 ]; 46 networking.nftables.enable = true; 47 networking.nat.internalIPs = [ "192.168.1.0/24" ]; 48 networking.nat.externalInterface = "eth1"; 49 networking.nat.enable = true; 50 }; 51 52 nodes.server = 53 { ... }: 54 { 55 virtualisation.vlans = [ 2 ]; 56 networking.firewall.enable = false; 57 services.httpd.enable = true; 58 services.httpd.adminAddr = "foo@example.org"; 59 services.vsftpd.enable = true; 60 services.vsftpd.anonymousUser = true; 61 }; 62 63 testScript = '' 64 client.start() 65 router.start() 66 server.start() 67 68 server.wait_for_unit("network.target") 69 router.wait_for_unit("network.target") 70 client.wait_for_unit("network.target") 71 72 # Make sure we can trace from an unprivileged user 73 client.succeed("sudo -u alice dublin-traceroute server") 74 ''; 75}