dotfiles/modules/nixos/services/honeypot.nix

82 lines
2.5 KiB
Nix
Raw Permalink Normal View History

2024-01-10 04:11:11 +00:00
# This is a tool for blocking IPs of anyone who attempts to scan all of my
# ports.
2022-10-15 12:16:05 +00:00
# Currently has some issues that don't make this viable.
2024-04-20 13:42:06 +00:00
{
config,
lib,
pkgs,
...
}:
2024-01-10 04:11:11 +00:00
2022-10-15 12:16:05 +00:00
# Taken from:
# https://dataswamp.org/~solene/2022-09-29-iblock-implemented-in-nixos.html
# You will need to flush all rules when removing:
# https://serverfault.com/questions/200635/best-way-to-clear-all-iptables-rules
let
2024-04-20 13:42:06 +00:00
portsToBlock = [
25545
25565
25570
];
portsString = builtins.concatStringsSep "," (builtins.map builtins.toString portsToBlock);
2022-10-15 12:16:05 +00:00
# Block IPs for 20 days
expire = 60 * 60 * 24 * 20;
rules = table: [
"INPUT -i eth0 -p tcp -m multiport --dports ${portsString} -m state --state NEW -m recent --set"
"INPUT -i eth0 -p tcp -m multiport --dports ${portsString} -m state --state NEW -m recent --update --seconds 10 --hitcount 1 -j SET --add-set ${table} src"
"INPUT -i eth0 -p tcp -m set --match-set ${table} src -j nixos-fw-refuse"
"INPUT -i eth0 -p udp -m set --match-set ${table} src -j nixos-fw-refuse"
];
2024-04-20 13:42:06 +00:00
create-rules = lib.concatStringsSep "\n" (
builtins.map (rule: "iptables -C " + rule + " || iptables -A " + rule) (rules "blocked")
++ builtins.map (rule: "ip6tables -C " + rule + " || ip6tables -A " + rule) (rules "blocked6")
);
2022-10-15 12:16:05 +00:00
2024-04-20 13:42:06 +00:00
delete-rules = lib.concatStringsSep "\n" (
builtins.map (rule: "iptables -C " + rule + " && iptables -D " + rule) (rules "blocked")
++ builtins.map (rule: "ip6tables -C " + rule + " && ip6tables -D " + rule) (rules "blocked6")
);
in
{
2022-10-15 12:16:05 +00:00
2022-12-21 21:18:03 +00:00
options.honeypot.enable = lib.mkEnableOption "Honeypot fail2ban system.";
2022-12-21 21:38:34 +00:00
config.networking.firewall = lib.mkIf config.honeypot.enable {
2022-10-15 12:16:05 +00:00
extraPackages = [ pkgs.ipset ];
# allowedTCPPorts = portsToBlock;
# Restore ban list when starting up
extraCommands = ''
if test -f /var/lib/ipset.conf
then
ipset restore -! < /var/lib/ipset.conf
else
2024-04-20 13:42:06 +00:00
ipset -exist create blocked hash:ip ${if expire > 0 then "timeout ${toString expire}" else ""}
2022-10-15 12:16:05 +00:00
ipset -exist create blocked6 hash:ip family inet6 ${
if expire > 0 then "timeout ${toString expire}" else ""
}
fi
${create-rules}
'';
# Save list when shutting down
extraStopCommands = ''
2024-04-20 13:42:06 +00:00
ipset -exist create blocked hash:ip ${if expire > 0 then "timeout ${toString expire}" else ""}
2022-10-15 12:16:05 +00:00
ipset -exist create blocked6 hash:ip family inet6 ${
if expire > 0 then "timeout ${toString expire}" else ""
}
ipset save > /var/lib/ipset.conf
${delete-rules}
'';
};
}