Self-host your own digital island
1{ pkgs, config, lib, ... }: 2 3let cfg = config.wireguard; in 4{ 5 networking = lib.mkIf (cfg.enable && cfg.server) { 6 nat = { 7 enable = true; 8 externalInterface = "enp1s0"; 9 internalInterfaces = [ "wg0" ]; 10 }; 11 firewall = { 12 extraCommands = '' 13 iptables -I FORWARD -i wg0 -o wg0 -j ACCEPT 14 ''; 15 trustedInterfaces = [ "wg0" ]; 16 }; 17 18 wireguard.interfaces.wg0 = { 19 # Route from wireguard to public internet, allowing server to act as VPN 20 postSetup = '' 21 ${pkgs.iptables}/bin/iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE 22 ''; 23 24 postShutdown = '' 25 ${pkgs.iptables}/bin/iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE 26 ''; 27 28 # add clients 29 peers = with lib.attrsets; 30 mapAttrsToList ( 31 hostName: values: { 32 allowedIPs = [ "${values.ip}/32" ]; 33 publicKey = values.publicKey; 34 persistentKeepalive = values.persistentKeepalive; 35 } 36 ) cfg.hosts; 37 }; 38 }; 39}