debian12拒绝海外ip连接
确保 nftables 已安装: Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装:
sudo apt update
sudo apt install nftables
启用并启动 nftables 服务
sudo systemctl enable nftables
sudo systemctl start nftables
下载maxmind数据库
将文件解压后放在任意目录
# 备份 nftables.conf
sudo cp /etc/nftables.conf /etc/nftables.conf.bak# 清空所有规则
sudo nft flush ruleset# 停止服务
sudo systemctl stop nftables删除原配置文件
sudo rm -rf /etc/nftables.conf修改配置文件
sudo vim /etc/nftables.conf
修改后配置文件如下
#!/usr/sbin/nft -fflush rulesettable inet filter {# 定义中国大陆 IPv4 地址集合set cn_ips {type ipv4_addrflags interval#CN_IPV4_ELEMENTS#}# 定义中国大陆 IPv6 地址集合set cn_ips6 {type ipv6_addrflags interval#CN_IPV6_ELEMENTS#}# 定义局域网 IPv4 地址集合set lan_ips {type ipv4_addrflags intervalelements = { 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 } # 替换为你的局域网范围}# 定义局域网 IPv6 地址集合set lan_ips6 {type ipv6_addrflags intervalelements = { fc00::/7 } # 替换为你的局域网 IPv6 范围}chain input {type filter hook input priority 0; policy drop;# 允许本地回环接口iifname "lo" accept# 允许已建立和相关的连接ct state established,related accept# 允许局域网 IPv4 访问ip saddr @lan_ips accept# 允许局域网 IPv6 访问ip6 saddr @lan_ips6 accept# 允许中国大陆 IPv4 地址访问ip saddr @cn_ips accept# 允许中国大陆 IPv6 地址访问ip6 saddr @cn_ips6 accept# 记录被拒绝的连接(可选)log prefix "[nftables] Blocked: " flags all counter drop# 拒绝所有其他连接counter drop}chain output {type filter hook output priority 0; policy accept;}chain forward {type filter hook forward priority 0; policy drop;}
}
创建替换ip的脚本
sudo vim update_nftables.sh
脚本内容
#!/bin/bash# 提取中国大陆 IPv4 地址
grep '1814991' GeoLite2-Country-Blocks-IPv4.csv | awk -F',' '{print $1}' > cn_ipv4.txt# 提取中国大陆 IPv6 地址
grep '1814991' GeoLite2-Country-Blocks-IPv6.csv | awk -F',' '{print $1}' > cn_ipv6.txt# 转换为 nftables 集合格式(IPv4)
echo "elements = {" > cn_ipv4_nft.txt
awk '{print $1","}' cn_ipv4.txt >> cn_ipv4_nft.txt
echo "}" >> cn_ipv4_nft.txt# 转换为 nftables 集合格式(IPv6)
echo "elements = {" > cn_ipv6_nft.txt
awk '{print $1","}' cn_ipv6.txt >> cn_ipv6_nft.txt
echo "}" >> cn_ipv6_nft.txt# 使用 sed 替换 IPv4 占位符
sudo sed -i '/#CN_IPV4_ELEMENTS#/r cn_ipv4_nft.txt' /etc/nftables.conf
sudo sed -i 's/#CN_IPV4_ELEMENTS#//' /etc/nftables.conf# 使用 sed 替换 IPv6 占位符
sudo sed -i '/#CN_IPV6_ELEMENTS#/r cn_ipv6_nft.txt' /etc/nftables.conf
sudo sed -i 's/#CN_IPV6_ELEMENTS#//' /etc/nftables.conf# 应用规则
sudo nft -f /etc/nftables.conf
# 清理文件
sudo rm cn_ipv4.txt cn_ipv4_nft.txt cn_ipv6.txt cn_ipv6_nft.txt
给权限
sudo chmod +x update_nftables.sh
执行脚本
sudo ./update_nftables.sh
检查规则
sudo nft list ruleset
查看被拒绝的信息
查看系统日志文件
sudo grep "\[nftables\] Blocked:" /var/log/syslog
示例输出:
Jun 8 22:30:45 hostname kernel: [nftables] Blocked: IN=eth0 OUT= MAC=... SRC=203.0.113.1 DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=12345 PROTO=TCP SPT=54321 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0
解释:
- SRC=203.0.113.1:源 IP(被拒绝的外部 IP)。
- DST=192.168.1.100:目标 IP(你的服务器)。
- PROTO=TCP:协议类型。
- SPT=54321 DPT=22:源端口和目标端口(例如,尝试访问 SSH 的 22 端口)。
- IN=eth0:入站接口。
实时监控日志: 使用 tail 实时查看新记录的被拒绝连接:
sudo tail -f /var/log/syslog | grep "\[nftables\] Blocked:"
过滤特定信息: 如果日志量大,可以提取特定字段(如源 IP)
sudo grep "\[nftables\] Blocked:" /var/log/syslog | awk '{print $8}' | sort | uniq
这会提取被拒绝的源 IP(SRC=…)并去重。
查看 nftables 计数器
sudo nft list ruleset
示例输出:
table inet filter {chain input {type filter hook input priority 0; policy drop;iifname "lo" acceptct state established,related acceptip saddr @lan_ips acceptip6 saddr @lan_ips6 acceptip saddr @cn_ips acceptip6 saddr @cn_ips6 acceptlog prefix "[nftables] Blocked: " flags all counter packets 123 bytes 4560 dropcounter packets 123 bytes 4560 drop}
...
}
- counter packets 123 bytes 4560 drop:表示有 123 个数据包(共 4560 字节)被拒绝。
- packets:被拒绝的数据包数量。
- bytes:被拒绝的数据总字节数。