Rewrote playbook as a role.
This commit is contained in:
commit
38e79b3659
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
vars/targets/*.yml
|
||||||
|
!vars/targets/example.yml
|
17
LICENSE
Normal file
17
LICENSE
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
MIT No Attribution License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Brian Lee
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the “Software”), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
64
README.md
Normal file
64
README.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# Ansible Role: Wireguard
|
||||||
|
|
||||||
|
This Ansible Role manages wireguard configuration.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
## Platforms
|
||||||
|
|
||||||
|
Any distro with a repository that has wireguard-tools. It has only been tested on the following:
|
||||||
|
|
||||||
|
* Ubuntu 22.04
|
||||||
|
* Debian 11
|
||||||
|
|
||||||
|
### Legacy systems
|
||||||
|
|
||||||
|
For distros that do not have the package in their repositories, see the [official installation instructions](https://www.wireguard.com/install/) for your specific distro.
|
||||||
|
|
||||||
|
For example, the older Debian 10 buster basically needs you to build the module for the kernel using dkms:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
apt-get install linux-headers-$(uname -r)
|
||||||
|
apt-get reinstall wireguard-dkms
|
||||||
|
```
|
||||||
|
|
||||||
|
## Role Variables
|
||||||
|
|
||||||
|
Available variables are listed below, along with default values (see `defaults/main.yml`):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
wireguard_public_key: '..'
|
||||||
|
wireguard_private_key: '..'
|
||||||
|
wireguard_subnet: 10.0.0.0/24
|
||||||
|
wireguard_address: 10.0.0.1/24
|
||||||
|
wireguard_listen_port: 42069
|
||||||
|
wireguard_peers:
|
||||||
|
- { allowed_ips: '10.0.0.100/32', public_key: '..' }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Secrets
|
||||||
|
|
||||||
|
I use [pass](https://www.passwordstore.org/) as a local secret store, which keeps credentials outside of any source code repository. To add credentials for a new host, generate a new key pair for a host `example.acme.com`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
key=$(wg genkey)
|
||||||
|
echo $key | pass insert -e example.com/hostname/WIREGUARD_PRIVATE_KEY
|
||||||
|
echo $key | wg pubkey
|
||||||
|
unset key
|
||||||
|
```
|
||||||
|
|
||||||
|
Then add an entry to your `.env` so you can source the private key before the playbook runs.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export example_WIREGUARD_PRIVATE_KEY=$(pass acme.com/example/WIREGUARD_PRIVATE_KEY)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example Playbook
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- bleetube.wireguard
|
||||||
|
```
|
11
defaults/main.yml
Normal file
11
defaults/main.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
wireguard_snat_address: "{{ ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0]) }}"
|
||||||
|
wireguard_inet_if: "{{ ansible_default_ipv4.interface }}"
|
||||||
|
wireguard_if: wg0
|
||||||
|
wireguard_forward_targets:
|
||||||
|
- 0.0.0.0/0
|
||||||
|
wireguard_packages:
|
||||||
|
- iptables # missing in some Debian 11 cloudimages
|
||||||
|
- tcpdump
|
||||||
|
- wireguard
|
||||||
|
- wireguard-tools
|
5
handlers/main.yml
Normal file
5
handlers/main.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
- name: restart {{ wireguard_if }}
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: wg-quick@{{ wireguard_if }}
|
||||||
|
state: restarted
|
2
meta/main.yml
Normal file
2
meta/main.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
dependencies: []
|
47
tasks/main.yml
Normal file
47
tasks/main.yml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
#- name: Load target host configuration if it is defined.
|
||||||
|
# ansible.builtin.include_vars:
|
||||||
|
# file: "{{ item }}"
|
||||||
|
# with_first_found:
|
||||||
|
# - files:
|
||||||
|
# - "vars/targets/{{ inventory_hostname_short }}.yml"
|
||||||
|
# - "../../host_vars/wireguard/{{ inventory_hostname_short }}.yml"
|
||||||
|
# skip: true
|
||||||
|
# tags: test
|
||||||
|
|
||||||
|
- name: Assert the private key has been configured.
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- wireguard_private_key != ''
|
||||||
|
fail_msg: "FAILED: Wireguard private key is not set."
|
||||||
|
no_log: true
|
||||||
|
|
||||||
|
- name: Install and update Wireguard related packages
|
||||||
|
ansible.builtin.package:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: latest
|
||||||
|
loop: "{{ wireguard_packages }}"
|
||||||
|
|
||||||
|
# https://docs.ansible.com/ansible/latest/collections/ansible/posix/sysctl_module.html
|
||||||
|
- ansible.posix.sysctl:
|
||||||
|
name: "{{ item }}"
|
||||||
|
value: 1
|
||||||
|
sysctl_set: yes
|
||||||
|
loop:
|
||||||
|
- net.ipv4.ip_forward
|
||||||
|
- net.ipv6.conf.all.forwarding
|
||||||
|
|
||||||
|
# TODO: come up with a way to have different routing policy templates for different hosts
|
||||||
|
- name: Configure Wireguard forwarding
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: routes.sh.j2
|
||||||
|
dest: /etc/wireguard/routes.sh
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Configure Wireguard tunnel
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: interface.conf.j2
|
||||||
|
dest: "/etc/wireguard/{{ wireguard_if }}.conf"
|
||||||
|
mode: '0600'
|
||||||
|
notify: "restart {{ wireguard_if }}"
|
||||||
|
tags: interface
|
13
templates/interface.conf.j2
Normal file
13
templates/interface.conf.j2
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[Interface]
|
||||||
|
Address = {{ wireguard_address }}
|
||||||
|
PostUp = /etc/wireguard/routes.sh add
|
||||||
|
PostDown = /etc/wireguard/routes.sh del
|
||||||
|
ListenPort = {{ wireguard_listen_port }}
|
||||||
|
PrivateKey = {{ wireguard_private_key }}
|
||||||
|
SaveConfig = false
|
||||||
|
|
||||||
|
{% for peer in wireguard_peers %}
|
||||||
|
[Peer]
|
||||||
|
PublicKey = {{ peer.public_key }}
|
||||||
|
AllowedIPs = {{ peer.allowed_ips }}
|
||||||
|
{% endfor %}
|
22
templates/routes.sh.j2
Normal file
22
templates/routes.sh.j2
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -x
|
||||||
|
|
||||||
|
|
||||||
|
if [[ "add" == ${1} ]]
|
||||||
|
then
|
||||||
|
{% for forward_target in wireguard_forward_targets %}
|
||||||
|
iptables -A FORWARD -i {{ wireguard_if }} -d {{ forward_target }} -j ACCEPT
|
||||||
|
{% endfor %}
|
||||||
|
iptables -A FORWARD -o {{ wireguard_if }} -j ACCEPT
|
||||||
|
iptables -t nat -A POSTROUTING -s {{ wireguard_subnet }} -o {{ wireguard_inet_if }} -j SNAT --to-source {{ wireguard_snat_address }}
|
||||||
|
iptables -P FORWARD DROP
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "del" == ${1} ]]
|
||||||
|
then
|
||||||
|
{% for forward_target in wireguard_forward_targets %}
|
||||||
|
iptables -D FORWARD -i {{ wireguard_if }} -d {{ forward_target }} -j ACCEPT
|
||||||
|
{% endfor %}
|
||||||
|
iptables -D FORWARD -o {{ wireguard_if }} -j ACCEPT
|
||||||
|
iptables -t nat -D POSTROUTING -s {{ wireguard_subnet }} -o {{ wireguard_inet_if }} -j SNAT --to-source {{ wireguard_snat_address }}
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user