使用Nftables,网站仅允许Cloudflare IPs访问

通过配置 nftables 拒绝其他 IP 地址访问 HTTP(端口 80)和 HTTPS(端口 443)端口,而允许 Cloudflare 的 IP 地址访问这些端口。

1. 获取 Cloudflare 的 IP 地址范围

如前所述,你可以从 Cloudflare 官方获取 IP 地址范围:

2. 修改 nftables 配置文件

你可以通过以下步骤更新配置,只拒绝非 Cloudflare 的 IP 地址访问 80 和 443 端口。

创建或编辑 nftables 配置文件

  1. 打开 nftables 配置文件:
1
sudo nano /etc/nftables.conf
  1. 将以下配置添加到文件中(注意在原始配置文件的基础上进行修改或替换):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/sbin/nft -f

table inet filter {
chain input {
type filter hook input priority 0; policy accept;

# 允许 Loopback 接口
iif "lo" accept

# 允许 Cloudflare 的 IPv4 地址访问 HTTP 和 HTTPS(替换为 Cloudflare 实际的 IP 地址范围)
ip saddr { 173.245.48.0/20, 103.21.244.0/22, 103.22.200.0/22, 103.31.4.0/22, 141.101.64.0/18, 108.162.192.0/18, 190.93.240.0/20, 188.114.96.0/20, 197.234.240.0/22, 198.41.128.0/17, 162.158.0.0/15, 104.16.0.0/13, 104.24.0.0/14, 172.64.0.0/13, 131.0.72.0/22 } tcp dport { 80, 443 } accept

# 允许 Cloudflare 的 IPv6 地址访问 HTTP 和 HTTPS(替换为 Cloudflare 实际的 IP 地址范围)
ip6 saddr { 2400:cb00::/32, 2606:4700::/32, 2803:f800::/32, 2405:b500::/32, 2405:8100::/32, 2a06:98c0::/29, 2c0f:f248::/32 } tcp dport { 80, 443 } accept

# 拒绝其他 IP 地址访问 80 和 443 端口
ip protocol tcp tcp dport { 80, 443 } drop
}
}

在这个配置中:

  • iif "lo" accept 允许本地回环接口 (localhost) 访问。
  • ip saddrip6 saddr 允许 Cloudflare 的 IP 地址访问 HTTP 和 HTTPS(根据你从 Cloudflare 获取的最新 IP 地址)。
  • 最后一条规则 ip protocol tcp tcp dport { 80, 443 } drop 会拒绝所有其他来源的 IP 访问 80 和 443 端口。

3. 应用配置

保存文件后,运行以下命令加载新的 nftables 配置:

1
sudo nft -f /etc/nftables.conf

或者重启 nftables 服务:

1
sudo systemctl restart nftables

4. 验证规则

你可以使用以下命令查看当前的 nftables 配置,确保规则已经正确加载:

1
sudo nft list ruleset

总结

这样,只有 Cloudflare 的 IP 地址可以访问 HTTP 和 HTTPS 服务,其他所有 IP 地址都将被拒绝访问这两个端口。注意定期更新 Cloudflare 的 IP 地址范围,以保持防火墙配置的有效性。