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