chiark / gitweb /
local.mk: Reinstate mango.
[firewall] / local.m4
1 ### -*-sh-*-
2 ###
3 ### Local firewall configuration
4 ###
5 ### (c) 2008 Mark Wooding
6 ###
7
8 ###----- Licensing notice ---------------------------------------------------
9 ###
10 ### This program is free software; you can redistribute it and/or modify
11 ### it under the terms of the GNU General Public License as published by
12 ### the Free Software Foundation; either version 2 of the License, or
13 ### (at your option) any later version.
14 ###
15 ### This program is distributed in the hope that it will be useful,
16 ### but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ### GNU General Public License for more details.
19 ###
20 ### You should have received a copy of the GNU General Public License
21 ### along with this program; if not, write to the Free Software Foundation,
22 ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
24 ###--------------------------------------------------------------------------
25 ### Local configuration.
26
27 m4_divert(6)m4_dnl
28 ## Default NTP servers.
29 defconf(ntp_servers,
30         "158.152.1.76 158.152.1.204 194.159.253.2 195.173.57.232")
31
32 m4_divert(-1)
33 ###--------------------------------------------------------------------------
34 ### Packet classification.
35
36 ## IPv4 addressing.
37 ##
38 ## There are two small blocks of publicly routable IPv4 addresses, and a
39 ## block of RFC1918 private-use addresses allocated from the Cambridge G-RIN.
40 ## The former are as follows.
41 ##
42 ## 81.2.113.195, 81.187.238.128/28
43 ##              House border network (dmz).  We have all of these; the loose
44 ##              address is for the router.
45 ##
46 ## 212.13.18.64/28
47 ##              Jump colocated network (jump).  .65--68 are used by Jump
48 ##              network infrastructure; we get the rest.
49 ##
50 ## The latter is the block 172.29.196.0/22.  Currently the low half is
51 ## unallocated (and may be returned to the G-RIN); the remaining addresses
52 ## are allocated as follows.
53 ##
54 ## 172.29.198.0/24  Untrusted networks.
55 ##      .0/25           house wireless net
56 ##      .128/28         iodine (IP-over-DNS) network
57 ##      .144/28         hippotat (IP-over-HTTP) network
58 ##      .160/27         untrusted virtual network
59 ##
60 ## 172.29.199.0/24  Trusted networks.
61 ##      .0/25           house wired network
62 ##      .128/27         mobile VPN hosts
63 ##      .160/28         reserved, except .160/30 allocated for ITS
64 ##      .176/28         internal colocated network
65 ##      .192/27         house safe network
66 ##      .224/27         anycast services
67
68 ## IPv6 addressing.
69 ##
70 ## There are five blocks of publicly routable IPv6 addresses, though some of
71 ## them aren't very interesting.  The ranges are as follows.
72 ##
73 ## 2001:8b0:c92::/48
74 ##              Main house range (aaisp).  See below for allocation policy.
75 ##              There is no explicit DMZ allocation (and no need for one).
76 ##
77 ## 2001:ba8:0:1d9::/64
78 ##              Jump border network (jump): :1 is the router (supplied by
79 ##              Jump); other addresses are ours.
80 ##
81 ## 2001:ba8:1d9::/48
82 ##              Main colocated range.  See below for allocation policy.
83 ##
84 ## Addresses in the /64 networks are simply allocated in ascending order.
85 ## The /48s are split into /64s by appending a 16-bit network number.  The
86 ## top nibble of the network number classifies the network, as follows.
87 ##
88 ## axxx         Virtual, untrusted
89 ## 8xxx         Untrusted
90 ## 6xxx         Virtual, safe
91 ## 4xxx         Safe
92 ## 0xxx         Unsafe, trusted
93 ##
94 ## These have been chosen so that network properties can be deduced by
95 ## inspecting bits of the network number:
96 ##
97 ## Bit 15       If set, the network is untrusted; otherwise it is trusted.
98 ## Bit 14       If set, the network is safe; otherwise it is unsafe.
99 ##
100 ## Finally, the low-order nibbles identify the site.
101 ##
102 ## 0            No specific site: mobile VPN endpoints or anycast addresses.
103 ## 1            House.
104 ## 2            Jump colocation.
105 ## fff          Local border network.
106 ##
107 ## Usually site-0 networks are allocated from the Jump range to improve
108 ## expected performance from/to external sites which don't engage in our
109 ## dynamic routing protocols.
110
111 ## Define the available network classes.
112 m4_divert(42)m4_dnl
113 defnetclass scary       scary           trusted             mcast
114 defnetclass untrusted   scary untrusted trusted             mcast
115 defnetclass trusted     scary untrusted trusted safe noloop mcast
116 defnetclass safe                        trusted safe noloop mcast
117 defnetclass noloop                      trusted safe        mcast
118
119 defnetclass link
120 defnetclass mcast
121 m4_divert(-1)
122
123 m4_divert(26)m4_dnl
124 ###--------------------------------------------------------------------------
125 ### Network layout.
126
127 ## House networks.
128 defnet dmz trusted
129         addr 81.2.113.195 81.187.238.128/28 2001:8b0:c92:fff::/64
130         via unsafe untrusted
131 defnet unsafe trusted
132         addr 172.29.199.0/25 2001:8b0:c92:1::/64
133         via househub
134 defnet safe safe
135         addr 172.29.199.192/27 2001:8b0:c92:4001::/64
136         via househub
137 defnet untrusted untrusted
138         addr 172.29.198.0/25 2001:8b0:c92:8001::/64
139         via househub
140
141 defnet househub virtual
142         via housebdry dmz unsafe safe untrusted
143 defnet housebdry virtual
144         via househub hub
145
146 ## House hosts.
147 defhost radius
148         hosttype router
149         iface eth0 dmz unsafe safe untrusted vpn sgo colobdry default
150         iface eth1 dmz unsafe safe untrusted vpn sgo colobdry default
151         iface eth2 dmz unsafe safe untrusted vpn sgo colobdry
152         iface eth3 unsafe untrusted vpn default
153         iface ppp0 default
154         iface t6-he default
155         iface vpn-precision colobdry vpn sgo
156         iface vpn-chiark sgo
157         iface vpn-+ vpn
158 defhost roadstar
159         iface eth0 dmz unsafe
160         iface eth1 dmz unsafe
161 defhost jem
162         iface eth0 dmz unsafe
163         iface eth1 dmz unsafe
164 defhost universe
165         iface eth0 dmz unsafe
166         iface eth1 dmz unsafe
167 defhost artist
168         hosttype router
169         iface eth0 dmz unsafe untrusted
170         iface eth1 dmz unsafe untrusted
171         iface eth3 unsafe untrusted
172 defhost vampire
173         hosttype router
174         iface eth0.4 dmz unsafe untrusted safe vpn sgo colobdry
175         iface eth0.5 dmz unsafe untrusted safe vpn sgo colobdry
176         iface eth0.6 dmz unsafe safe untrusted vpn sgo colobdry
177         iface eth0.7 unsafe untrusted vpn
178         iface vpn-precision colobdry vpn sgo
179         iface vpn-chiark sgo
180         iface vpn-+ vpn
181 defhost ibanez
182         iface br-dmz dmz unsafe
183         iface br-unsafe unsafe
184 defhost orange
185         iface wlan0 untrusted
186         iface vpn-radius unsafe
187 defhost groove
188         iface eth0 unsafe
189         iface wlan0 untrusted
190         iface vpn-radius unsafe
191
192 defhost gibson
193         hosttype client
194         iface eth0 unsafe
195
196 ## Colocated networks.
197 defnet jump trusted
198         addr 212.13.198.64/28 2001:ba8:0:1d9::/64
199         via colohub
200 defnet colo trusted
201         addr 172.29.199.176/28 2001:ba8:1d9:2::/64
202         via colohub
203 defnet colohub virtual
204         via colobdry jump colo
205 defnet colobdry virtual
206         via colohub hub
207 defnet iodine untrusted
208         addr 172.29.198.128/28
209         via colohub
210 defnet hippotat untrusted
211         addr 172.29.198.144/28
212         via colohub
213
214 ## Colocated hosts.
215 defhost fender
216         iface br-jump jump colo
217         iface br-colo jump colo
218 defhost precision
219         hosttype router
220         iface eth0 jump colo vpn sgo
221         iface eth1 jump colo vpn sgo
222         iface vpn-mango binswood
223         iface vpn-radius housebdry vpn sgo
224         iface vpn-chiark sgo
225         iface vpn-national upn
226         iface vpn-+ vpn
227 defhost telecaster
228         iface eth0 jump colo
229         iface eth1 jump colo
230 defhost stratocaster
231         iface eth0 jump colo
232         iface eth1 jump colo
233 defhost jazz
234         hosttype router
235         iface eth0 jump colo vpn
236         iface eth1 jump colo vpn
237         iface dns0 iodine
238         iface hippo-svc hippotat
239         iface vpn-+ vpn
240
241 ## Other networks.
242 defnet hub virtual
243         via housebdry colobdry
244 defnet sgo noloop
245         addr !172.29.198.0/23
246         addr 10.0.0.0/8
247         addr 172.16.0.0/12
248         addr 192.168.0.0/16
249         via househub colohub
250 defnet vpn trusted
251         addr 172.29.199.128/27 2001:ba8:1d9:6000::/64
252         via househub colohub
253         host crybaby 1 ::1:1
254         host terror 2 ::2:1
255         host orange 3 ::3:1
256         host haze 4 ::4:1
257         host groove 5 ::5:1
258 defnet anycast trusted
259         addr 172.29.199.224/27 2001:ba8:1d9:0::/64
260         via dmz unsafe safe untrusted jump colo vpn
261 defnet default scary
262         addr 81.2.113.195 81.187.238.128/28 2001:8b0:c92::/48
263         addr 212.13.198.64/28 2001:ba8:0:1d9::/64
264         addr 2001:ba8:1d9::/48 #temporary
265         via dmz unsafe untrusted jump colo
266 defnet upn untrusted
267         addr 172.29.198.160/27 2001:ba8:1d9:a000::/64
268         via colohub
269         host national 1 ::1:1
270
271 ## Linode hosts.
272 defhost national
273         iface eth0 default
274         iface vpn-precision colohub
275
276 ## Satellite networks.
277 defnet binswood noloop
278         addr 10.165.27.0/24
279         via colohub
280 defhost mango
281         hosttype router
282         iface eth0 binswood default
283         iface vpn-precision colo
284
285 m4_divert(80)m4_dnl
286 ###--------------------------------------------------------------------------
287 ### Connection tracking helper modules.
288
289 for i in ftp; do
290   modprobe nf_conntrack_$i
291 done
292
293 m4_divert(80)m4_dnl
294 ###--------------------------------------------------------------------------
295 ### Special forwarding exemptions.
296
297 case $forward in
298   1)
299
300     ## Only allow these packets if they're not fragmented.  (Don't trust safe
301     ## hosts's fragment reassembly to be robust against malicious fragments.)
302     ## There's a hideous bug in iptables 1.4.11.1 which botches the meaning
303     ## of `! -f', so we do the negation using early return from a subchain.
304     clearchain fwd-spec-nofrag
305     run iptables -A fwd-spec-nofrag -j RETURN --fragment
306     run ip6tables -A fwd-spec-nofrag -j RETURN \
307             -m ipv6header --soft --header frag
308     run ip46tables -A FORWARD -j fwd-spec-nofrag
309
310     ## Allow ping from safe/noloop to untrusted networks.
311     run iptables -A fwd-spec-nofrag -j ACCEPT \
312             -p icmp --icmp-type echo-request \
313             -m mark --mark $to_untrusted/$MASK_TO
314     run iptables -A fwd-spec-nofrag -j ACCEPT \
315             -p icmp --icmp-type echo-reply \
316             -m mark --mark $from_untrusted/$MASK_FROM \
317             -m state --state ESTABLISHED
318     run ip6tables -A fwd-spec-nofrag -j ACCEPT \
319             -p icmpv6 --icmpv6-type echo-request \
320             -m mark --mark $to_untrusted/$MASK_TO
321     run ip6tables -A fwd-spec-nofrag -j ACCEPT \
322             -p icmpv6 --icmpv6-type echo-reply \
323             -m mark --mark $from_untrusted/$MASK_FROM \
324             -m state --state ESTABLISHED
325
326     ## Allow SSH from safe/noloop to untrusted networks.
327     run ip46tables -A fwd-spec-nofrag -j ACCEPT \
328             -p tcp --destination-port $port_ssh \
329             -m mark --mark $to_untrusted/$MASK_TO
330     run ip46tables -A fwd-spec-nofrag -j ACCEPT \
331             -p tcp --source-port $port_ssh \
332             -m mark --mark $from_untrusted/$MASK_FROM \
333             -m state --state ESTABLISHED
334
335     ;;
336 esac
337
338 m4_divert(80)m4_dnl
339 ###--------------------------------------------------------------------------
340 ### Kill things we don't understand properly.
341 ###
342 ### I don't like having to do this, but since I don't know how to do proper
343 ### multicast filtering, I'm just going to ban it from being forwarded.
344
345 errorchain poorly-understood REJECT
346
347 ## Ban multicast destination addresses in forwarding.
348 case $forward in
349   1)
350     run iptables -A FORWARD -g poorly-understood \
351             -d 224.0.0.0/4
352     run ip6tables -A FORWARD -g poorly-understood \
353             -d ff::/8
354     ;;
355 esac
356
357 m4_divert(82)m4_dnl
358 ###--------------------------------------------------------------------------
359 ### Check for source routing.
360
361 clearchain check-srcroute
362
363 run iptables -A check-srcroute -g forbidden \
364     -m ipv4options --any --flags lsrr,ssrr
365 run ip6tables -A check-srcroute -g forbidden \
366     -m rt
367
368 for c in INPUT FORWARD; do
369   for m in $from_scary $from_untrusted; do
370     run ip46tables -A $c -m mark --mark $m/$MASK_FROM -j check-srcroute
371   done
372 done
373
374 m4_divert(84)m4_dnl
375 ###--------------------------------------------------------------------------
376 ### Locally-bound packet inspection.
377
378 clearchain inbound
379
380 ## Track connections.
381 commonrules inbound
382 conntrack inbound
383
384 ## Allow incoming bootp.  Bootp won't be forwarded, so this is obviously a
385 ## local request.
386 run iptables -A inbound -j ACCEPT \
387         -s 0.0.0.0 -d 255.255.255.255 \
388         -p udp --source-port $port_bootpc --destination-port $port_bootps
389 run iptables -A inbound -j ACCEPT \
390         -s 172.29.198.0/23 \
391         -p udp --source-port $port_bootpc --destination-port $port_bootps
392
393 ## Allow incoming ping.  This is the only ICMP left.
394 run iptables -A inbound -j ACCEPT -p icmp
395 run ip6tables -A inbound -j ACCEPT -p icmpv6
396
397 m4_divert(88)m4_dnl
398 ## Allow unusual things.
399 openports inbound
400
401 ## Inspect inbound packets from untrusted sources.
402 run ip46tables -A inbound -g forbidden
403 run ip46tables -A INPUT -m mark --mark $from_scary/$MASK_FROM -g inbound
404 run ip46tables -A INPUT -m mark --mark $from_untrusted/$MASK_FROM -g inbound
405
406 ## Allow responses from the scary outside world into the untrusted net, but
407 ## don't let untrusted things run services.
408 case $forward in
409   1)
410     run ip46tables -A FORWARD -j ACCEPT \
411         -m mark --mark $(( $from_scary | $to_untrusted ))/$(( $MASK_FROM | $MASK_TO )) \
412         -m state --state ESTABLISHED,RELATED
413     ;;
414 esac
415
416 ## Otherwise process as indicated by the mark.
417 for i in $inchains; do
418   run ip46tables -A $i -m mark ! --mark 0/$MASK_MASK -j ACCEPT
419 done
420
421 m4_divert(-1)
422 ###----- That's all, folks --------------------------------------------------