Explcitly disable IPv6 on the IC internal network
[chef.git] / cookbooks / networking / recipes / default.rb
1 #
2 # Cookbook Name:: networking
3 # Recipe:: default
4 #
5 # Copyright 2010, OpenStreetMap Foundation.
6 # Copyright 2009, Opscode, Inc.
7 #
8 # Licensed under the Apache License, Version 2.0 (the "License");
9 # you may not use this file except in compliance with the License.
10 # You may obtain a copy of the License at
11 #
12 #     http://www.apache.org/licenses/LICENSE-2.0
13 #
14 # Unless required by applicable law or agreed to in writing, software
15 # distributed under the License is distributed on an "AS IS" BASIS,
16 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 # See the License for the specific language governing permissions and
18 # limitations under the License.
19 #
20 # = Requires
21 # * node[:networking][:nameservers]
22
23 require "ipaddr"
24
25 node[:networking][:interfaces].each do |name, interface|
26   if interface[:role] && (role = node[:networking][:roles][interface[:role]])
27     if role[interface[:family]]
28       node.set[:networking][:interfaces][name][:method] = role[interface[:family]][:method]
29       node.set[:networking][:interfaces][name][:prefix] = role[interface[:family]][:prefix]
30       node.set[:networking][:interfaces][name][:gateway] = role[interface[:family]][:gateway]
31     end
32
33     node.set[:networking][:interfaces][name][:metric] = role[:metric]
34     node.set[:networking][:interfaces][name][:zone] = role[:zone]
35   end
36
37   node.set_unless[:networking][:interfaces][name][:method] = "static"
38
39   next unless interface[:address]
40
41   prefix = node[:networking][:interfaces][name][:prefix]
42
43   node.set[:networking][:interfaces][name][:netmask] = (~IPAddr.new(interface[:address]).mask(0)).mask(prefix)
44   node.set[:networking][:interfaces][name][:network] = IPAddr.new(interface[:address]).mask(prefix)
45 end
46
47 template "/etc/network/interfaces" do
48   source "interfaces.erb"
49   owner "root"
50   group "root"
51   mode 0644
52 end
53
54 execute "hostname" do
55   action :nothing
56   command "/bin/hostname -F /etc/hostname"
57 end
58
59 template "/etc/hostname" do
60   source "hostname.erb"
61   owner "root"
62   group "root"
63   mode 0644
64   notifies :run, "execute[hostname]"
65 end
66
67 template "/etc/hosts" do
68   source "hosts.erb"
69   owner "root"
70   group "root"
71   mode 0644
72 end
73
74 link "/etc/resolv.conf" do
75   action :delete
76   link_type :symbolic
77   to "/run/resolvconf/resolv.conf"
78   only_if { File.symlink?("/etc/resolv.conf") }
79 end
80
81 template "/etc/resolv.conf" do
82   source "resolv.conf.erb"
83   owner "root"
84   group "root"
85   mode 0644
86 end
87
88 node.interfaces(:role => :internal) do |interface|
89   if interface[:gateway] && interface[:gateway] != interface[:address]
90     search(:node, "networking_interfaces*address:#{interface[:gateway]}") do |gateway|
91       next unless gateway[:openvpn]
92
93       gateway[:openvpn][:tunnels].each_value do |tunnel|
94         if tunnel[:peer][:address] # ~FC023
95           route tunnel[:peer][:address] do
96             netmask "255.255.255.255"
97             gateway interface[:gateway]
98             device interface[:interface]
99           end
100         end
101
102         next unless tunnel[:peer][:networks]
103
104         tunnel[:peer][:networks].each do |network|
105           route network[:address] do
106             netmask network[:netmask]
107             gateway interface[:gateway]
108             device interface[:interface]
109           end
110         end
111       end
112     end
113   end
114 end
115
116 zones = {}
117
118 search(:node, "networking:interfaces").collect do |n|
119   next if n[:fqdn] == node[:fqdn]
120
121   n.interfaces.each do |interface|
122     next unless interface[:role] == "external" && interface[:zone]
123
124     zones[interface[:zone]] ||= {}
125     zones[interface[:zone]][interface[:family]] ||= []
126     zones[interface[:zone]][interface[:family]] << interface[:address]
127   end
128 end
129
130 package "shorewall"
131
132 service "shorewall" do
133   action [:enable, :start]
134   supports :restart => true
135   status_command "shorewall status"
136 end
137
138 template "/etc/default/shorewall" do
139   source "shorewall-default.erb"
140   owner "root"
141   group "root"
142   mode 0644
143   notifies :restart, "service[shorewall]"
144 end
145
146 template "/etc/shorewall/shorewall.conf" do
147   source "shorewall.conf.erb"
148   owner "root"
149   group "root"
150   mode 0644
151   notifies :restart, "service[shorewall]"
152 end
153
154 template "/etc/shorewall/zones" do
155   source "shorewall-zones.erb"
156   owner "root"
157   group "root"
158   mode 0644
159   variables :type => "ipv4"
160   notifies :restart, "service[shorewall]"
161 end
162
163 template "/etc/shorewall/interfaces" do
164   source "shorewall-interfaces.erb"
165   owner "root"
166   group "root"
167   mode 0644
168   notifies :restart, "service[shorewall]"
169 end
170
171 template "/etc/shorewall/hosts" do
172   source "shorewall-hosts.erb"
173   owner "root"
174   group "root"
175   mode 0644
176   variables :zones => zones
177   notifies :restart, "service[shorewall]"
178 end
179
180 template "/etc/shorewall/policy" do
181   source "shorewall-policy.erb"
182   owner "root"
183   group "root"
184   mode 0644
185   notifies :restart, "service[shorewall]"
186 end
187
188 template "/etc/shorewall/rules" do
189   source "shorewall-rules.erb"
190   owner "root"
191   group "root"
192   mode 0644
193   variables :rules => []
194   notifies :restart, "service[shorewall]"
195 end
196
197 template "/etc/logrotate.d/shorewall" do
198   source "logrotate.shorewall.erb"
199   owner "root"
200   group "root"
201   mode 0644
202   variables :name => "shorewall"
203 end
204
205 firewall_rule "limit-icmp-echo" do
206   action :accept
207   family :inet
208   source "net"
209   dest "fw"
210   proto "icmp"
211   dest_ports "echo-request"
212   rate_limit "s:1/sec:5"
213 end
214
215 %w(ucl ic bm).each do |zone|
216   firewall_rule "accept-openvpn-#{zone}" do
217     action :accept
218     family :inet
219     source zone
220     dest "fw"
221     proto "udp"
222     dest_ports "1194:1196"
223     source_ports "1194:1196"
224   end
225 end
226
227 if node[:roles].include?("gateway")
228   template "/etc/shorewall/masq" do
229     source "shorewall-masq.erb"
230     owner "root"
231     group "root"
232     mode 0644
233     notifies :restart, "service[shorewall]"
234   end
235 else
236   file "/etc/shorewall/masq" do
237     action :delete
238     notifies :restart, "service[shorewall]"
239   end
240 end
241
242 unless node.interfaces(:family => :inet6).empty?
243   package "shorewall6"
244
245   service "shorewall6" do
246     action [:enable, :start]
247     supports :restart => true
248     status_command "shorewall6 status"
249   end
250
251   template "/etc/default/shorewall6" do
252     source "shorewall-default.erb"
253     owner "root"
254     group "root"
255     mode 0644
256     notifies :restart, "service[shorewall6]"
257   end
258
259   template "/etc/shorewall6/shorewall6.conf" do
260     source "shorewall6.conf.erb"
261     owner "root"
262     group "root"
263     mode 0644
264     notifies :restart, "service[shorewall6]"
265   end
266
267   template "/etc/shorewall6/zones" do
268     source "shorewall-zones.erb"
269     owner "root"
270     group "root"
271     mode 0644
272     variables :type => "ipv6"
273     notifies :restart, "service[shorewall6]"
274   end
275
276   template "/etc/shorewall6/interfaces" do
277     source "shorewall6-interfaces.erb"
278     owner "root"
279     group "root"
280     mode 0644
281     notifies :restart, "service[shorewall6]"
282   end
283
284   template "/etc/shorewall6/hosts" do
285     source "shorewall6-hosts.erb"
286     owner "root"
287     group "root"
288     mode 0644
289     variables :zones => zones
290     notifies :restart, "service[shorewall6]"
291   end
292
293   template "/etc/shorewall6/policy" do
294     source "shorewall-policy.erb"
295     owner "root"
296     group "root"
297     mode 0644
298     notifies :restart, "service[shorewall6]"
299   end
300
301   template "/etc/shorewall6/rules" do
302     source "shorewall-rules.erb"
303     owner "root"
304     group "root"
305     mode 0644
306     variables :rules => []
307     notifies :restart, "service[shorewall6]"
308   end
309
310   template "/etc/logrotate.d/shorewall6" do
311     source "logrotate.shorewall.erb"
312     owner "root"
313     group "root"
314     mode 0644
315     variables :name => "shorewall6"
316   end
317
318   firewall_rule "limit-icmp6-echo" do
319     action :accept
320     family :inet6
321     source "net"
322     dest "fw"
323     proto "ipv6-icmp"
324     dest_ports "echo-request"
325     rate_limit "s:1/sec:5"
326   end
327 end
328
329 firewall_rule "accept-http" do
330   action :accept
331   source "net"
332   dest "fw"
333   proto "tcp:syn"
334   dest_ports "http"
335 end
336
337 firewall_rule "accept-https" do
338   action :accept
339   source "net"
340   dest "fw"
341   proto "tcp:syn"
342   dest_ports "https"
343 end