fx67ll 服务器运维手册

2026-08-06   


00-服务器运维手册(汇总版)


最后更新时间:2026年8月6日

汇总清单手册地址:


个人服务器运维全记录,涵盖应急重启、服务迁移、安全防护三大场景
使用方式:左侧目录跳转,或按场景快速定位


📍 快速导航

场景 跳转 触发频率
🔥 服务器炸了 / 重启后恢复 第一篇:应急重启 偶尔
🚚 换服务器 / 迁移数据 第二篇:服务迁移 每年 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.


Hi!欢迎访问 fx67ll.com 的个人博客站点!Code is my life ~