1
0

firewall: show how to ratelimit icmp6 to 5% of available bandwidth

it's a little klunky as yet, requires setting properties.bandwidth on
the interface service
This commit is contained in:
Daniel Barlow 2025-03-25 23:53:02 +00:00
parent b1bf13bb01
commit 1a6160bcab
3 changed files with 33 additions and 2 deletions

View File

@ -44,10 +44,37 @@ let
end
}}
'';
};
};
rateHook =
let rules =
map
(x: ''
{{;
local s = "${x}";
local n = output(s, "ifname");
local bw = output(s, "bandwidth");
if n and bw then
return "meta l4proto icmpv6 iifname ".. n .. " limit rate over " .. (math.floor (tonumber(bw) / 20)) .. " bytes/second drop"
else
return "# " .. (n or "not n") .. " " .. (bw or "not bw")
end
}}
'')
(concatLists (builtins.attrValues zones));
in {
type = "filter"; family = "ip6";
hook = "input"; priority = "-1"; policy = "accept";
inherit rules;
};
sets = (mapAttrs' (n: _: mkSet "ip" n) zones) //
(mapAttrs' (n: _: mkSet "ip6" n) zones);
allRules = lib.recursiveUpdate extraRules (lib.recursiveUpdate sets rules);
allRules =
{ icmp6-ratehook = rateHook; } //
(lib.recursiveUpdate
extraRules
(lib.recursiveUpdate sets rules));
script = firewallgen "firewall1.nft" allRules;
watchArg = z: intfs: map (i: "${z}:${i}") intfs;
name = "firewall";

View File

@ -115,6 +115,7 @@ let
${command}
'';
notification-fd = 10;
# properties.bandwidth = 3 * 1000 * 1000;
timeout-up =
if lcpEcho.failure != null then (10 + lcpEcho.failure * lcpEcho.interval) * 1000 else 60 * 1000;
inherit dependencies;

View File

@ -25,7 +25,10 @@
myenv {
: string
: table
: math
: ipairs
: tonumber
:output
(fn [service-path path default]
(let [s (assert (svc.open service-path))]