chiark / gitweb /
local.m4: Add the `hippotat' network.
[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(84)m4_dnl
358 ###--------------------------------------------------------------------------
359 ### Locally-bound packet inspection.
360
361 clearchain inbound
362
363 ## Track connections.
364 commonrules inbound
365 conntrack inbound
366
367 ## Allow incoming bootp.  Bootp won't be forwarded, so this is obviously a
368 ## local request.
369 run iptables -A inbound -j ACCEPT \
370         -s 0.0.0.0 -d 255.255.255.255 \
371         -p udp --source-port $port_bootpc --destination-port $port_bootps
372 run iptables -A inbound -j ACCEPT \
373         -s 172.29.198.0/23 \
374         -p udp --source-port $port_bootpc --destination-port $port_bootps
375
376 ## Allow incoming ping.  This is the only ICMP left.
377 run iptables -A inbound -j ACCEPT -p icmp
378 run ip6tables -A inbound -j ACCEPT -p icmpv6
379
380 m4_divert(88)m4_dnl
381 ## Allow unusual things.
382 openports inbound
383
384 ## Inspect inbound packets from untrusted sources.
385 run ip46tables -A inbound -j forbidden
386 run ip46tables -A INPUT -m mark --mark $from_scary/$MASK_FROM -g inbound
387 run ip46tables -A INPUT -m mark --mark $from_untrusted/$MASK_FROM -g inbound
388
389 ## Allow responses from the scary outside world into the untrusted net, but
390 ## don't let untrusted things run services.
391 case $forward in
392   1)
393     run ip46tables -A FORWARD -j ACCEPT \
394         -m mark --mark $(( $from_scary | $to_untrusted ))/$(( $MASK_FROM | $MASK_TO )) \
395         -m state --state ESTABLISHED,RELATED
396     ;;
397 esac
398
399 ## Otherwise process as indicated by the mark.
400 for i in $inchains; do
401   run ip46tables -A $i -m mark ! --mark 0/$MASK_MASK -j ACCEPT
402 done
403
404 m4_divert(-1)
405 ###----- That's all, folks --------------------------------------------------