ufw, nginx 屏蔽策略
Ubuntu 查看端口
# 查看实例上真正监听的端口
sudo ss -ltnp | grep LISTEN
# 或传统命令
sudo netstat -ltnp
ufw
基本命令:
sudo ufw status # 查看状态
sudo ufw status verbose # 查看状态
sudo ufw enable # 启用防火墙(先允许 SSH!)
sudo ufw default deny incoming # 默认拒绝所有传入
sudo ufw default allow outgoing # 默认允许外出
sudo ufw allow 22/tcp # 允许 SSH
sudo ufw allow 80/tcp # 允许 HTTP
sudo ufw allow 443/tcp # 允许 HTTPS
sudo ufw allow from 192.168.1.100 to any port 22 # 只允许特定 IP 访问 SSH
sudo ufw delete allow 80 # 删除规则
下面这条命令,它专门用来查看已配置的规则(即使防火墙未启用也有效):
sudo ufw show added
如果还没有允许 SSH,请立即执行下面命令(强烈推荐用 OpenSSH 这种方式):
# 推荐方式(自动适配 SSH 端口,即使你改过端口也行)
sudo ufw allow OpenSSH
# 或者明确指定端口
sudo ufw allow 22/tcp
添加规则后最好用 sudo ufw reload 测试一下。
Nginx 屏蔽策略
在 Ubuntu 系统中,通过 Nginx 建立屏蔽机制可以从基础 IP 封禁、区域/国家封禁以及访问频率限制三个维度来实现。
以下是详细的操作步骤:
一、 封禁特定 IP 或 IP 段
这是最直接的方法,使用 Nginx 自带的 ngx_http_access_module 模块。
1. 直接在配置文件中封禁
编辑你的网站配置文件(如 /etc/nginx/sites-available/default):
server {
listen 80;
server_name example.com;
# 封禁单个 IP
deny 123.123.123.123;
# 封禁整个 IP 段
deny 192.168.1.0/24;
# 允许特定 IP,其余全部封禁
allow 1.2.3.4;
deny all;
location / {
try_files $uri $uri/ =404;
}
}
2. 使用独立文件管理黑名单(推荐)
如果黑名单很长,建议新建一个文件 /etc/nginx/blockips.conf:
deny 1.1.1.1;
deny 2.2.2.2;
然后在主配置文件 nginx.conf 的 http 段落中引入:
http {
include /etc/nginx/blockips.conf;
...
}
最后重启 Nginx:sudo systemctl restart nginx
二、 限制 IP 访问频率(防 CC 攻击)
使用 ngx_http_limit_req_module 模块限制同一 IP 在单位时间内的请求数。
1. 定义限制规则
在 /etc/nginx/nginx.conf 的 http 块中定义:
http {
# 定义一个名为 "mylimit" 的共享内存区域,大小 10MB,频率为每秒 5 个请求
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
}
2. 应用限制规则
在 server 或 location 块中应用:
server {
location / {
# 使用定义的 mylimit 区域
# burst=10 表示超过频率后允许缓冲 10 个请求
# nodelay 表示不延迟,超过缓冲直接返回 503
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://backend;
}
}
三、 根据国家/地区封禁 IP (GeoIP2)
由于经典的 GeoIP 模块已过时,现在通用的是 MaxMind GeoIP2。
1. 安装模块和依赖
在 Ubuntu 上安装 GeoIP2 动态模块:
sudo apt update
sudo apt install libnginx-mod-http-geoip2
2. 下载数据库
你需要从 MaxMind 官网 注册免费账号并下载 GeoLite2-Country.mmdb,放到 /usr/share/GeoIP/ 目录下。
3. 配置 Nginx 识别国家
在 /etc/nginx/nginx.conf 的 http 块配置:
http {
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
auto_reload 5m;
$geoip2_data_country_code country iso_code;
}
# 使用 map 定义黑名单
map $geoip2_data_country_code $allowed_country {
default yes;
CN no; # 封禁中国
US no; # 封禁美国
}
}
4. 在 Server 中拦截
server {
if ($allowed_country = no) {
return 403; # 返回 403 禁止访问
}
}
四、 进阶:自动封禁(Fail2Ban)
如果想让系统自动识别恶意刷接口的 IP 并封禁,推荐使用 Fail2Ban。它会扫描 Nginx 日志,发现异常后通过 iptables 或 ufw 在防火墙层面封禁,效率比 Nginx 更高。