Create shorewall config files before trying to start it
[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 network_packages = []
26
27 node[:networking][:interfaces].each do |name, interface|
28   network_packages |= ["vlan"] if interface[:interface] =~ /\.\d+$/
29   network_packages |= ["ifenslave"] if interface[:bond]
30
31   if interface[:role] && (role = node[:networking][:roles][interface[:role]])
32     if role[interface[:family]]
33       node.set[:networking][:interfaces][name][:prefix] = role[interface[:family]][:prefix]
34       node.set[:networking][:interfaces][name][:gateway] = role[interface[:family]][:gateway]
35     end
36
37     node.set[:networking][:interfaces][name][:metric] = role[:metric]
38     node.set[:networking][:interfaces][name][:zone] = role[:zone]
39   end
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 package network_packages
48
49 template "/etc/network/interfaces" do
50   source "interfaces.erb"
51   owner "root"
52   group "root"
53   mode 0644
54 end
55
56 execute "hostname" do
57   action :nothing
58   command "/bin/hostname -F /etc/hostname"
59 end
60
61 template "/etc/hostname" do
62   source "hostname.erb"
63   owner "root"
64   group "root"
65   mode 0644
66   notifies :run, "execute[hostname]"
67 end
68
69 template "/etc/hosts" do
70   source "hosts.erb"
71   owner "root"
72   group "root"
73   mode 0644
74 end
75
76 link "/etc/resolv.conf" do
77   action :delete
78   link_type :symbolic
79   to "/run/resolvconf/resolv.conf"
80   only_if { File.symlink?("/etc/resolv.conf") }
81 end
82
83 template "/etc/resolv.conf" do
84   source "resolv.conf.erb"
85   owner "root"
86   group "root"
87   mode 0644
88 end
89
90 node.interfaces(:role => :internal) do |interface|
91   if interface[:gateway] && interface[:gateway] != interface[:address]
92     search(:node, "networking_interfaces*address:#{interface[:gateway]}") do |gateway|
93       next unless gateway[:openvpn]
94
95       gateway[:openvpn][:tunnels].each_value do |tunnel|
96         if tunnel[:peer][:address] # ~FC023
97           route tunnel[:peer][:address] do
98             netmask "255.255.255.255"
99             gateway interface[:gateway]
100             device interface[:interface]
101           end
102         end
103
104         next unless tunnel[:peer][:networks]
105
106         tunnel[:peer][:networks].each do |network|
107           route network[:address] do
108             netmask network[:netmask]
109             gateway interface[:gateway]
110             device interface[:interface]
111           end
112         end
113       end
114     end
115   end
116 end
117
118 zones = {}
119
120 search(:node, "networking:interfaces").collect do |n|
121   next if n[:fqdn] == node[:fqdn]
122
123   n.interfaces.each do |interface|
124     next unless interface[:role] == "external" && interface[:zone]
125
126     zones[interface[:zone]] ||= {}
127     zones[interface[:zone]][interface[:family]] ||= []
128     zones[interface[:zone]][interface[:family]] << interface[:address]
129   end
130 end
131
132 package "shorewall"
133
134 template "/etc/default/shorewall" do
135   source "shorewall-default.erb"
136   owner "root"
137   group "root"
138   mode 0644
139   notifies :restart, "service[shorewall]"
140 end
141
142 template "/etc/shorewall/shorewall.conf" do
143   source "shorewall.conf.erb"
144   owner "root"
145   group "root"
146   mode 0644
147   notifies :restart, "service[shorewall]"
148 end
149
150 template "/etc/shorewall/zones" do
151   source "shorewall-zones.erb"
152   owner "root"
153   group "root"
154   mode 0644
155   variables :type => "ipv4"
156   notifies :restart, "service[shorewall]"
157 end
158
159 template "/etc/shorewall/interfaces" do
160   source "shorewall-interfaces.erb"
161   owner "root"
162   group "root"
163   mode 0644
164   notifies :restart, "service[shorewall]"
165 end
166
167 template "/etc/shorewall/hosts" do
168   source "shorewall-hosts.erb"
169   owner "root"
170   group "root"
171   mode 0644
172   variables :zones => zones
173   notifies :restart, "service[shorewall]"
174 end
175
176 template "/etc/shorewall/policy" do
177   source "shorewall-policy.erb"
178   owner "root"
179   group "root"
180   mode 0644
181   notifies :restart, "service[shorewall]"
182 end
183
184 template "/etc/shorewall/rules" do
185   source "shorewall-rules.erb"
186   owner "root"
187   group "root"
188   mode 0644
189   variables :rules => []
190   notifies :restart, "service[shorewall]"
191 end
192
193 service "shorewall" do
194   action [:enable, :start]
195   supports :restart => true
196   status_command "shorewall status"
197 end
198
199 template "/etc/logrotate.d/shorewall" do
200   source "logrotate.shorewall.erb"
201   owner "root"
202   group "root"
203   mode 0644
204   variables :name => "shorewall"
205 end
206
207 firewall_rule "limit-icmp-echo" do
208   action :accept
209   family :inet
210   source "net"
211   dest "fw"
212   proto "icmp"
213   dest_ports "echo-request"
214   rate_limit "s:1/sec:5"
215 end
216
217 %w(ucl ic bm aws).each do |zone|
218   firewall_rule "accept-openvpn-#{zone}" do
219     action :accept
220     family :inet
221     source zone
222     dest "fw"
223     proto "udp"
224     dest_ports "1194:1197"
225     source_ports "1194:1197"
226   end
227 end
228
229 if node[:roles].include?("gateway")
230   template "/etc/shorewall/masq" do
231     source "shorewall-masq.erb"
232     owner "root"
233     group "root"
234     mode 0644
235     notifies :restart, "service[shorewall]"
236   end
237 else
238   file "/etc/shorewall/masq" do
239     action :delete
240     notifies :restart, "service[shorewall]"
241   end
242 end
243
244 unless node.interfaces(:family => :inet6).empty?
245   package "shorewall6"
246
247   template "/etc/default/shorewall6" do
248     source "shorewall-default.erb"
249     owner "root"
250     group "root"
251     mode 0644
252     notifies :restart, "service[shorewall6]"
253   end
254
255   template "/etc/shorewall6/shorewall6.conf" do
256     source "shorewall6.conf.erb"
257     owner "root"
258     group "root"
259     mode 0644
260     notifies :restart, "service[shorewall6]"
261   end
262
263   template "/etc/shorewall6/zones" do
264     source "shorewall-zones.erb"
265     owner "root"
266     group "root"
267     mode 0644
268     variables :type => "ipv6"
269     notifies :restart, "service[shorewall6]"
270   end
271
272   template "/etc/shorewall6/interfaces" do
273     source "shorewall6-interfaces.erb"
274     owner "root"
275     group "root"
276     mode 0644
277     notifies :restart, "service[shorewall6]"
278   end
279
280   template "/etc/shorewall6/hosts" do
281     source "shorewall6-hosts.erb"
282     owner "root"
283     group "root"
284     mode 0644
285     variables :zones => zones
286     notifies :restart, "service[shorewall6]"
287   end
288
289   template "/etc/shorewall6/policy" do
290     source "shorewall-policy.erb"
291     owner "root"
292     group "root"
293     mode 0644
294     notifies :restart, "service[shorewall6]"
295   end
296
297   template "/etc/shorewall6/rules" do
298     source "shorewall-rules.erb"
299     owner "root"
300     group "root"
301     mode 0644
302     variables :rules => []
303     notifies :restart, "service[shorewall6]"
304   end
305
306   service "shorewall6" do
307     action [:enable, :start]
308     supports :restart => true
309     status_command "shorewall6 status"
310   end
311
312   template "/etc/logrotate.d/shorewall6" do
313     source "logrotate.shorewall.erb"
314     owner "root"
315     group "root"
316     mode 0644
317     variables :name => "shorewall6"
318   end
319
320   firewall_rule "limit-icmp6-echo" do
321     action :accept
322     family :inet6
323     source "net"
324     dest "fw"
325     proto "ipv6-icmp"
326     dest_ports "echo-request"
327     rate_limit "s:1/sec:5"
328   end
329 end
330
331 firewall_rule "accept-http" do
332   action :accept
333   source "net"
334   dest "fw"
335   proto "tcp:syn"
336   dest_ports "http"
337 end
338
339 firewall_rule "accept-https" do
340   action :accept
341   source "net"
342   dest "fw"
343   proto "tcp:syn"
344   dest_ports "https"
345 end