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