Achtung, die deutsche Dokumentation wird nicht weiter gepflegt. Bitte die englische Doku nutzen.
Breaking change in v0.1.6
openwrt_network_interfaces wird zu openwrt_network_interfaceshost und openwrt_network_interfacesgroup
openwrt_network_devices wird zu openwrt_network_deviceshost und openwrt_network_devicesgroup
openwrt_network_bridge_vlan wird zu openwrt_network_bridge_vlanhost und openwrt_network_bridge_vlangroup
Zur Nutzung dieser Rolle muss python3-netaddr installiert sein
Bei Devices und Interfaces unterscheidet die Rolle in openwrt_network_interfaceshost
und openwrt_network_interfacesgroup
. Das Gleiche gilt für openwrt_network_devices
und openwrt_network_bridge_vlan
.
Die *host
Variablen gelten in Ansible auf host-Ebene. Die *group
Variablen gelten in Ansible auf Gruppenebene. Letztere werden in group_vars/allhosts.yml definiert und für die jeweiligen Gruppen definiert, denen ein Host angehört, was in der merge.yml zusammengesetzt wird.
Damit der merge funktionieren kann, müssen im Inventory die hosts auch den entsprechenden Gruppen zugeordnet sein.
Eine Beispielhafte Konfiguration in group_vars/allhosts.yml:
openwrt_network_devicesgroup:
pplznet_missmarple:
br-lan:
type: "bridge"
ports:
- "eth0"
openwrt_network_interfacesgroup:
pplznet_missmarple:
lan:
device: "br-lan"
proto: "static"
ipaddr:
- "192.168.1.1/24"
ip6assign: "64"
wan:
device: "eth1"
proto: "dhcp"
wan6:
device: "@wan"
proto: "dhcpv6"
dmz:
device: "eth2"
proto: "static"
ipaddr:
- "192.168.2.1/24"
ip6assign: 64
guests:
device: "eth3"
proto: "static"
ipaddr:
- "192.168.3.1/24"
ip6assign: 64
Die Rolle verwaltet sämtliche Netzwerkkonfigurationen. Es wird eingeteilt in:
Seit OpenWrt 21.02 hat sich die Konfiguration von Netzwerkgeräten geändert.
Global kann man einen IPv6 Unique Local Adress Prefix und das Packet Steering (de)aktivieren.
openwrt_network_globals_ula: "fd8d:2afe:fa38::/48"
openwrt_network_globals_packet_steering: 1
Devices sind die Referenz auf physische Geräte und werden wie folgt konfiguriert. Für eine Liste der verfügbaren Konfigurationsparameter siehe OpenWrt Doku. Die OpenWrt Doku für die DSA config ist noch nicht vollständig.
Hier eine Liste der vorhandenen Parameter:
Bridge Parameter:
openwrt_network_deviceshost:
br-lan:
type: "bridge"
ports:
- "eth0"
mtu: "9000"
mtu6: "9000"
eth1:
eth2:
mtu: "9000"
mtu6: "9000"
openwrt_network_deviceshost:
mainbridge:
type: "bridge"
bridge_empty: "1"
vlan_filtering: "1"
ports:
- "eth0"
- "eth1"
- "eth2"
- "eth3"
Um die VLAN Zuordnungen durchzuführen nutzt man die openwrt_network_bridge_vlan Variable:
openwrt_network_bridge_vlan:
- device: "mainbridge"
vlan: "5"
vlaninfo: "Netz1"
ports:
- "eth3:t"
- "eth0:u*"
- device: "mainbridge"
vlan: "12"
vlaninfo: "Freifunk Guests"
ports:
- "eth3:t"
- "eth1:u*"
- device: "mainbridge"
vlan: "13"
vlaninfo: "DMZ"
ports:
- "eth3:t"
- device: "mainbridge"
vlan: "61"
vlaninfo: "Drucker"
ports:
- "eth3:t"
- "eth2:u*"
- device: "mainbridge"
vlan: "62"
vlaninfo: "Management"
ports:
- "eth3:t"
- device: "mainbridge"
vlan: "63"
vlaninfo: "kids"
ports:
- "eth3:t"
openwrt_network_deviceshost:
eth3.5:
type: "8021q"
vid: 5
vlaninfo: "insecure network"
ifname: "eth3"
Interfaces dienen zur IP Konfiguration und stellen eine Referenz zum darunterliegenden Device her.
Für eine Übersicht der möglichen Parameter dient das OpenWrt Wiki.
openwrt_network_interfaceshost:
MGMT:
device: "mainbridge.62"
proto: "dhcp"
MGMT6:
device: "@MGMT"
proto: "dhcpv6"
reqaddress: "try"
reqprefix: "auto"
INSECURE:
device: "mainbridge.5"
proto: "none"
SECURE:
device: "mainbridge.61"
proto: "none"
openwrt_network_interfaceshost:
wan:
device: "eth0"
proto: "static"
ipaddr:
- "1.2.3.4/28"
- "1.244.24.2/32"
gateway: "1.2.3.5"
ip6addr:
- "2a1a:1220:1:4f::4/64"
- "2a01:fef0:1234:4f::b1b1/128"
ip6gw: "2a1a:1220:1:4f::1"
dns:
- "2ae0:3fe1::2
- "2ae0:3fe1::3"
dnssearch:
- "libcom.de"
openwrt_network_interfaceshost:
loopback0:
device: "@loopback"
proto: "static"
ip6addr:
- "2a00:fe0:3f:4::1/128"
wan:
device: "eth0"
proto: "pppoe"
username: "PPPOE_username"
password: "ASDF1234"
wan6:
device: "@wan"
proto: "dhcpv6"
reqaddress: "try"
reqprefix: 48
Die Ansible Rolle unterstützt die Konfiguration von Wireguard Schnittstellen. Wireguard Scnittstellen sind in OpenWrt jedoch normale Interfaces, die auch einer Firewall Zone zugeordnet werden sollten.
Beispiel für ein Wireguard Interface:
openwrt_network_interfaceshost:
ROADWARRIOR:
proto: "wireguard"
wg_managekeys: false
wg_private_key: "theserversprivatekey"
wg_myendpoint: "4.12.223.10"
wg_listen_port: 51821
wg_peerdns: 0
wg_addresses:
- "10.10.100.97/27"
- "2a00:123:456:22::1/64"
Liste der Parameter:
Beispiel für ein Wireguard Peer:
openwrt_network_wireguardpeers:
peername:
interface: "ROADWARRIOR"
managekeys: false
generateclientconfig: false
public_key: "thepeerspublickey"
preshared_key: "thepresharedkey"
setpsk: false
allowed_ips:
- "2a00:123:688:11::2/128"
- "10.10.100.2/32"
Die Angabe für das Interface muss dem Wireguard Interfacenamen aus
openwrt_network_interfaces
entsprechen, um eine Zuordnung zwischen Interface und Peer herzustellen zu können.
Um diees Feature nutzen zu können, müssen die Wireguard tools auf dem Ansible Controller installiert sein
Nutzt man mehrere Ansible Hosts, so muss man die Key Dateien selber synchronisieren, da ansonsten sie sonst erneut erstellt würden und zwischen den Ansible Systemen unterschiedlich wären.
Ab Version 0.1.4 beherscht die Network Rolle für Wireguard das Verwalten von Keys. Dazu müssen auf den Ansible Host die Wireguard tools installiert sein, da die Keys dort gepflegt und gespeichert werden.
In welchem Verzeichnis die Keys verwaltet werden, lässt sich über die Variable openwrt_network_wg_keypath
definieren
openwrt_network_wg_keypath: "/home/ansibleuser/wireguard"
Default ist /etc/wireguard/ansiblekeys
was aber angepasst werden sollte, weil die tasks für die keys mit become: false
laufen und so vermutlich in einen Fehler laufen. Der Benutzer mit dem Ansible ausgeführt wird, muss Rechte auf dieses Verzeichnis besitzen.
Möchte man vorhandene Keys übernehmen, speichert man sie in den entsprechenden Dateien innerhalb des wg_keypath Ordners ab.
./<<wireguard Interfacename>>/<<ansible_hostname>>_private.key
./<<wireguard Interfacename>>/<<ansible_hostname_public.key
./<<wireguard Interfacename>>/<<peername>>_public.key
./<<wireguard Interfacename>>/<<peername>>_private.key
./<<wireguard Interfacename>>/S2S.psk
./<<wireguard Interfacename>>/<<peername>>.psk
./<<wireguard Interfacename>>/<<peername>>.conf
Die private Keys sind sensibel. Die Rolle setzt die Zugriffsrechte für den privaten Schlüssel restriktiv. Sie müssen dennoch dafür Sorge tragen, dass die Schlüssel nicht in fremde Hände fallen.
Man muss für die Peers als auch für die Interfaces das Flag zum Management auf true setzen.
openwrt_network_wireguardpeers:
peername:
interface: "ROADWARRIOR"
genclientconfig: true
mtu: 1360
managekeys: true
setpsk: true
allowed_ips:
- "2a00:123:688:11::2/128"
- "10.10.100.2/32"
routes_to:
- "172.16.0.0/12"
openwrt_network_interfaceshost:
ROADWARRIOR:
proto: "wireguard"
wg_managekeys: true
wg_listen_port: 51821
wg_peerdns: 0
wg_addresses:
- "10.10.100.97/27"
- "2a00:123:456:22::1/64"
Wenn man setpsk
auf true
setzt, wird zudem ein preshared key erzeugt und in die config übernommen.
Möchte man die client config ebenfalls von Ansible erstellt haben, setzt man das flag generateclientconfig
auf true
. Die generierten Configs werden im Ordner abgelegt, wo Ansible die Keys verwaltet, siehe openwrt_network_wg_keypath
.
Die MTU ist im Default auf 1420, kann mit der mtu Option überschrieben werden. Möchte man in der generierten Client Config weitere Ziele in Form von Routen haben, nutzt man den Parameter routes_to.
Die Verwaltung der Keys bei einer Site 2 Site (S2S) VPN Verbindung verhält sich etwas anders. Bei der Definition des openwrt_network_wireguardpeers
muss das Flag s2s
auf true
gesetzt werden:
remotepeer1.example.com:
interface: "S2S_tunnel1"
s2s: true
remote_peer: "remotepeer1.example.com"
managekeys: true
setpsk: true
endpoint_host: "2001:1234:fefe:28d4::d3ad"
endpoint_port: 51821
route_allowed_ips: 1
allowed_ips:
- "10.10.128.0/20"
- "2001:4444:2333::/48"
Besonderheit ist, dass die Preshared Keys auf beiden Seiten identisch sein müssen. Ansonsten bekäme jede Seite ihren eigenen PSK generiert, was nicht funktioniert.
Eine weitere Besonderheit ist die Namensgebung für den Peer unter openwrt_network_wireguardpeers
. Der Name muss dem inventory_hostname
des jeweils anderen remote peers entsprechen.
peera.example.com <- Site 2 Site -> peerb.example.com
openwrt_network_wireguardpeers:
peera.example.com:
managekeys: true
s2s: true
...
und
openwrt_network_wireguardpeers:
peerb.example.com:
managekeys: true
s2s: true
...