# Wireguard ansible role This role configures a host to act as a wireguard (default) gateway, supporting dual stack ipv4/ipv6. It is only tested on Debian 10 but also works on a raspberry pi. The role uses ndppd to proxy IPv6 neighbour requests, so you do not need a routed IPv6 range. ## Prerequisites * Debian 10 or Raspberry Pi OS 10 for the gateway host * Host has dual stack networking configured * Host has both A and AAAA dns records * If your device is behind a NAT router, have UDP/51820 forwarded on the edge gateway ## Example playbook (Do not use the example keys) ``` - host: rpi roles: - role: wireguard-nftables vars: wireguard_peers: - publickey: Y+UE7yK4qbkssZUITh0LKTeqG6XhaPXmXSWmFfSNlAM= presharedkey: WLJH/t9dNn36mAyyR57ZWGkb4azjxcgX5lVVpjYJimc= allowedips: ["10.0.0.2/32" ,"2a02:XXXX:XXXX:7d00::2/128"]` ``` ## Configuring clients Install wireguard on your client. Generate a private key on your client: ``` wg genkey > wg.key ``` Calculate the public key: ``` cat wg.key | wg pubkey Y+UE7yK4qbkssZUITh0LKTeqG6XhaPXmXSWmFfSNlAM= ``` Generate a new shared key (Optional) ``` wg genkey WLJH/t9dNn36mAyyR57ZWGkb4azjxcgX5lVVpjYJimc= ``` Run the playbook with a new peer configuration: ``` - publickey: Y+UE7yK4qbkssZUITh0LKTeqG6XhaPXmXSWmFfSNlAM= presharedkey: WLJH/t9dNn36mAyyR57ZWGkb4azjxcgX5lVVpjYJimc= allowedips: ["10.0.0.2/32" ,"2a02:XXXX:XXXX:7d00::2/128"]` ``` The role will generate a private key on the server in /etc/wireguard. Calculate the public key from it: ``` cat /etc/wireguard/wg0.key | wg pubkey 6MnDIYj6MhI9Vic6SnbQ0GfObuYceKTADJuAmNoS9UY= ``` Create a configuration file on the client in /etc/wireguard, using: * The clients private key * The gateways public key * The preshared key ``` [Interface] PrivateKey = CEWE+IXpSUZbTSPPrQiQYeYo2E3XBm6xCmjQUzklA2k= ListenPort = 51820 Address = 10.0.0.2/32, 2a02:XXXX:XXXX:7d00::2/128 [Peer] PublicKey = 6MnDIYj6MhI9Vic6SnbQ0GfObuYceKTADJuAmNoS9UY= PresharedKey = WLJH/t9dNn36mAyyR57ZWGkb4azjxcgX5lVVpjYJimc= Endpoint = wg.my-domain.org:51820 AllowedIPs = 0.0.0.0/0,::0/0 ``` Use wg-quick to bring up the tunnel (Asuming the configurion in /etc/wireguard/wg0.conf) ``` wg-quick up wg0 ``` Disconnect: ``` wg-quick down wg0 ``` ## Choosing Client IP addresses for peers (clients) ### IPv4 Pick any RFC1918 ipv4 IP that does not cause conflicts for you. (nftables configures IP masquerading) ### IPv6 Choose any IP that is valid on the same network as your gateway device. When on a network using stateless autoconfiguration, you're pretty safe picking something in the beginning of your range. (If your device has IP 2a02:XXXX:XXXX:7d00:ba27:ebff:fe7e:d22a/64, 2a02:XXXX:XXXX:7d00::2/128 is unlikely to cause a conflict) VPS providers like Digital Ocean may limit the amount of IPv6 addresses you are allowed to use, so be sure to choose addresses that are in the allowed range.