+
+ file "/etc/shorewall/masq" do
+ action :delete
+ end
+
+ file "/etc/shorewall/masq.bak" do
+ action :delete
+ end
+
+ if node[:roles].include?("gateway")
+ template "/etc/shorewall/snat" do
+ source "shorewall-snat.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall]"
+ end
+ else
+ file "/etc/shorewall/snat" do
+ action :delete
+ notifies :restart, "service[shorewall]"
+ end
+ end
+
+ unless node.interfaces(:family => :inet6).empty?
+ package "shorewall6"
+
+ template "/etc/default/shorewall6" do
+ source "shorewall-default.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/shorewall6.conf" do
+ source "shorewall6.conf.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/zones" do
+ source "shorewall-zones.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :type => "ipv6"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/interfaces" do
+ source "shorewall6-interfaces.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/hosts" do
+ source "shorewall6-hosts.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :zones => zones
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/conntrack" do
+ source "shorewall-conntrack.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall6]"
+ only_if { node[:networking][:firewall][:raw] }
+ end
+
+ template "/etc/shorewall6/policy" do
+ source "shorewall-policy.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ template "/etc/shorewall6/rules" do
+ source "shorewall-rules.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :family => "inet6"
+ notifies :restart, "service[shorewall6]"
+ end
+
+ if node[:networking][:firewall][:enabled]
+ service "shorewall6" do
+ action [:enable, :start]
+ supports :restart => true
+ status_command "shorewall6 status"
+ ignore_failure true
+ end
+ else
+ service "shorewall6" do
+ action [:disable, :stop]
+ supports :restart => true
+ status_command "shorewall6 status"
+ ignore_failure true
+ end
+ end
+
+ template "/etc/logrotate.d/shorewall6" do
+ source "logrotate.shorewall.erb"
+ owner "root"
+ group "root"
+ mode "644"
+ variables :name => "shorewall6"
+ end
+
+ firewall_rule "limit-icmp6-echo" do
+ action :accept
+ family :inet6
+ source "net"
+ dest "fw"
+ proto "ipv6-icmp"
+ dest_ports "echo-request"
+ rate_limit "s:1/sec:5"
+ end
+ end
+elsif node[:networking][:firewall][:engine] == "nftables"
+ service "shorewall6" do
+ action :stop
+ end
+
+ package "shorewall6" do
+ action :purge
+ end
+
+ service "shorewall" do
+ action :stop
+ end
+
+ systemd_service "shorewall-docker" do
+ action :delete
+ service "shorewall"
+ dropin "docker"
+ end
+
+ package "shorewall" do
+ action :purge
+ end
+
+ package "nftables"
+
+ interfaces = []
+
+ node.interfaces(:role => :external).each do |interface|
+ interfaces << interface[:interface]
+ end
+
+ interfaces << "eth0" if kitchen? && interfaces.empty?
+
+ template "/etc/nftables.conf" do
+ source "nftables.conf.erb"
+ owner "root"
+ group "root"
+ mode "755"
+ variables :interfaces => interfaces, :hosts => hosts
+ notifies :restart, "service[nftables]"
+ end
+
+ if node[:networking][:firewall][:enabled]
+ service "nftables" do
+ action [:enable, :start]
+ end
+ else
+ service "nftables" do
+ action [:disable, :stop]
+ end
+ end
+end
+
+if node[:networking][:wireguard][:enabled]
+ wireguard_source = if node[:roles].include?("gateway")
+ "net"
+ else
+ "osm"
+ end
+
+ firewall_rule "accept-wireguard" do
+ action :accept
+ source wireguard_source
+ dest "fw"
+ proto "udp"
+ dest_ports "51820"
+ source_ports "51820"
+ end