howto/Bird2.md
... ...
@@ -0,0 +1,198 @@
1
+This guide is similar to the normal [Bird](/howto/Bird) guide in that it provides you with help setting up the BIRD routing daemon, with the difference that this page is dedicated to versions 2.x.
2
+
3
+# Arch Linux
4
+
5
+The `extra/bird` package in the arch repositories will usually have a relatively recent version and there is (usually) no need for a manual install over the usual `# pacman -S bird'.
6
+
7
+# Example configuration
8
+
9
+Please note: This example configuration is made for use with IPv4 and IPv6 (Really, there is no excuse not to get started with IPv6 networking! :) )
10
+
11
+The default config location in bird version 2.x is `/etc/bird.conf`, but this may vary depending on how your distribution compiled bird.
12
+
13
+When copying the configuration below onto your system, you will have to enter the following values in the file header:
14
+
15
+* Replace `<OWNAS>` with your autonomous system number, e.g. `4242421234`
16
+* Replace `<OWNIP>` with the ip that your router is going to have, this is usually the first non-zero ip in your subnet. (E.g. x.x.x.65 in an x.x.x.64/28 network)
17
+* Similarly, replace `<OWNIPv6>` with the first non-zero ip in your ipv6 subnet.
18
+* Then replace `<OWNNET>` with the IPv4 subnet that was assigned to you.
19
+* The same goes for `<OWNNETv6>`, but it takes an IPv6 subnet (Who'd have thought).
20
+* Keep in mind that you'll have to enter both networks in the OWNNET{,v6} and OWNNETSET{,v6}, the two variables are required due to set parsing difficulties with variables.
21
+```
22
+################################################
23
+# Variable header #
24
+################################################
25
+
26
+define OWNAS = <OWNAS>;
27
+define OWNIP = <OWNIP>;
28
+define OWNIPv6 = <OWNIPv6>;
29
+define OWNNET = <OWNNET>;
30
+define OWNNETv6 = <OWNNETv6>;
31
+define OWNNETSET = [<OWNNET>+];
32
+define OWNNETSETv6 = [<OWNNETv6>+];
33
+
34
+################################################
35
+# Header end #
36
+################################################
37
+
38
+router id OWNIP;
39
+
40
+protocol device {
41
+ scan time 10;
42
+}
43
+
44
+/*
45
+ * Utility functions
46
+ */
47
+
48
+function is_self_net() {
49
+ return net ~ OWNNETSET;
50
+}
51
+
52
+function is_self_net_v6() {
53
+ return net ~ OWNNETSETv6;
54
+}
55
+
56
+function is_valid_network() {
57
+ return net ~ [
58
+ 172.20.0.0/14{21,29}, # dn42
59
+ 172.20.0.0/24{28,32}, # dn42 Anycast
60
+ 172.21.0.0/24{28,32}, # dn42 Anycast
61
+ 172.22.0.0/24{28,32}, # dn42 Anycast
62
+ 172.23.0.0/24{28,32}, # dn42 Anycast
63
+ 172.31.0.0/16+, # ChaosVPN
64
+ 10.100.0.0/14+, # ChaosVPN
65
+ 10.0.0.0/8{15,24} # Freifunk.net
66
+ ];
67
+}
68
+
69
+roa4 table dn42_roa;
70
+roa6 table dn42_roa_v6;
71
+
72
+protocol static {
73
+ roa4 { table dn42_roa; };
74
+ include "/etc/bird/roa_dn42.conf";
75
+};
76
+
77
+protocol static {
78
+ roa6 { table dn42_roa_v6; };
79
+ include "/etc/bird/roa_dn42_v6.conf";
80
+};
81
+
82
+function is_valid_network_v6() {
83
+ return net ~ [
84
+ fd00::/8{44,64} # ULA address space as per RFC 4193
85
+ ];
86
+}
87
+
88
+protocol kernel {
89
+ scan time 20;
90
+
91
+ ipv6 {
92
+ import none;
93
+ export filter {
94
+ if source = RTS_STATIC then reject;
95
+ krt_prefsrc = OWNIPv6;
96
+ accept;
97
+ };
98
+ };
99
+};
100
+
101
+protocol kernel {
102
+ scan time 20;
103
+
104
+ ipv4 {
105
+ import none;
106
+ export filter {
107
+ if source = RTS_STATIC then reject;
108
+ krt_prefsrc = OWNIP;
109
+ accept;
110
+ };
111
+ };
112
+}
113
+
114
+protocol static {
115
+ route OWNNET reject;
116
+
117
+ ipv4 {
118
+ import all;
119
+ export none;
120
+ };
121
+}
122
+
123
+protocol static {
124
+ route OWNNETv6 reject;
125
+
126
+ ipv6 {
127
+ import all;
128
+ export none;
129
+ };
130
+}
131
+
132
+template bgp dnpeers {
133
+ local as OWNAS;
134
+ path metric 1;
135
+
136
+ ipv4 {
137
+ import filter {
138
+ if is_valid_network() && !is_self_net() then {
139
+ if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then {
140
+ print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
141
+ reject;
142
+ } else accept;
143
+ } else reject;
144
+ };
145
+
146
+ export filter { if is_valid_network() then accept; else reject; };
147
+ import limit 1000 action block;
148
+ };
149
+
150
+ ipv6 {
151
+ import filter {
152
+ if is_valid_network_v6() && !is_self_net_v6() then {
153
+ if (roa_check(dn42_roa_v6, net, bgp_path.last) = ROA_INVALID) then {
154
+ print "[dn42] ROA check failed for ", net, " ASN ", bgp_path.last;
155
+ reject;
156
+ } else accept;
157
+ } else reject;
158
+ };
159
+ export filter { if is_valid_network_v6() then accept; else reject; };
160
+ import limit 1000 action block;
161
+ };
162
+}
163
+
164
+
165
+include "/etc/bird/peers/*";
166
+```
167
+
168
+# Route Origin Authorization
169
+
170
+He example config above relies on ROA configuration files in `/etc/bird/roa_dn42{,_v6}.conf`. These should be automatically downloaded and updated every so often to prevent BGP highjacking, which can be achieved using a simple cronjob:
171
+
172
+ */30 * * * * root curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.tech9.io/roa/bird6_roa_dn42.conf && curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.tech9.io/roa/bird_roa_dn42.conf && sed -i 's/roa/route/g' /etc/bird/roa_dn42{,_v6}.conf && birdc configure
173
+
174
+Also make sure the /etc/bird directory exists:
175
+
176
+ # mkdir -p /etc/bird
177
+
178
+# Setting up peers
179
+
180
+Please note: This section assumes that you've already got a tunnel to your peering partner setup.
181
+
182
+First, make sure the /etc/bird/peers directory exists:
183
+
184
+ # mkdir -p /etc/bird/peers
185
+
186
+Then for each peer, create a configuration file similar to this one:
187
+
188
+```
189
+protocol bgp <name> from dnpeers {
190
+ neighbor <NEIGHBOR_IP> as <NEIGHBOR_ASN>;
191
+}
192
+
193
+protocol bgp <name>_v6 from dnpeers {
194
+ neighbor <NEIGHBOR_IPv6>%<NEIGHBOR_INTERFACE> as <NEIGHBOR_ASN>;
195
+}
196
+```
197
+
198
+Due to the special link local addresses of IPv6, an interface has to be specified using the %<if> syntax if a link local address is used (Which is recommended)
... ...
\ No newline at end of file