> 适用场景:一台服务器上同时装了 **宝塔面板** 和 **流盾 WAF(FlowShield)**然后经常搭建新网站的用户
> 看完这篇你能明白:为什么需要它、它是什么原理、怎么一步步装、怎么验证、出问题怎么查。
## 一、先用大白话讲清楚:这到底是怎么回事
### 1. 装了流盾之后,你服务器的端口是这样的
访客浏览器
│
▼
┌──────────────────────────────┐
│ 流盾 WAF 容器 占用 80/443 │ ← 所有外部流量先到这里(这里是”安检口”)
└──────────────────────────────┘
│ 安检完把流量转给……
▼
┌──────────────────────────────┐
│ 宝塔 nginx 监听 8080/4343 │ ← 站点实际住在这里(改成高位端口做”后门”)
└──────────────────────────────┘
│
▼
你的各个网站程序
– **80 端口** = HTTP 通道,**443 端口** = HTTPS 通道。全世界的访客默认都走这两个口。
– 装流盾时,这两个口被流盾”抢”走了(必须的,不然它没法帮你挡攻击)。
– 于是宝塔的 nginx 被迫搬家:HTTP 去了 **8080**,HTTPS 去了 **4343**。这两个新端口叫**回源端口**——只有流盾会从内部连它们,外人碰不到。
### 2. 坑在哪里
宝塔**新建网站**时,生成的配置文件里**写死了**这两行:
“`nginx
listen 80; # 站点说:我要占 80 口
listen 443 ssl; # 站点说:我要占 443 口
“`
但 80/443 已经是流盾的了!nginx 有个狠规矩:**只要有一个站点绑不上端口,整个 nginx 重载就失败,你服务器上所有网站全体下线**——不只是新站挂,是全挂。
所以你需要一个”保姆”:每当宝塔建了新站、写了 `listen 80`,保姆立刻偷偷把它改成 `listen 8080`(443 改成 4343),网站就能正常活了。**本教程就是教你装这个保姆。**
### 3. 为什么不改宝塔本身?
有人会想:直接改宝塔源码里的模板不就行了?
**不行,会复发。** 宝塔每次升级都会用官方文件覆盖自己的源码,你改的模板一周内就会被冲掉,然后某天建新站全站爆炸,你还不知道为什么。
所以本工具选择**不动宝塔,在外面盯着**——宝塔爱怎么写怎么写,写完立刻被纠正。宝塔升级 100 次,保姆照样工作。
—
## 二、工具的工作原理(想知道细节再看,看不懂可跳过)
整个工具就三个文件,分工如下:
### 文件 1:`fswaf-port-remap.py` —— 干活的工人
它做的事:
1. 扫描宝塔所有站点配置目录 `/www/server/panel/vhost/nginx/*.conf`
2. 用正则表达式找 `listen 80` 和 `listen 443`,改成 `listen 8080` 和 `listen 4343`
3. 改之前先把新内容写到临时文件,再**原子替换**(不会出现”改到一半被 nginx 读到”的尴尬)
4. 改完后先跑 `nginx -t` 体检:配置合法才热重载(不断网),不合法就只记日志不动手
改写的核心正则 `listen\s+80\b` 里有个 **`\b`(单词边界)**,保证:
– `listen 80;` ✅ 会改
– `listen 8080;` ❌ 不会被误改成 `listen 808080`
– `listen 443 ssl http2;` ✅ 会改成 `listen 4343 ssl http2;`(后缀原样保留)
### 文件 2:`fswaf-port-watch.sh` —— 站岗的哨兵
用 Linux 内核的 **inotify** 机制盯着配置目录。inotify 是内核级的文件变动通知,宝塔写文件的**瞬间**哨兵就收到信号——不是轮询,**平时 CPU 占用为零**。
它盯三种事件:
– `create`:新建文件(建新站)
– `modify`:文件内容变了(比如后来给站点申请 SSL 证书,宝塔往配置里加 `listen 443`)
– `moved_to`:文件被移动进来(宝塔有时用 mv 方式写文件)
收到信号后先 `sleep 2` 等宝塔写完(一次操作会触发十几个事件,等写完一起处理),再叫工人来干活。
### 文件 3:`fswaf-port-remap.service` —— 让保姆自动上下班
systemd 服务配置文件,作用:
– **开机自动启动**(服务器重启不用你操心)
– **崩了 5 秒后自动拉起**(永远在岗)
– 用 `journalctl` 随时查它干了什么
—
## 三、手动部署教程(一步一步来,每步都有验证)
> 前提:服务器上已装好宝塔 + 流盾 WAF,且你能用 SSH 工具(Tabby 等)以 root 登录。
### 准备工作:把三个文件传到服务器
把 `fswaf-port-remap.py`、`fswaf-port-watch.sh`、`fswaf-port-remap.service` 三个文件传到服务器任意目录,比如 `/root/`。
> 传文件方式任选:Tabby 的 SFTP 面板直接拖进去、宝塔面板 → 文件 → 上传、或 `scp` 命令。
—
### 第 1 步:安装 inotify 工具
哨兵依赖 `inotifywait` 命令,先确认它存在:
“`bash
inotifywait –help
“`
– 如果显示出一堆帮助文字 → 已装好,跳过本步
– 如果提示 `command not found` → 按你的系统安装:
“`bash
# Debian / Ubuntu(流盾官方推荐的系统)
apt-get update
apt-get install -y inotify-tools
# CentOS / Alibaba Cloud Linux / RHEL
yum install -y inotify-tools
“`
装完再跑一次 `inotifywait –help` 确认有输出。
—
### 第 2 步:把文件放到正式位置
“`bash
# 工人脚本 → /usr/local/bin/,并给执行权限
install -m 755 /root/fswaf-port-remap.py /usr/local/bin/
install -m 755 /root/fswaf-port-watch.sh /usr/local/bin/
# 服务配置 → systemd 目录,权限 644 就够
install -m 644 /root/fswaf-port-remap.service /etc/systemd/system/
“`
> 💡 `install` 命令 = 复制 + 设置权限一步到位。
> 💡 如果你的文件不在 `/root/`,把路径换成实际位置。
**验证**:
“`bash
ls -l /usr/local/bin/fswaf-port-remap.py /usr/local/bin/fswaf-port-watch.sh /etc/systemd/system/fswaf-port-remap.service
“`
三个文件都在、`fswaf` 开头的两个带 `x`(可执行)权限即为正确。
—
### 第 3 步:手动跑一次,清洗存量配置
先不启动哨兵,手动让工人跑一遍,把**现有**配置里残留的 80/443 也洗掉:
“`bash
python3 /usr/local/bin/fswaf-port-remap.py
“`
**怎么判断成功**:
– 输出 `nginx reloaded`,或干脆**什么都不输出**(说明现有配置本来就对,没东西可改)→ 成功
– 输出 `nginx -t FAILED: …` → 配置本身有问题,把报错截图留着,看第六节排查
—
### 第 4 步:启动保姆服务并设为开机自启
“`bash
# 让 systemd 重新读取配置(装过服务都要跑这句)
systemctl daemon-reload
# 启动 + 开机自启(–now = 顺便现在就启动)
systemctl enable –now fswaf-port-remap.service
“`
**验证**:
“`bash
systemctl is-active fswaf-port-remap.service
“`
输出 `active` → 大功告成 ✅
—
### 第 5 步:模拟测试(强烈建议做一次)
假装宝塔建了个新站,看保姆会不会自动纠正:
“`bash
# 1. 造一个带错误端口的测试配置
printf ‘server {\n listen 80;\n listen 443 ssl http2;\n server_name remap-test.com;\n}\n’ \
> /www/server/panel/vhost/nginx/remap-test.conf
# 2. 等 6 秒(哨兵有 2 秒去抖 + 反应时间)
sleep 6
# 3. 看结果
grep listen /www/server/panel/vhost/nginx/remap-test.conf
“`
**预期输出**(端口已被自动纠正):
“`
listen 8080;
listen 4343 ssl http2;
“`
再看看工作日志:
“`bash
journalctl -u fswaf-port-remap.service –no-pager -n 5
“`
应该能看到 `remapped: /www/server/panel/vhost/nginx/remap-test.conf` 和 `nginx reloaded`。
**4. 删除测试文件收尾**:
“`bash
rm -f /www/server/panel/vhost/nginx/remap-test.conf
“`
> 不用担心删掉后 nginx 报错——旧的 reload 已经完成,删文件不影响。
—
## 四、装好之后,你以后的建站日常
1. 宝塔正常建站,**什么都不用管**,端口自动纠正
2. 正常申请/部署 SSL 证书(宝塔往配置里写 `listen 443 ssl;` 时也会被自动纠正)
3. 打开流盾面板(地址形如 `http://服务器IP:9000/你的安全入口`),用「面板集成 → 宝塔导入」把新站接进流盾;手动添加的话,回源端口填 **8080**(HTTP)/ **4343**(HTTPS)
## 五、日常管理命令速查
“`bash
# 实时看保姆在干什么(按 Ctrl+C 退出)
journalctl -u fswaf-port-remap.service -f
# 看服务状态
systemctl status fswaf-port-remap.service
# 重启保姆(改过脚本后需要)
systemctl restart fswaf-port-remap.service
# 停止 / 取消开机自启
systemctl disable –now fswaf-port-remap.service
“`
**想换端口映射**?(比如另一台服务器回源端口是 8081/4344)
只改 `/usr/local/bin/fswaf-port-remap.py` 第二行:
“`python
MAP = {“80”: “8081”, “443”: “4344”} # 左边=宝塔默认写的端口,右边=你的回源端口
“`
然后 `systemctl restart fswaf-port-remap.service`。其他两个文件都不用动。
## 六、常见问题排查
### Q1:`systemctl is-active` 显示 `failed` 或 `activating (auto-restart)`
多半是 `inotifywait` 没装(回看第 1 步)或脚本路径不对。查日志看具体原因:
“`bash
journalctl -u fswaf-port-remap.service –no-pager -n 20
“`
### Q2:手动跑 remap.py 报 `nginx -t FAILED`
这是**配置文件本身有问题**,跟本工具无关(工具只在 nginx 体检通过时才重载,不会雪上加霜)。看报错里提到的文件和行号,通常是宝塔建站时证书路径缺失等,去宝塔面板里检查对应站点设置。
### Q3:建新站后站点还是 502 / 打不开
按顺序检查:
“`bash
# 1. 保姆活着吗?
systemctl is-active fswaf-port-remap.service
# 2. 端口被纠正了吗?
grep listen /www/server/panel/vhost/nginx/你的域名.conf
# 3. 宝塔 nginx 活着吗?
systemctl status nginx
# 4. 流盾在流盾面板里添加这个站了吗?回源端口填对了吗(8080/4343)?
“`
最常见的答案是第 4 条:**新站必须在流盾面板里也添加一次**,WAF 才会把 80/443 的流量转给它。
### Q4:宝塔升级后需要重装本工具吗?
**不需要。** 本工具不修改宝塔的任何文件,升级随便升。
### Q5:怎么彻底卸载?
“`bash
systemctl disable –now fswaf-port-remap.service
rm -f /etc/systemd/system/fswaf-port-remap.service \
/usr/local/bin/fswaf-port-remap.py \
/usr/local/bin/fswaf-port-watch.sh
systemctl daemon-reload
“`
卸载干净,零残留。
—
## 七、技术细节备忘(给以后维护的人)
| 项目 | 值 |
|—|—|
| 监控目录 | `/www/server/panel/vhost/nginx/`(宝塔站点配置标准路径) |
| 端口映射 | `80 → 8080`,`443 → 4343`(在 remap.py 的 `MAP` 变量里改) |
| 去抖时间 | 2 秒(watch.sh 里的 `sleep 2`) |
| 重载方式 | `nginx -t` 通过后 `nginx -s reload`(热重载,不掉连接) |
| 写入方式 | 临时文件 + `os.replace` 原子替换,`.remap.tmp` 文件已被哨兵排除监听 |
| 开机自启 | systemd:`multi-user.target.wants` |
| 日志位置 | `journalctl -u fswaf-port-remap.service` |
20261021194153151-dabao.zip
zip文件
1.5K





没有回复内容