Add role service-bird-ffrl
This commit is contained in:
parent
dd6d5b6ec5
commit
6792950fca
8 changed files with 291 additions and 0 deletions
71
roles/service-bird-ffrl/README.md
Normal file
71
roles/service-bird-ffrl/README.md
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
# Ansible role service-bird-ffrl
|
||||||
|
|
||||||
|
Diese Ansible role ergänzt die benötigte bird + bird6 Konfiguration für den Internet-Uplink über Freifunk Rheinland.
|
||||||
|
|
||||||
|
- schreibt ffrl_ipv4.conf + ffrl_ipv6.conf
|
||||||
|
- schreibt ffrl_ipv4_peers.conf + ffrl_ipv6_peers.conf
|
||||||
|
|
||||||
|
## Benötigte Variablen
|
||||||
|
|
||||||
|
- Variable `as_public_ffrl` # Public ASN Freifunk Rheinland
|
||||||
|
- Dictionary `meshes`
|
||||||
|
```
|
||||||
|
meshes:
|
||||||
|
xx:
|
||||||
|
...
|
||||||
|
ipv6:
|
||||||
|
public:
|
||||||
|
- # Public IPv6-Netzwerk
|
||||||
|
```
|
||||||
|
- Host Dictionary `ffrl_exit_server`
|
||||||
|
´´´
|
||||||
|
ffrl_exit_server:
|
||||||
|
ffrl-a-ak-ber:
|
||||||
|
public_ipv4_address: 185.66.195.0
|
||||||
|
tunnel_ipv4_network: # Tunnel-Netzwerk in CIDR
|
||||||
|
tunnel_ipv4_address: # Eigene Tunnel IPv4 Adresse
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network: # IPv6 Transfernetz
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
ffrl-b-ak-ber:
|
||||||
|
public_ipv4_address: 185.66.195.1
|
||||||
|
tunnel_ipv4_network:
|
||||||
|
tunnel_ipv4_address:
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network:
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
ffrl-a-ix-dus:
|
||||||
|
public_ipv4_address: 185.66.193.0
|
||||||
|
tunnel_ipv4_network:
|
||||||
|
tunnel_ipv4_address:
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network:
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
ffrl-b-ix-dus:
|
||||||
|
public_ipv4_address: 185.66.193.1
|
||||||
|
tunnel_ipv4_network:
|
||||||
|
tunnel_ipv4_address:
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network:
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
ffrl-a-fra2-fra:
|
||||||
|
public_ipv4_address: 185.66.194.0
|
||||||
|
tunnel_ipv4_network:
|
||||||
|
tunnel_ipv4_address:
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network:
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
ffrl-b-fra2-fra:
|
||||||
|
public_ipv4_address: 185.66.194.1
|
||||||
|
tunnel_ipv4_network:
|
||||||
|
tunnel_ipv4_address:
|
||||||
|
tunnel_ipv4_netmask: 255.255.255.254
|
||||||
|
tunnel_ipv6_network:
|
||||||
|
tunnel_ipv6_netmask: 64
|
||||||
|
´´´
|
||||||
|
- Host Variable `ffrl_public_ipv4_nat` # IPv4 NAT Adresse für das Gateway
|
||||||
|
- Host Variable `magic`
|
||||||
|
|
||||||
|
## Benötigte roles
|
||||||
|
|
||||||
|
- service-bird
|
12
roles/service-bird-ffrl/handlers/main.yml
Normal file
12
roles/service-bird-ffrl/handlers/main.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
- name: reload bird4
|
||||||
|
systemd:
|
||||||
|
name: bird
|
||||||
|
state: reloaded
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: reload bird6
|
||||||
|
systemd:
|
||||||
|
name: bird6
|
||||||
|
state: reloaded
|
||||||
|
become: true
|
3
roles/service-bird-ffrl/meta/main.yml
Normal file
3
roles/service-bird-ffrl/meta/main.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
dependencies:
|
||||||
|
- { role: service-bird }
|
26
roles/service-bird-ffrl/tasks/main.yml
Normal file
26
roles/service-bird-ffrl/tasks/main.yml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
- name: write ffrl bird configuration
|
||||||
|
template:
|
||||||
|
src: ffrl_ipv{{ item }}.conf.j2
|
||||||
|
dest: /etc/bird/ffrl_ipv{{ item }}.conf
|
||||||
|
mode: 0640
|
||||||
|
owner: bird
|
||||||
|
group: bird
|
||||||
|
notify: reload bird{{ item }}
|
||||||
|
with_items:
|
||||||
|
- 4
|
||||||
|
- 6
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: write ffrl peer configuration
|
||||||
|
template:
|
||||||
|
src: ffrl_ipv{{ item }}_peers.conf.j2
|
||||||
|
dest: /etc/bird/ffrl_ipv{{ item }}_peers.conf
|
||||||
|
mode: 0640
|
||||||
|
owner: bird
|
||||||
|
group: bird
|
||||||
|
notify: reload bird{{ item }}
|
||||||
|
with_items:
|
||||||
|
- 4
|
||||||
|
- 6
|
||||||
|
become: true
|
73
roles/service-bird-ffrl/templates/ffrl_ipv4.conf.j2
Normal file
73
roles/service-bird-ffrl/templates/ffrl_ipv4.conf.j2
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
#
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
define ffrl_as = {{ as_public_ffrl }};
|
||||||
|
define ffrl_nat_address = {{ ffrl_public_ipv4_nat }};
|
||||||
|
|
||||||
|
# Routing Table
|
||||||
|
table ffrl;
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
function is_ffrl_nat() {
|
||||||
|
return net ~ [
|
||||||
|
{{ ffrl_public_ipv4_nat }}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_ffrl_tunnel_nets() {
|
||||||
|
return net ~ [
|
||||||
|
{% for peer_id, peer_value in ffrl_exit_server.iteritems() %}
|
||||||
|
{{ peer_value.tunnel_ipv4_network }}{{ "," if not loop.last else "" }}
|
||||||
|
{% endfor %}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
# Filters
|
||||||
|
filter ebgp_ffrl_import_filter {
|
||||||
|
if is_default() then accept;
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
filter ebgp_ffrl_export_filter {
|
||||||
|
if is_ffrl_nat() then accept;
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Protocols
|
||||||
|
protocol static ffrl_uplink_hostroute {
|
||||||
|
table ffrl;
|
||||||
|
route {{ ffrl_public_ipv4_nat }}/32 reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct ffrl_tunnels {
|
||||||
|
table ffrl;
|
||||||
|
interface "ffrl-*";
|
||||||
|
import where is_ffrl_tunnel_nets();
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel kernel_ffrl {
|
||||||
|
scan time 30;
|
||||||
|
import none;
|
||||||
|
export filter {
|
||||||
|
krt_prefsrc = ffrl_nat_address;
|
||||||
|
accept;
|
||||||
|
};
|
||||||
|
table ffrl;
|
||||||
|
kernel table ipt_internet;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Templates
|
||||||
|
template bgp ffrl_uplink {
|
||||||
|
table ffrl;
|
||||||
|
local as mwu_as;
|
||||||
|
import keep filtered;
|
||||||
|
import filter ebgp_ffrl_import_filter;
|
||||||
|
export filter ebgp_ffrl_export_filter;
|
||||||
|
next hop self;
|
||||||
|
direct;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Include FFRL IPv4 peers
|
||||||
|
include "ffrl_ipv4_peers.con?";
|
13
roles/service-bird-ffrl/templates/ffrl_ipv4_peers.conf.j2
Normal file
13
roles/service-bird-ffrl/templates/ffrl_ipv4_peers.conf.j2
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
#
|
||||||
|
|
||||||
|
{% for peer_id, peer_value in ffrl_exit_server.iteritems() %}
|
||||||
|
protocol bgp {{ peer_id }} from ffrl_uplink {
|
||||||
|
source address {{ peer_value.tunnel_ipv4_address | ipaddr('address') }};
|
||||||
|
neighbor {{ peer_value.tunnel_ipv4_network | ipaddr('address') }} as ffrl_as;
|
||||||
|
};
|
||||||
|
{% if not loop.last %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
80
roles/service-bird-ffrl/templates/ffrl_ipv6.conf.j2
Normal file
80
roles/service-bird-ffrl/templates/ffrl_ipv6.conf.j2
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
#
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
define ffrl_as = {{ as_public_ffrl }};
|
||||||
|
|
||||||
|
# Routing Table
|
||||||
|
table ffrl;
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
function is_ffrl_public_nets() {
|
||||||
|
return net ~ [
|
||||||
|
{% for mesh_id, mesh_value in meshes.iteritems() %}
|
||||||
|
{% for prefix in mesh_value.ipv6.public %}
|
||||||
|
{{ prefix }}{48,56}{{ "," if not loop.last else "" }}{% endfor %}{{ "," if not loop.last else "" }}
|
||||||
|
{% endfor %}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_ffrl_tunnel_nets() {
|
||||||
|
return net ~ [
|
||||||
|
{% for peer_id, peer_value in ffrl_exit_server.iteritems() %}
|
||||||
|
{{ peer_value.tunnel_ipv6_network }}{{ "," if not loop.last else "" }}
|
||||||
|
{% endfor %}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
# Filters
|
||||||
|
filter ebgp_ffrl_import_filter {
|
||||||
|
if is_default() then accept;
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
filter ebgp_ffrl_export_filter {
|
||||||
|
if is_ffrl_public_nets() then accept;
|
||||||
|
reject;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Protocols
|
||||||
|
protocol static ffrl_public_routes {
|
||||||
|
table ffrl;
|
||||||
|
{% for mesh_id, mesh_value in meshes.iteritems() %}
|
||||||
|
{% for prefix in mesh_value.ipv6.public %}
|
||||||
|
route {{ prefix }} reject;
|
||||||
|
route {{ prefix | ipaddr('net') | ipsubnet(56, magic) | ipaddr('network') }} reject;
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol direct ffrl_tunnels {
|
||||||
|
table ffrl;
|
||||||
|
interface "ffrl-*";
|
||||||
|
import where is_ffrl_tunnel_nets();
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol kernel kernel_ffrl {
|
||||||
|
scan time 30;
|
||||||
|
import none;
|
||||||
|
export filter {
|
||||||
|
if is_default() then accept;
|
||||||
|
reject;
|
||||||
|
};
|
||||||
|
table ffrl;
|
||||||
|
kernel table ipt_internet;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Templates
|
||||||
|
template bgp ffrl_uplink {
|
||||||
|
table ffrl;
|
||||||
|
local as mwu_as;
|
||||||
|
import keep filtered;
|
||||||
|
import filter ebgp_ffrl_import_filter;
|
||||||
|
export filter ebgp_ffrl_export_filter;
|
||||||
|
next hop self;
|
||||||
|
direct;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Include FFRL IPv4 peers
|
||||||
|
include "ffrl_ipv6_peers.con?";
|
13
roles/service-bird-ffrl/templates/ffrl_ipv6_peers.conf.j2
Normal file
13
roles/service-bird-ffrl/templates/ffrl_ipv6_peers.conf.j2
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#
|
||||||
|
# {{ ansible_managed }}
|
||||||
|
#
|
||||||
|
|
||||||
|
{% for peer_id, peer_value in ffrl_exit_server.iteritems() %}
|
||||||
|
protocol bgp {{ peer_id }} from ffrl_uplink {
|
||||||
|
source address {{ peer_value.tunnel_ipv6_network | ipaddr('net') | ipaddr('2') | ipaddr('address') }};
|
||||||
|
neighbor {{ peer_value.tunnel_ipv6_network | ipaddr('net') | ipaddr('1') | ipaddr('address') }} as ffrl_as;
|
||||||
|
};
|
||||||
|
{% if not loop.last %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
Loading…
Reference in a new issue