在服务器长期运行过程中,经常会遇到来自互联网的自动化扫描。
如果某些地区的访问对业务没有意义,直接在防火墙层进行限制是一种简单有效的安全加固方式。
本文记录一个实际案例:
封锁日本 IP 访问服务器 8081 端口。
实现方案基于:
- iptables
- 国家 IP 段列表
- 自动更新脚本
适用于:
- Linux 服务器安全加固
- 限制特定国家访问
- 减少扫描与恶意请求
系统环境:
Ubuntu 22.04
iptables一、问题背景
最近在服务器访问日志中发现 8081 端口持续收到扫描请求。
通过分析来源 IP,发现请求大量来自 日本 IP 段。
而该服务端口不对日本用户提供服务。
因此这些访问基本可以判断为:
- 自动化扫描
- 服务探测
- 批量脚本请求
虽然暂未造成实际影响,但持续扫描会:
- 增加日志噪音
- 占用网络资源
- 提高潜在安全风险
因此决定在 防火墙层直接限制日本 IP 访问该端口。
二、日志分析示例
首先通过访问日志统计扫描来源。
示例日志:
203.0.113.10 - - [12/Mar/2026:14:02:11 +0000] "GET / HTTP/1.1" 404
133.242.121.44 - - [12/Mar/2026:14:02:12 +0000] "GET /admin HTTP/1.1" 404
150.95.172.83 - - [12/Mar/2026:14:02:13 +0000] "GET /api/test HTTP/1.1" 404
153.127.62.89 - - [12/Mar/2026:14:02:14 +0000] "GET /login HTTP/1.1" 404统计访问 IP:
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head示例输出:
120 133.x.y.z
98 150.o.p.q
87 153.r.s.t查询 IP ASN 信息:
whois 33.x.y.z结果:
country: JP多个高频访问 IP 均来自 日本网络段。
因此可以针对 JP IP 段进行统一封锁。
三、方案选择
常见国家 IP 限制方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| iptables + IP段 | 实现简单 | 规则数量多 |
| iptables + GeoIP | 规则少 | 需安装模块 |
| Nginx GeoIP | 配置方便 | 仅限 Web |
| 云安全组 | 操作简单 | 灵活性低 |
本方案选择:
iptables + 国家 IP 段列表
优点:
- 无额外依赖
- 精确控制端口
- 适用于所有 TCP 服务
四、准备环境
创建工作目录:
mkdir -p /etc/firewall
cd /etc/firewall检查 iptables:
which iptables五、获取日本 IP 段
使用 GitHub 维护的 IP 列表:
wget -q https://raw.githubusercontent.com/ipverse/rir-ip/master/country/jp/net.txt \
-O /etc/firewall/jp_ips.txt查看数量:
wc -l /etc/firewall/jp_ips.txt示例输出:
2800 /etc/firewall/jp_ips.txt大约 2500-3000 个 IP 段。
六、创建封锁脚本
创建脚本:
nano /etc/firewall/block_jp_8081.sh内容:
#!/bin/bash
JP_IP_FILE="/etc/firewall/jp_ips.txt"
# 删除旧规则
iptables -S INPUT | grep "dpt:8081" | while read rule; do
iptables -D INPUT ${rule#*-A } 2>/dev/null
done
# 添加封锁规则
while read -r ip; do
[ -z "$ip" ] && continue
iptables -A INPUT -s "$ip" -p tcp --dport 8081 -j DROP
done < "$JP_IP_FILE"
echo "Rules applied: $(wc -l < $JP_IP_FILE) IP ranges blocked"添加执行权限:
chmod +x /etc/firewall/block_jp_8081.sh七、应用封锁规则
执行脚本:
/etc/firewall/block_jp_8081.sh示例输出:
Rules applied: 2805 IP ranges blocked八、验证防火墙规则
查看规则数量:
iptables -L INPUT -n | grep 'dpt:8081' | wc -l查看规则:
iptables -L INPUT -n -v | grep 'dpt:8081' | head示例:
DROP tcp -- 1.0.1.0/24 0.0.0.0/0 tcp dpt:8081
DROP tcp -- 1.0.2.0/23 0.0.0.0/0 tcp dpt:8081九、规则持久化
Ubuntu:
apt install netfilter-persistent
netfilter-persistent save重启后规则仍然生效。
十、自动更新 IP 列表
国家 IP 段会定期变化,建议定期更新。
创建更新脚本:
nano /etc/firewall/update_jp_ips.sh脚本:
#!/bin/bash
LOG_FILE="/var/log/jp_ip_update.log"
JP_IP_FILE="/etc/firewall/jp_ips.txt"
echo "===== $(date) =====" >> $LOG_FILE
wget -q https://raw.githubusercontent.com/ipverse/rir-ip/master/country/jp/net.txt \
-O $JP_IP_FILE
/etc/firewall/block_jp_8081.sh >> $LOG_FILE 2>&1
netfilter-persistent save >> $LOG_FILE 2>&1添加执行权限:
chmod +x /etc/firewall/update_jp_ips.sh十一、配置自动更新任务
crontab -e添加:
0 3 * * 0 /etc/firewall/update_jp_ips.sh >/dev/null 2>&1每周更新一次 IP 段。
十二、性能优化建议
如果规则数量较多(超过 10000),建议使用 ipset。
示例:
ipset create jp_ip hash:net导入 IP:
while read ip; do
ipset add jp_ip $ip
done < jp_ips.txtiptables 只需一条规则:
iptables -A INPUT -m set --match-set jp_ip src -p tcp --dport 8081 -j DROP性能更好。
总结
本文介绍了如何通过 iptables + 国家 IP 段列表:
封锁 日本 IP 访问服务器 8081 端口。
核心步骤:
- 获取国家 IP 列表
- 批量生成 iptables 规则
- 持久化防火墙配置
- 自动更新 IP 段
这种方式适合:
- 不需要面向全球用户的服务
- 想减少扫描和无效访问的服务器
- 运维安全加固
如果规则规模较大,建议使用 ipset 优化性能。
精选留言