diff options
Diffstat (limited to 'modules/xnet/net/vpn-gateway.nix')
| -rw-r--r-- | modules/xnet/net/vpn-gateway.nix | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/modules/xnet/net/vpn-gateway.nix b/modules/xnet/net/vpn-gateway.nix new file mode 100644 index 0000000..d26ced1 --- /dev/null +++ b/modules/xnet/net/vpn-gateway.nix @@ -0,0 +1,103 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.xnet.net.vpnGateway; + inherit (lib) mkOption mkIf types; + + iface = "enp2s0"; + fwmark = "0x1"; + ip = "192.168.2.113"; + vpn = { + iface = "wg0"; + endpoint = "149.88.22.129:51820"; + addr = "10.69.70.71/32"; + peers = [ + + ]; + }; +in + +{ + # options.xnet.net.vpnGateway = { + # interface = mkOption { + # type = types.str; + # description = "Interface to forward VPN routed packets to internet"; + # }; + # + # vpn = types.subModule { + # interface = mkOption { + # type = types.str; + # default = "wg0"; + # description = "Name of VPN interface."; + # }; + # + # endpoint = mkOption { + # type = types.str; + # description = "ip:port of the VPN endpoint."; + # }; + # + # addr = mkOption { + # type = types.str; + # description = "Address of the VPN interface."; + # }; + # + # privateKeyFile = mkOption { + # type = types.str; + # description = "Path to private key."; + # }; + # + # peers = types.listOf types.subModule { + # + # }; + # }; + + boot.kernel.sysctl = { + "net.ipv4.ip_forward" = 1; + "net.ipv6.conf.all.forwarding" = 1; + }; + + networking = { + wg-quick.interfaces."${vpn.iface}" = { + address = [ vpn.addr ]; + privateKeyFile = "/certs/wg/private.key"; + + peers = [{ + publicKey = "yxyntWsANEwxeR0pOPNAcfWY7zEVICZe9G+GxortzEY="; + allowedIPs = [ "0.0.0.0/0" ]; + endpoint = "149.88.22.129:51820"; + persistentKeepalive = 25; + }]; + }; + + nat = { + enable = true; + externalInterface = "wg0"; + internalInterfaces = [ "enp2s0" ]; + }; + + firewall = { + extraCommands = '' + # Create a new routing table for forwarded traffic + echo "200 vpn" >> /etc/iproute2/rt_tables + + # Mark packets from other hosts + iptables -t mangle -A PREROUTING -i enp2s0 ! -s 192.168.1.113 -j MARK --set-mark 0x1 + + # Route marked packets through WireGuard + ip rule add fwmark 0x1 table vpn + ip route add default dev wg0 table vpn + + # Allow forwarding + iptables -A FORWARD -i enp2s0 -o wg0 -j ACCEPT + iptables -A FORWARD -i wg0 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT + + # NAT only forwarded traffic + iptables -t nat -A POSTROUTING -o wg0 ! -s 192.168.1.113 -j MASQUERADE + ''; + + extraStopCommands = '' + ip rule del fwmark 0x1 table vpn 2>/dev/null || true + ip route flush table vpn 2>/dev/null || true + ''; + }; + }; +} |
