00-服务器运维手册(汇总版)
最后更新时间:2026年8月6日
汇总清单手册地址:
- fx67llLinux\server-note\operation-note\00-服务器运维手册(汇总版).md
- fx67llLinux\server-note\operation-note\01-应急重启检查清单.md
- fx67llLinux\server-note\operation-note\02-服务器迁移检查清单.md
- fx67llLinux\server-note\operation-note\03-安全防护检查清单.md
个人服务器运维全记录,涵盖应急重启、服务迁移、安全防护三大场景
使用方式:左侧目录跳转,或按场景快速定位
📍 快速导航
| 场景 | 跳转 | 触发频率 |
|---|---|---|
| 🔥 服务器炸了 / 重启后恢复 | → 第一篇:应急重启 | 偶尔 |
| 🚚 换服务器 / 迁移数据 | → 第二篇:服务迁移 | 每年 1~2 次(薅新用户优惠) |
| 🛡️ 被攻击了 / 安全加固 | → 第三篇:安全防护 | 新服务器必做一次 |
第一篇:应急重启
适用场景:服务器宕机、重启后、服务异常挂掉,需要按顺序恢复
核心原则:先网络(防火墙),再入口(Nginx),再数据(数据库),最后应用
1.1 重启顺序总览
防火墙 → Nginx → Tomcat(Jenkins) → Node → Halo
⚠️ 注意:MySQL、Redis、MongoDB 默认关闭,按需开启
1.2 核心服务逐项重启
① 防火墙
service iptables start
验证:
service iptables status
💡 避坑:防火墙没开的话,外部所有端口都访问不了,但本地可以。先确认防火墙状态再排查其他。
② Nginx
nginx
验证:浏览器访问首页,或
curl localhost
💡 避坑:如果 nginx 启动失败,大概率是配置文件语法错,用
nginx -t检查。
③ Tomcat(跑 Jenkins)
cd /usr/soft/install/apache-tomcat-9.0.7/bin
./startup.sh
验证:访问 IP:8080 能看到 Tomcat 主页
💡 避坑:启动前确保 8080 端口没被占用,用
netstat -tlnp | grep 8080检查。
④ Node 服务
cd /usr/node/JDSMS
pm2 start app.js --name="fx67llNode"
验证:
pm2 list
💡 避坑:
- 确保
.env环境变量文件存在且配置正确- 如果迁移了服务器,记得检查 MongoDB 连接地址是否指向新服务器
- 更新环境变量后用
pm2 restart <应用名> --update-env重启
⑤ Halo 博客
sudo systemctl start halo
验证:
sudo systemctl status halo
其他命令:
sudo systemctl stop halo # 停止
sudo systemctl restart halo # 重启
sudo systemctl enable halo # 开机自启
配置文件位置:~/.halo/application.yaml
💡 避坑:
- H2 数据库控制台平时关闭(
enabled: false),需要调试时再开web-allow-others也保持false,避免外部访问数据库- 缓存模式选
memory即可,小站够用
1.3 非常态服务(已关闭,按需开启)
这些服务都已在前台应用集合服务器上关闭,一般不需要开启,特殊情况才用
MySQL 5.7
| 操作 | 命令 |
|---|---|
| 状态 | service mysql status |
| 开启 | service mysql start |
| 关闭 | service mysql stop |
- 端口:3306
- 防火墙规则:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
MySQL 8.0
| 操作 | 命令 |
|---|---|
| 状态 | service mysql80 status |
| 开启 | service mysql80 start |
| 关闭 | service mysql80 stop |
- 端口:3307
Redis 6.2
开启:
cd /usr/soft/install/mongodb-linux-x86_64-rhel70-4.4.4/bin
redis-server redis.conf
关闭:
redis-cli -h 127.0.0.1 -p 6379 -a 你的redis密码
# 进入后执行
shutdown
- 端口:6379
- 显示
not connected即为关闭成功
MongoDB
开启:
cd /usr/soft/install/mongodb-linux-x86_64-rhel70-4.4.4/bin
./mongod -f mongodb.conf
- 端口:27017
⚠️ 警告:MongoDB 炸了貌似只能重装,目前还不会运维。没事别乱动。
1.4 防火墙端口管理
开放新端口流程
# 1. 进入配置目录
cd /etc/sysconfig
# 2. 确认 iptables 文件存在
ls iptables
# 3. 编辑配置
vim iptables
# 按下 i 进入编辑模式,在已有端口规则下面添加:
# -A INPUT -p tcp -m state --state NEW -m tcp --dport 端口号 -j ACCEPT
# 按 Esc,输入 :wq 保存退出
# 4. 重启生效
service iptables restart
💡 避坑:
- 每开一个应用端口,一定要同步开防火墙端口,否则外部访问不了
- Ubuntu 也可以用
sudo ufw allow 端口号,但 iptables 方式更通用- 宝塔面板还有一层安全组,两边都要检查
1.5 重要目录速查
| 路径 | 用途 |
|---|---|
/usr/soft |
各类软件安装包和解压包 |
/usr/share/nginx |
Nginx 代理的静态文件地址 |
/etc/nginx |
Nginx 配置文件目录 |
/etc/ssl |
SSL 证书目录 |
/etc/sysconfig/iptables |
防火墙配置文件 |
/usr/node |
Node 应用目录 |
~/.halo |
Halo 工作目录 |
/root/.jenkins |
Jenkins 数据目录 |
1.6 重启后验证清单
全部重启完后,逐项确认:
-
service iptables status→ 防火墙运行中 - 浏览器访问首页 → Nginx 正常
-
pm2 list→ Node 服务在线 -
IP:8080→ Tomcat / Jenkins 正常 -
IP:8090→ Halo 博客正常 -
fail2ban-client status→ 防爆破正常
第二篇:服务迁移
适用场景:旧服务器优惠到期,换新服务器薅羊毛
迁移原则:先基础环境,再数据,再应用,最后验证
预计耗时:2~4 小时(视数据量而定)
2.1 迁移前准备
- 新服务器已购买并能 SSH 登录
- 旧服务器数据已备份(宝塔一键备份 / 手动备份)
- 域名解析准备好(迁移完再切)
- CDN 服务暂停(如果有)
💡 避坑:
- 旧服务器先不要停,新的完全跑通再切流量、再销毁旧的
- 有 CDN 的先停 CDN,否则可能缓存旧数据影响验证
2.2 基础环境搭建
① 安装宝塔面板
# 新服务器上安装宝塔
# 官网获取最新安装命令,或输入 bt 命令管理
bt
② 防火墙端口开放
服务器安全组 + 宝塔安全组,两边都要开!
| 端口 | 用途 |
|---|---|
| 8888 | 宝塔初始端口 |
| 3306 | MySQL |
| 6379 | Redis |
| 9897 | 若依服务 |
| 9797 | 超神服务 |
| 8090 | Halo |
| 8080 | Tomcat / Jenkins |
| 80 / 443 | HTTP / HTTPS |
💡 避坑:直接参考旧服务器依次抄一份到新服务器,别漏了。
2.3 数据库迁移
MySQL 迁移
# 1. 宝塔安装 MySQL(选对应版本)
# 2. 修改 root 密码
# 3. 本地连接验证
mysql -u root -p
# 4. 赋予远程连接权限(用 DBeaver 等工具连接时需要)
GRANT ALL PRIVILEGES ON `数据库名`.* TO '用户名'@'远程IP' IDENTIFIED BY '密码' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 5. 用宝塔备份功能迁移数据(最简单)
# 旧服务器备份 → 下载备份文件 → 新服务器上传恢复
💡 避坑:
- 远程连接前一定要先授权,否则连不上
- 宝塔备份恢复最省心,不建议手动导 SQL
Redis 迁移
# ===== 旧服务器上 =====
# 1. 宝塔安装 Redis
# 2. 修改配置:
# - requirepass 设置密码
# - 注释 bind 127.0.0.1 或改为 bind 0.0.0.0
# - protected-mode 改为 no
# 3. 本地 + 远程工具连接验证
redis-cli
# RedisDesktopManagement 也测一下
# 4. 创建数据快照(BGSAVE 是异步的,不阻塞)
redis-cli
# 输入密码认证后
BGSAVE
# 5. 找到 dump.rdb 文件位置(redis.conf 中 dir 选项指定)
# 6. 复制到新服务器
scp /path/to/redis/dump.rdb user@newserver:/path/to/redis/
# ===== 新服务器上 =====
# 7. 停止 Redis 服务
# 8. 把 dump.rdb 放到 Redis 工作目录
# 9. 启动 Redis
redis-server --port 6379 --bind 0.0.0.0 --dir /path/to/redis/ --dbfilename dump.rdb
💡 避坑:
BGSAVE是后台保存,不阻塞;SAVE是同步保存,会阻塞,生产环境用 BGSAVE- 宝塔 Redis 默认关闭日志,需要的话面板里开启
- 一定要先停新服务器的 Redis 再覆盖 dump.rdb
MongoDB 迁移
# 1. 宝塔安装 MongoDB
# 2. 修改 Node 应用的 .env 文件中 MongoDB 连接地址
# 3. 用 pm2 重启并更新环境变量
pm2 restart <应用名称> --update-env
⚠️ 注意:MongoDB 迁移目前记录较少,主要靠改连接地址 + 数据同步。数据量大的话建议用 mongodump/mongorestore。
2.4 后端服务迁移
Java / 若依后台
# 1. 宝塔安装 JDK 1.8 + Tomcat 9
# 2. 上传服务包至 /home/ruoyi
# 3. 宝塔界面配置服务并启动
# 基础启动命令
/usr/local/btjdk/jdk8/bin/java -jar -Xmx1024M -Xms256M /home/ruoyi/ruoyi-admin.jar --server.port=9897
# 超神服务(内存不够时减配启动)
/usr/bin/java \
-Xms128M -Xmx512M \
-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=128M \
-XX:MaxDirectMemorySize=128M \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-Dlogging.pattern.console="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" \
-Dlogging.file.max-size=100MB -Dlogging.file.max-history=7 \
-jar /home/ruoyi-chaoshen/ruoyi-admin.jar \
--server.port=9797 \
--spring.boot.admin.enabled=false \
--management.endpoints.web.exposure.include= \
--spring.cache.type=none \
--ruoyi.log.desensitize=false
💡 避坑:
- 若依默认端口 9897,超神服务端口 9797,别搞混
- 内存不够就用减配版启动命令,把堆内存、元空间都调小
- 超神服务关闭了 Spring Boot Admin、监控端点、缓存,进一步省内存
Node 服务
# 1. 从旧服务器 /usr/node 目录拷贝应用到新服务器同目录
# ⚠️ 注意:不要拷贝 node_modules 目录!
# 2. 安装 Node 和 PM2
# node@14.16.0
# pm2@4.5.5
# 3. 安装依赖并启动(以 NPPBE 为例,其他 Node 应用同理)
cd /usr/node/NPPBE
npm install
cd bin
pm2 start www --name="NPPBE"
# 4. 确认 .env 环境变量文件存在且配置正确
💡 避坑:
- 一定不要拷贝
node_modules,体积大且可能有平台兼容性问题.env文件很重要,别漏了- 迁移后检查 MongoDB 等外部连接地址是否指向新服务器
Jenkins(Tomcat 部署)
# ===== 旧服务器上备份 =====
# 1. 下载 Tomcat 安装包(如果还留着就不用)
# 位置:/usr/soft/sort
# 2. 备份 Jenkins 数据目录(最重要!)
# /root/.jenkins 下的 jobs / plugins / secrets / users / config.xml
# 这些目录和文件都要下载
# 3. 备份整个 Tomcat 目录
# /usr/soft/install/apache-tomcat-9.0.7 全部下载
# ===== 新服务器上部署 =====
# 4. 上传 Tomcat 安装包到 /usr/soft/sort
# 5. 解压
tar -zxvf /usr/soft/sort/apache-tomcat-9.0.7.tar.gz -C /usr/soft/install/
# 6. 配置环境变量
vim /etc/profile
# 在最后添加:
# export CATALINA_HOME=/usr/soft/install/apache-tomcat-9.0.7
# export CATALINA_BASE=/usr/soft/install/apache-tomcat-9.0.7
# 保存退出
# 7. 立即生效
source /etc/profile
# 8. 用备份的 Tomcat 目录覆盖新安装的
# (注意:先删除新 Tomcat 的 webapps/jenkins 文件夹)
# 9. 启动 Tomcat
cd /usr/soft/install/apache-tomcat-9.0.7/bin
./startup.sh
# 访问 IP:端口 看到 Tomcat 主页就算成功
# 10. 先走一遍 Jenkins 新手流程,然后关闭 Tomcat
# 11. 用备份的 /root/.jenkins 目录覆盖新服务器同目录
# 12. 重新启动 Tomcat
💡 避坑:
secrets文件夹覆盖后凭证能否直接用不确定,如果不行需要重新添加凭证,每个流程都要重新用新凭证- 启动前一定要删干净新 Tomcat 里自带的 jenkins 文件夹,否则会冲突
- 环境变量改的是
/etc/profile(没有后缀),不是别的文件- vim 操作:按
i编辑,按Esc退出编辑,按:输入命令,wq保存退出
Halo 博客迁移
前置准备
# 1. 新服务器安装 JDK 11
sudo apt update && sudo apt install openjdk-11-jdk # Ubuntu/Debian
sudo yum install java-11-openjdk # CentOS
导出旧数据
# 1. 旧服务器先不要停
# 2. Halo 后台 → 工具 → 导出数据(导出 data.json)
# 3. xftp 导出 /home/halo/.halo 目录所有文件
# ⚠️ 注意:upload 文件夹有中文名图片,xftp 属性改为 UTF-8,否则导出报错
# 4. 停 CDN(如果有)
# 5. 域名解析指向新服务器 IP
# 6. 新服务器开放 8090 端口
新服务器安装
# 1. 创建 halo 用户
useradd -m halo-fx67ll
usermod -aG sudo halo-fx67ll
passwd halo-fx67ll
su - halo-fx67ll
# 2. 下载 Halo 运行包
mkdir ~/app && cd ~/app
# 1.5.2 版本官方不再维护,用 GitHub API 获取下载链接
RELEASE_URL=$(curl -s https://api.github.com/repos/halo-dev/halo/releases/tags/v1.5.2 | grep "browser_download_url.*halo-1.5.2.jar" | cut -d '"' -f 4)
wget "$RELEASE_URL" -O halo.jar
# 3. 创建工作目录
mkdir ~/.halo && cd ~/.halo
# 4. 用老的配置文件(直接从老服务器拉过来)
# 如果丢失了就手动重建:
cat > application.yaml <<'EOF'
server:
port: 8090
compression:
enabled: false
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/.halo/db/halo
username: ******
password: ******
h2:
console:
enabled: false
settings:
web-allow-others: false
EOF
# 5. 测试运行
cd ~/app && java -jar halo.jar
# 看到 Halo started successfully! 就算成功
# Ctrl+C 停止测试进程
配置为系统服务
# 退回 root 账户
exit
# 创建 systemd 服务文件
cat > /etc/systemd/system/halo.service <<'EOF'
[Unit]
Description=Halo Service
Documentation=https://docs.halo.run
After=network.target
[Service]
Type=simple
User=halo-fx67ll
Group=halo-fx67ll
WorkingDirectory=/home/halo-fx67ll/app
ExecStart=/usr/bin/java -jar /home/halo-fx67ll/app/halo.jar
Restart=always
StandardOutput=journal+console
StandardError=journal+console
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd
systemctl daemon-reload
# 启动服务
systemctl start halo
# 开机自启
systemctl enable halo
# 查看状态
systemctl status halo
导入数据
# 1. 先配置好 nginx(建议先不配置 https,确保 http 能访问再说)
# 2. 启动 Halo,在引导界面选择导入老数据,用之前导出的 data.json
# 3. 停止 Halo,把备份的 .halo 目录所有文件覆盖到新服务器同目录
# (upload、db 等文件夹都要覆盖)
# 4. 重新启动 Halo
💡 避坑:
- 建议先配 HTTP 确保能访问,再配 HTTPS
- xftp 传中文文件一定要改 UTF-8 编码,否则文件名乱码或报错
- 导入数据和覆盖文件时,最好两边都停掉 Halo,避免数据不一致
- H2 控制台和远程访问平时都关掉,安全第一
2.5 前端 / 静态站点迁移
# 1. 旧服务器 /usr/share 下的 nginx 文件夹
# 整个复制到新服务器相同目录 /usr/share/nginx
# 2. 逐一开放相关网站端口
# (服务器安全组 + 防火墙 + 宝塔安全组)
# 3. 在 Nginx 配置目录新增对应域名的配置
# 宝塔面板:/www/server/nginx/conf/vhost/nginx-fx67ll/*.conf
# 主配置文件通过 include 引入:
# include /www/server/nginx/conf/vhost/nginx-fx67ll/*.conf;
# 4. 每开一个端口,同步开防火墙端口
sudo ufw allow 端口号
# 或修改 iptables 配置后重启
💡 避坑:
- 每开一个站点就要开一个端口,别漏了防火墙
- Nginx 配置通过 include 引入子目录,方便管理
- 403 权限不足?看下面常见问题
2.6 Nginx 配置迁移
宝塔面板域名绑定 + SSL
# 1. 先关闭面板本身的 SSL 开关
# 可视化界面关不一定成功,用 bt 命令关闭
# 2. 绑定域名(可选,不绑定也能用 IP+端口访问)
# 绑定后访问方式:域名+端口号
# 3. Nginx 配置:80 端口代理宝塔 HTTP 地址
# 4. 443 端口配置 HTTPS
宝塔 Nginx 配置示例
server {
listen 80;
server_name ez13.top;
location / {
proxy_pass https://baota.fx67ll.com:10234;
}
}
server {
listen 443 ssl;
server_name ez13.top;
ssl_certificate /etc/ssl/ez13.top/ez13.top.crt;
ssl_certificate_key /etc/ssl/ez13.top/ez13.top.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
location / {
proxy_pass https://baota.fx67ll.com:10234;
}
}
2.7 SSL 证书更新
SSL 证书需要每年更新
# 1. 证书下发前选择 DNS 自动验证
# ⚠️ 记得删除之前的验证记录!
# 2. 重新签发后,检查证书域名和 nginx.conf 中指向的是否一致!
# 3. 证书统一存放在 /etc/ssl 目录下
# 4. 更换后需要等缓存清除,不要心急!
# 浏览器可能缓存旧证书,用无痕模式或清缓存测试
💡 避坑:
- DNS 验证前一定要删旧的验证记录,否则可能冲突
- 证书域名和 Nginx 配置里的 server_name 必须一致
- 换完证书别急,等一会儿缓存清了再验证,可能不是你的问题
2.8 迁移后验证清单
- 宝塔面板能正常访问
- MySQL 能连接(本地 + 远程)
- Redis 能连接(本地 + 远程)
- 若依后台能访问
- 超神服务能访问
- Node 服务正常运行
- Jenkins 能访问,任务都在
- Halo 博客能访问,文章和图片都在
- 所有静态站点能访问
- HTTPS 正常,证书有效
- Fail2Ban 已部署并运行
- 域名解析已切到新服务器
- 旧服务器可以销毁了
2.9 常见问题
访问 HTML 报 403 权限不足
# 原因:Nginx 用户对静态文件目录没有读取权限
# 解决:修改目录和文件权限
chmod -R 755 /usr/share/nginx/html-8070 # 目录权限
chmod 644 /usr/share/nginx/html-8070/index.html # 文件权限
Nginx 配置不生效
# 检查语法
nginx -t
# 重载配置
nginx -s reload
第三篇:安全防护
适用场景:新服务器必做一次,被攻击后加固
核心防护:Fail2Ban 防爆破 + 系统更新 + 日常巡检
3.1 系统基础加固
一键更新系统补丁
apt update && apt upgrade -y
检查爆破登录记录
grep Failed /var/log/auth.log
如果有大量失败记录,说明被爆破了,赶紧装 Fail2Ban。
3.2 Fail2Ban 防爆破
安装
apt update -y
apt install fail2ban -y
# 开机自启 + 启动
systemctl enable --now fail2ban
systemctl restart fail2ban
SSH 防爆破(必装)
cat > /etc/fail2ban/jail.d/sshd.conf <<'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 86400
findtime = 600
ignoreip = 127.0.0.1
EOF
| 参数 | 值 | 含义 |
|---|---|---|
| maxretry | 5 | 最多错 5 次 |
| bantime | 86400 | 封 24 小时 |
| findtime | 600 | 10 分钟内 |
| ignoreip | 127.0.0.1 | 白名单 |
⚠️ 重要:
ignoreip一定要加上你自己的公网 IP,否则误封自己就麻烦了。
Nginx SSL 恶意扫描防护
# 过滤器
cat > /etc/fail2ban/filter.d/ssl-fail.conf <<'EOF'
[Definition]
failregex = .*SSL.*failed.*client: <HOST>
ignoreregex =
EOF
# 监狱
cat > /etc/fail2ban/jail.d/ssl-protect.conf <<'EOF'
[ssl-protect]
enabled = true
filter = ssl-fail
logpath = /www/wwwlogs/nginx_error.log
maxretry = 5
findtime = 600
bantime = 86400
banaction = iptables-multiport
banaction_allports = true
ignoreip = 127.0.0.1
EOF
💡
banaction_allports = true→ 封禁该 IP 所有端口,避免换端口扫描
MySQL 防爆破
# 前置优化:开启详细错误日志(必须做,否则匹配失效)
grep log_error_verbosity /etc/my.cnf
# 无输出则写入
sed -i '/\[mysqld\]/a log_error_verbosity = 3' /etc/my.cnf
/etc/init.d/mysqld restart
chmod 644 /www/server/data/hcss-ecs-695e.err
# 过滤器
cat > /etc/fail2ban/filter.d/mysql.conf <<'EOF'
[INCLUDES]
before = common.conf
[Definition]
_daemon = mysqld
failregex = ^.*Access denied for user .*@'<HOST>'
ignoreregex =
EOF
# 监狱
cat > /etc/fail2ban/jail.d/mysql.conf <<'EOF'
[mysql]
enabled = true
port = 3306
filter = mysql
logpath = /www/server/data/hcss-ecs-695e.err
maxretry = 5
findtime = 600
bantime = 86400
action = iptables[name=MySQL, port=3306, protocol=tcp]
ignoreip = 127.0.0.1
EOF
Redis 防爆破
# 过滤器
cat > /etc/fail2ban/filter.d/redis.conf <<'EOF'
[Definition]
failregex = ^.*Failed password for user .* from <HOST>
^.*Authentication failed for user .* from <HOST>
^.*ERR invalid password from <HOST>
^.*Client sent AUTH, but no password is set from <HOST>
ignoreregex =
EOF
# 监狱
cat > /etc/fail2ban/jail.d/redis.conf <<'EOF'
[redis]
enabled = true
port = 6379
filter = redis
logpath = /www/server/redis/redis.log
maxretry = 5
findtime = 600
bantime = 86400
action = iptables[name=Redis, port=6379, protocol=tcp]
ignoreip = 127.0.0.1
EOF
MongoDB 防爆破
# 过滤器
cat > /etc/fail2ban/filter.d/mongodb.conf <<'EOF'
[Definition]
failregex = .*"msg":"(Auth failed|Authentication failed|Authentication failure|login failed|Unauthorized|auth error)".*"(remote|client)":"<HOST>:\d+"
.*"errmsg":".*Connection reset by peer".*"(remote|client)":"<HOST>:\d+"
.*"Interrupted operation as its client disconnected".*"(remote|client)":"<HOST>:\d+"
datepattern = {"t":{"\$date":"%%Y-%%m-%%dT%%H:%%M:%%S\.%%f\+\d{2}:\d{2}"}}
ignoreregex = "\"(remote|client)\":\"127\.0\.0\.1:"
EOF
# 监狱
cat > /etc/fail2ban/jail.d/mongodb.conf <<'EOF'
[mongodb]
enabled = true
port = 27017
filter = mongodb
logpath = /www/server/mongodb/log/config.log
maxretry = 5
findtime = 600
bantime = 86400
action = iptables[name=MongoDB, port=27017, protocol=tcp]
ignoreip = 127.0.0.1
EOF
Recidive 惯犯加重封禁(推荐)
30 天内累计被封 3 次 → 永久封禁
cat > /etc/fail2ban/jail.d/recidive.conf <<'EOF'
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
findtime = 2592000
maxretry = 3
bantime = -1
banaction = iptables-multiport
banaction_allports = true
ignoreip = 127.0.0.1
EOF
生效 & 校验
# 语法校验
fail2ban-client -t
# 热加载(不清除现有封禁)
fail2ban-client reload
# 查看所有监狱状态
fail2ban-client status
# 逐个查看
fail2ban-client status sshd
fail2ban-client status ssl-protect
fail2ban-client status mysql
fail2ban-client status redis
fail2ban-client status mongodb
fail2ban-client status recidive
正则匹配测试(迁移必跑)
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
fail2ban-regex /www/wwwlogs/nginx_error.log /etc/fail2ban/filter.d/ssl-fail.conf
fail2ban-regex /www/server/data/hcss-ecs-695e.err /etc/fail2ban/filter.d/mysql.conf
fail2ban-regex /www/server/redis/redis.log /etc/fail2ban/filter.d/redis.conf
fail2ban-regex /www/server/mongodb/log/config.log /etc/fail2ban/filter.d/mongodb.conf
Failregex > 0 = 正常;= 0 = 路径错或暂无攻击日志
3.3 日常运维命令
全局概览
# 服务状态
systemctl status fail2ban
# 所有监狱
fail2ban-client status
# 所有被封 IP
fail2ban-client banned
# 实时监控封禁日志
tail -f /var/log/fail2ban.log
分监狱操作
# 查看单个监狱
fail2ban-client status <监狱名>
# 解封 IP
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client set ssl-protect unbanip 1.2.3.4
fail2ban-client set mysql unbanip 1.2.3.4
fail2ban-client set redis unbanip 1.2.3.4
fail2ban-client set mongodb unbanip 1.2.3.4
# 手动封禁测试
fail2ban-client set sshd banip 1.2.3.4
批量修改
# 放宽阈值到 10 次
sed -i 's/maxretry = 5/maxretry = 10/' /etc/fail2ban/jail.d/*.conf
fail2ban-client reload
# 缩短封禁时间为 1 小时
sed -i 's/bantime = 86400/bantime = 3600/' /etc/fail2ban/jail.d/*.conf
fail2ban-client reload
# 批量加白名单
NEW_IP="123.45.67.89"
sed -i "/^ignoreip/s/$/ $NEW_IP/" /etc/fail2ban/jail.d/*.conf
fail2ban-client reload
攻击统计
# 历史所有被 Ban 的 IP + 次数(倒序)
grep "Ban" /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -nr
# 今日封禁记录
grep $(date +%Y-%m-%d) /var/log/fail2ban.log | grep Ban
# SSL 攻击日志
grep -i "ssl.*failed" /www/wwwlogs/nginx_error.log
3.4 排错指南
| 现象 | 原因 | 解决 |
|---|---|---|
| 本机被误封 | 白名单不全 | 所有 jail 的 ignoreip 都加本机公网 IP |
| 正则匹配 0 | 路径/权限/无对应日志 | 核对路径、权限、日志内容 |
| 修改不生效 | 没 reload | fail2ban-client reload |
| 找不到 jail | 文件名错/语法错 | fail2ban-client -t 定位报错 |
| MySQL 匹配 0 | 没开详细日志 | log_error_verbosity=3 + 日志权限 |
| SSL 误封正常用户 | 阈值太低 | 调高 maxretry 到 10~15 |
| Redis 匹配 0 | 日志没开 | 宝塔面板开启 Redis 日志 |
| MongoDB 匹配 0 | 没开认证 | 无密码登录不产生失败日志 |
| 匹配几千但 failed 0 | 都是历史日志 | 只统计新增日志,正常 |
3.5 每日巡检流程
# 1. 服务是否存活
systemctl status fail2ban
# 2. 所有监狱状态
fail2ban-client status
# 3. 当前封禁 IP 总量
fail2ban-client banned
# 4. 今日新增拦截
grep $(date +%Y-%m-%d) /var/log/fail2ban.log | grep Ban
# 5. 实时监控(异常排查时用)
tail -f /var/log/fail2ban.log
3.6 服务器迁移检查清单(Fail2Ban 部分)
- 安装 fail2ban
- 复制所有 filter 文件到
/etc/fail2ban/filter.d/ - 复制所有 jail 文件到
/etc/fail2ban/jail.d/ - 所有 jail 的
ignoreip改为新服务器公网 IP - MySQL jail 的
logpath改为新主机名 - MySQL 执行前置优化(开启详细日志)
-
fail2ban-client -t语法校验 -
fail2ban-client reload热加载 - 确认所有监狱正常加载
- 逐条
fail2ban-regex校验匹配正常 - 手动 ban 一个测试 IP,验证 iptables 生效
附录
A. 端口速查表
| 端口 | 服务 | 默认开启 |
|---|---|---|
| 22 | SSH | ✅ |
| 80 | HTTP | ✅ |
| 443 | HTTPS | ✅ |
| 8080 | Tomcat / Jenkins | ✅ |
| 8090 | Halo | ✅ |
| 3306 | MySQL 5.7 | ❌ |
| 3307 | MySQL 8.0 | ❌ |
| 6379 | Redis | ❌ |
| 27017 | MongoDB | ❌ |
| 9897 | 若依后台 | ✅ |
| 9797 | 超神服务 | ✅ |
| 8888 | 宝塔初始端口 | ✅(已改) |
| 10234 | 宝塔改后端口 | ✅ |
B. 目录速查表
| 路径 | 用途 |
|---|---|
/usr/soft |
软件安装包 |
/usr/share/nginx |
静态站点文件 |
/etc/nginx |
Nginx 配置 |
/etc/ssl |
SSL 证书 |
/etc/sysconfig/iptables |
防火墙配置 |
/usr/node |
Node 应用 |
~/.halo |
Halo 工作目录 |
/root/.jenkins |
Jenkins 数据 |
/etc/fail2ban |
Fail2Ban 配置 |
/var/log/fail2ban.log |
Fail2Ban 日志 |
/var/log/auth.log |
SSH 认证日志 |
/www/wwwlogs/nginx_error.log |
Nginx 错误日志 |
/www/server/data/ |
MySQL 数据目录 |
/www/server/redis/ |
Redis 目录 |
/www/server/mongodb/ |
MongoDB 目录 |
/home/ruoyi/ |
若依服务 |
/home/ruoyi-chaoshen/ |
超神服务 |
C. 未来 TODO
- 写一个自动重启脚本,服务器炸了后自动启动所有服务,类似 Halo 的 systemd 守护
Q.E.D.


