X-Git-Url: https://git.openstreetmap.org/chef.git/blobdiff_plain/e1b667fd051d79875816508e4af7ecc7a4a5062b..969e1e6d277ef40a24d2cdc33f31f1eaa48752f5:/cookbooks/networking/resources/firewall_rule.rb diff --git a/cookbooks/networking/resources/firewall_rule.rb b/cookbooks/networking/resources/firewall_rule.rb index e72a3df78..6e6c72585 100644 --- a/cookbooks/networking/resources/firewall_rule.rb +++ b/cookbooks/networking/resources/firewall_rule.rb @@ -29,8 +29,8 @@ property :family, :kind_of => [String, Symbol] property :source, :kind_of => String, :required => true property :dest, :kind_of => String, :required => true property :proto, :kind_of => String, :required => true -property :dest_ports, :kind_of => [String, Integer], :default => "-" -property :source_ports, :kind_of => [String, Integer], :default => "-" +property :dest_ports, :kind_of => [String, Integer, Array] +property :source_ports, :kind_of => [String, Integer, Array] property :rate_limit, :kind_of => String, :default => "-" property :connection_limit, :kind_of => [String, Integer], :default => "-" property :helper, :kind_of => String, :default => "-" @@ -51,44 +51,13 @@ end action_class do def add_rule(action) - if node[:networking][:firewall][:engine] == "shorewall" - add_shorewall_rule(action) - elsif node[:networking][:firewall][:engine] == "nftables" - if new_resource.family.nil? - add_nftables_rule(action, "inet") - add_nftables_rule(action, "inet6") - elsif new_resource.family.to_s == "inet" - add_nftables_rule(action, "inet") - elsif new_resource.family.to_s == "inet6" - add_nftables_rule(action, "inet6") - end - end - end - - def add_shorewall_rule(action) - rule = { - :action => action.to_s.upcase, - :source => new_resource.source, - :dest => new_resource.dest, - :proto => new_resource.proto, - :dest_ports => new_resource.dest_ports.to_s, - :source_ports => new_resource.source_ports.to_s, - :rate_limit => new_resource.rate_limit, - :connection_limit => new_resource.connection_limit.to_s, - :helper => new_resource.helper - } - if new_resource.family.nil? - node.default[:networking][:firewall][:inet] << rule - node.default[:networking][:firewall][:inet6] << rule + add_nftables_rule(action, "inet") + add_nftables_rule(action, "inet6") elsif new_resource.family.to_s == "inet" - node.default[:networking][:firewall][:inet] << rule + add_nftables_rule(action, "inet") elsif new_resource.family.to_s == "inet6" - node.default[:networking][:firewall][:inet6] << rule - else - log "Unsupported network family" do - level :error - end + add_nftables_rule(action, "inet6") end end @@ -100,21 +69,18 @@ action_class do when "inet6" then "ip6" end - proto = case new_resource.proto - when "udp" then "udp" - when "tcp", "tcp:syn" then "tcp" - end + proto = new_resource.proto - if new_resource.source_ports != "-" - rule << "#{proto} sport { #{new_resource.source_ports} }" + if new_resource.source_ports + rule << "#{proto} sport { #{nftables_source_ports} }" end - if new_resource.dest_ports != "-" - rule << "#{proto} dport { #{new_resource.dest_ports} }" + if new_resource.dest_ports + rule << "#{proto} dport { #{nftables_dest_ports} }" end if new_resource.source == "osm" - rule << "#{ip} saddr { $#{ip}-osm-addresses }" + rule << "#{ip} saddr @#{ip}-osm-addresses" elsif new_resource.source =~ /^net:(.*)$/ addresses = Regexp.last_match(1).split(",").join(", ") @@ -122,29 +88,31 @@ action_class do end if new_resource.dest == "osm" - rule << "#{ip} daddr $#{ip}-osm-addresses" + rule << "#{ip} daddr @#{ip}-osm-addresses" elsif new_resource.dest =~ /^net:(.*)$/ addresses = Regexp.last_match(1).split(",").join(", ") rule << "#{ip} daddr { #{addresses} }" end - if new_resource.proto == "tcp:syn" - rule << "ct state new" - end + rule << "ct state new" if new_resource.proto == "tcp" if new_resource.connection_limit != "-" - rule << "ct count #{new_resource.connection_limit}" + set = "connlimit-#{new_resource.rule}-#{ip}" + + node.default[:networking][:firewall][:sets] << set + + rule << "add @#{set} { #{ip} saddr ct count #{new_resource.connection_limit} }" end if new_resource.rate_limit =~ %r{^s:(\d+)/sec:(\d+)$} - set = "#{new_resource.rule}-#{ip}" + set = "ratelimit-#{new_resource.rule}-#{ip}" rate = Regexp.last_match(1) burst = Regexp.last_match(2) node.default[:networking][:firewall][:sets] << set - rule << "add @#{set} { #{ip} saddr limit rate #{rate}/second burst #{burst} packets }" + rule << "update @#{set} { #{ip} saddr limit rate #{rate}/second burst #{burst} packets }" end rule << case action @@ -159,4 +127,12 @@ action_class do node.default[:networking][:firewall][:incoming] << rule.join(" ") end end + + def nftables_source_ports + Array(new_resource.source_ports).map(&:to_s).join(",") + end + + def nftables_dest_ports + Array(new_resource.dest_ports).map(&:to_s).join(",") + end end