Skip to content

Commit ab1c3bd

Browse files
committed
mimas: block alibaba and tencent
These networks keep scraping hydra.nixos.org with a high request rate across a wide range of IP addresses with bogus user-agents. They did it, they made me develop a tool to lookup prefixes for an AS and block them from accessing tcp/443 using an nftable set match.
1 parent 6d9c573 commit ab1c3bd

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

build/mimas/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
../hydra.nix
55
../hydra-proxy.nix
66
./boot.nix
7+
./firewall.nix
78
./network.nix
89
];
910

build/mimas/firewall.nix

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
{
2+
pkgs,
3+
lib,
4+
inputs,
5+
...
6+
}:
7+
8+
let
9+
blockedAutNums = [
10+
45102 # ALIBABA-CN-NET
11+
132203 # TENCENT-NET-AP-CN
12+
];
13+
in
14+
15+
{
16+
networking.nftables = {
17+
tables."abuse" = {
18+
family = "inet";
19+
content = ''
20+
set ipv4blocks {
21+
type ipv4_addr;
22+
flags interval;
23+
auto-merge;
24+
}
25+
set ipv6blocks {
26+
type ipv6_addr;
27+
auto-merge;
28+
flags interval;
29+
}
30+
chain input-abuse {
31+
type filter hook input priority filter - 5;
32+
33+
ip saddr @ipv4blocks tcp dport 443 counter drop;
34+
ip6 saddr @ipv6blocks tcp dport 443 counter drop;
35+
}
36+
'';
37+
};
38+
};
39+
40+
systemd.services.nft-prefix-import = {
41+
wants = [ "network-online.target" ];
42+
after = [ "network-online.target" ];
43+
wantedBy = [ "multi-user.target" ];
44+
path = with pkgs; [ nftables ];
45+
environment.USER_AGENT = "NixOS.org Infrastructure - [email protected]";
46+
serviceConfig = {
47+
Type = "oneshot";
48+
AmbientCapabilities = [ "CAP_NET_ADMIN" ];
49+
DynamicUser = true;
50+
User = "nft-asblock";
51+
Group = "nft-asblock";
52+
ExecStart = toString (
53+
[
54+
(lib.getExe inputs.nft-prefix-import.packages.${pkgs.hostPlatform.system}.default)
55+
"--table"
56+
"abuse"
57+
"--ipv4set"
58+
"ipv4blocks"
59+
"--ipv6set"
60+
"ipv6blocks"
61+
]
62+
++ blockedAutNums
63+
);
64+
RestrictAddressFamilies = [
65+
"AF_NETLINK"
66+
"AF_INET"
67+
"AF_INET6"
68+
];
69+
StateDirectory = "nft-prefix-import";
70+
WorkingDirectory = "/var/lib/nft-prefix-import";
71+
};
72+
};
73+
74+
systemd.timers.nft-prefix-import = {
75+
wantedBy = [ "timers.target" ];
76+
timerConfig = {
77+
OnCalendar = "0/6:00";
78+
RandomizedDelaySec = 3600;
79+
};
80+
};
81+
}

flake.lock

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@
7070
inputs.nixpkgs.follows = "nixpkgs";
7171
};
7272

73+
nft-prefix-import = {
74+
url = "github:mweinelt/nft-prefix-import";
75+
inputs.nixpkgs.follows = "nixpkgs-unstable";
76+
};
77+
7378
srvos = {
7479
url = "github:numtide/srvos";
7580
inputs.nixpkgs.follows = "nixpkgs";

0 commit comments

Comments
 (0)