宝塔面板、Nginx和MySQL在多网卡环境下默认监听0.0.0.0,存在安全风险,必须手动修改配置绑定内网IP:面板需改init.sh的--bind参数及port.pl;Nginx需修改listen指令;MySQL需设置bind-address并确保用户权限允许内网访问。

宝塔面板默认只监听 0.0.0.0,多网卡时会暴露在所有网卡上
宝塔安装后,bt 命令启动的面板服务、Nginx 和 MySQL 默认都绑定 0.0.0.0,这意味着只要服务器有多个网卡(比如内网 192.168.1.10、外网 203.203.203.10),面板和数据库就可能从任意网卡被访问——存在安全风险,也违反内网隔离要求。
关键不是“能不能改”,而是必须改:宝塔自身不提供图形化绑定指定 IP 的开关,得手动改配置文件 + 重启服务。
修改宝塔面板监听地址(/www/server/panel/data/port.pl + 防火墙)
宝塔面板的监听 IP 不在 Web 界面里配,而由两个地方控制:端口文件和启动参数。改错一个都会失败。
- 先确认当前监听状态:
netstat -tlnp | grep :8888(假设面板端口是 8888),看到0.0.0.0:8888就说明还没绑定指定 IP - 编辑端口文件:
/www/server/panel/data/port.pl,只保留纯数字端口号(如8888),不要加 IP 或冒号 - 真正起作用的是启动命令里的
--bind参数:编辑/www/server/panel/init.sh,找到python main.py这一行,在末尾加上--bind=192.168.1.10:8888(替换成你要绑定的内网 IP) - 重启面板:
bt restart,再用netstat检查是否变成192.168.1.10:8888 - 别忘了关掉其他网卡的防火墙放行(如外网网卡的 8888 端口):
firewall-cmd --permanent --remove-port=8888/tcp(CentOS 7)
Nginx 绑定指定 IP:改 listen 指令,别只改 server_name
server_name 控制的是 HTTP Host 匹配,和监听哪个网卡完全无关。真正决定 Nginx 接收请求的网卡,是 listen 指令的地址部分。
- 进入站点配置目录:
/www/server/panel/vhost/nginx/,编辑对应站点的 conf 文件 - 把
listen 80;改成listen 192.168.1.10:80;;HTTPS 同理:listen 192.168.1.10:443 ssl http2; - 如果想让某个站点仅响应内网请求,但又不想改全局 listen,可以加
allow/deny,但这只是应用层过滤,不如直接 bind 到内网 IP 彻底 - 改完执行:
nginx -t && systemctl reload nginx,否则语法错误会导致整个 Nginx 崩溃
MySQL 只监听内网 IP:重点改 bind-address,不是 skip-networking
MySQL 默认开启 skip-networking = 0(即允许 TCP 连接),但 bind-address 决定它听谁的包。设成 127.0.0.1 就只能本地连,设成 0.0.0.0 就全放开——你要的是中间态。
- 编辑 MySQL 配置:
/etc/my.cnf或/www/server/mysql/etc/my.cnf,在[mysqld]段下添加或修改:bind-address = 192.168.1.10 - 删掉或注释掉
skip-networking行(如果存在),否则 MySQL 根本不监听任何 TCP 端口 - 确保用户权限允许从该 IP 连接:登录 MySQL 执行
SELECT host FROM mysql.user WHERE user='root';,如果是%或具体内网 IP 就行;如果是localhost,得用CREATE USER 'root'@'192.168.1.10' IDENTIFIED BY 'xxx'; GRANT ALL ...; - 重启 MySQL:
systemctl restart mysqld,再用ss -tlnp | grep :3306确认监听地址已变
多网卡环境里,bind-address 写错 IP(比如写成不存在的地址)、漏改 my.cnf 路径、或权限没同步更新,这三个是最常导致“改了不生效”的原因。


















