导航菜单
登录 注册

在服务器长期运行过程中,经常会遇到来自互联网的自动化扫描。
如果某些地区的访问对业务没有意义,直接在防火墙层进行限制是一种简单有效的安全加固方式。

本文记录一个实际案例:

封锁日本 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.txt

iptables 只需一条规则:

iptables -A INPUT -m set --match-set jp_ip src -p tcp --dport 8081 -j DROP

性能更好。


总结

本文介绍了如何通过 iptables + 国家 IP 段列表

封锁 日本 IP 访问服务器 8081 端口

核心步骤:

  1. 获取国家 IP 列表
  2. 批量生成 iptables 规则
  3. 持久化防火墙配置
  4. 自动更新 IP 段

这种方式适合:

  • 不需要面向全球用户的服务
  • 想减少扫描和无效访问的服务器
  • 运维安全加固

如果规则规模较大,建议使用 ipset 优化性能

网站监控报警,空间爆满!一键查找大文件 + 配置日志轮转解决方法
上一篇