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