Beyond‘s blog

IT/Web技术

【危险】请勿将 MySQL 3306 端口对外开放!!

作为网站或服务器管理员,一些看似不起眼的设置,可能会带来严重的安全风险,而管理员本人往往并未察觉。

很多人会想:“网站不是正常运行吗?”、“有密码就安全了吧?”

事实上,这种想法往往会埋下隐患。

将3306端口对外开放,会有什么后果?

这等同于把MySQL / MariaDB数据库直接暴露在互联网上,任何人都可以尝试访问。

而数据库中往往保存着最敏感的企业信息和客户数据。

即使设置了密码,也可能被暴力破解。

公开 3306 端口,实际上就是为攻击者提供了直接入口。

正常设置 危险设置
Web服务器 localhost 或 127.0.0.1 的3306端口 Web服务器 0.0.0.0 或服务器公网IP的3306端口
外部连接 被完全阻断,无法访问 外部连接 任何人都可以访问

* 127.0.0.1 是保留给计算机本机使用的专用 IP 地址,固定用于指向“本机”。
换句话说,设置为 127.0.0.1 时,只有服务器自身才能访问该服务,外部设备无法连接。

为什么会出现危险设置?

危险设置不仅源于知识不足,也容易在特定工作情况下发生。

在特定工作情况下,很多人会抱着:“只是临时用一下”、“反正现在能正常运行”的侥幸心理,进行危险设置。

通常,出现危险设置可归为以下几类原因。

初始设置沿用示例 直接使用教程或示例网站的默认配置(如 bind-address = 0.0.0.0),未作调整就部署到正式环境。
对接外部服务后忘记关闭 为了临时让外部工具或备份服务访问数据库,开放了连接,但操作完成后忘记关闭。
工作交接疏漏 前任人员为“一时应急”修改设置,却未记录在交接文档中,后续被误当作常规配置沿用。
外包厂商配置错误 系统开发商误将测试环境的设置应用到正式环境。

对外开放3306端口的严重后果

将3306端口暴露在互联网上,不只是简单的设置失误问题,还将给企业业务带来重大的安全隐患。

具体危险包括:

① 为攻击者打开数据库入口


-- 攻击者可以直接连接并操作你的数据库
DROP TABLE users;
DELETE FROM orders;

② 信息泄露风险

〇 客户信息(姓名・邮箱等)
〇 密码(即便经过哈希化处理仍可能被破解)
〇 订单记录及其他机密数据

③ 网站瘫痪

一旦数据库被删除,网站将完全停止运行。(网站页面也无法显示)

④ 服务器被劫持

攻击者可能通过数据库入侵整个系统,将服务器用作发动攻击的跳板。(如传播勒索病毒等)

立即排查3306端口是否暴露

可以通过在线工具或命令行,快速检测MySQL的3306端口是否对外公开。

① 使用在线工具

访问在线端口检测网站,输入服务器IP地址,查询3306端口是否显示为”OPEN”。

〇 ping.eu
https://ping.eu/port-chk

〇 you get signal
https://www.yougetsignal.com/tools/open-ports

② 通过服务器命令行检测

在服务器内部尝试连接 3306 端口,如果连接成功,说明端口可能对外暴露,需要立即处理。

telnet [服务器IP] 3306

MySQL 3306端口正确设置指南

本指南假设Web服务器和数据库部署在同一台服务器上,介绍3306端口的安全设置方法。

* 重要提示: 在正式环境操作前,请务必备份数据库,以防设置出错导致数据丢失。

① 查看当前设置

执行以下命令检查MySQL配置文件中的bind-address设置。

如果显示0.0.0.0或服务器公网IP,则说明端口对外开放,需要立即修正。

# 检查 MySQL 设置文件 * 确认 bind-address 设置
sudo grep -r "bind-address" /etc/mysql/

# 查看 MySQL 当前监听的网络接口
sudo netstat -tlnp | grep mysql

[mysqld]
bind-address = 127.0.0.1 # 安全!
# bind-address = 0.0.0.0 # 危险!

② 编辑设置文件

通过修改 MySQL 配置文件,仅允许本机连接。

# 编辑设置文件(文件路径根据环境可能不同)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# 或
sudo nano /etc/mysql/my.cnf

在MySQL配置文件中找到并修改以下内容。

# 安全设置(确认或修改为如下)
bind-address = 127.0.0.1



# 危险设置(若存在需立即修改)
# bind-address = 0.0.0.0
# bind-address = 服务器公网IP 

③ 使设置生效

保存设置文件后,需要重启MySQL以应用更改。

# 可选:检查设置文件语法(推荐)
sudo mysqld --validate-config

# 重启 MySQL 服务
sudo systemctl restart mysql

# 或(根据系统不同)
sudo service mysql restart

# 检查服务状态是否正常
sudo systemctl status mysql

④ 确认设置是否生效

重启后,检查MySQL是否按新的配置运行。

# 查看 MySQL 是否仅监听本机地址
sudo netstat -tlnp | grep mysql



# 预期输出示例:
# tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -

# 从进程信息中再次确认
sudo ps aux | grep mysql

如果结果显示 127.0.0.1:3306,说明配置已成功生效,数据库已处于不可从外部访问的安全状态。

如果出现问题该怎么办?

若在修改MySQL设置后,网站无法连接数据库,可按以下步骤排查。

  1. 检查设置文件语法:确认没有拼写错误或多余字符。
  2. 检查Web应用的数据库连接设置:确保连接地址为 localhost127.0.0.1
  3. 查看MySQL错误日志:了解具体错误信息。
# 查看 MySQL 错误日志
sudo tail -f /var/log/mysql/error.log 

在远程环境中连接数据库的正确方式

若需要从远程环境连接数据库,必须同时满足两点。“限制允许访问的固定IP地址(可信来源)”和“通过SSH(SSH隧道)进行连接”,这两者缺一不可。

如果未指定可信任的固定IP就直接开放SSH端口,将会带来新的安全风险。

① 在数据库服务器端指定固定IP

〇 适用于RHEL / AlmaLinux(使用firewalld)

# 仅允许来自“可信固定IP”的SSH连接
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="[你的固定IP]" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

# 确认当前设置
sudo firewall-cmd --list-all

〇 适用于Ubuntu(使用 UFW)

# 仅允许来自“可信固定IP”的SSH连接
sudo ufw allow from [你的固定IP] to any port 22
sudo ufw deny 22
sudo ufw reload#

② 强化SSH设置

sudo nano /etc/ssh/sshd_config

在文件中进行以下修改或添加。

# 禁用密码认证,只允许密钥认证
PasswordAuthentication no

# 限制特定用户仅从指定固定IP登录
AllowUsers username@[你的固定IP]

# 禁止root用户登录
PermitRootLogin no

修改完成后,重启SSH服务以应用更改。

sudo systemctl restart sshd

③ 建立SSH隧道

在完成固定IP限制后,可以通过SSH隧道安全连接数据库。

通过SSH隧道,所有通信均被加密,MySQL的3306端口无需对外开放,从而保障数据库安全。

sh -L 3306:localhost:3306 [你的用户名]@[服务器IP或域名等]

总结

データベースを直接外部のインターネット上に晒すことは、「鍵のかかっていない金庫を路上に置いている」ようなものです。将数据库直接暴露在互联网上,就像把“没锁的金库放在大街上”。

为了避免事后后悔,请尽快确认以下三点。

〇 检查3306端口是否对外开放
〇 若已对外开放,立即修正设置
〇 养成定期进行安全检查的习惯

 

网站制作、服务器搭建 — 服务咨询

 

联系我们

  • ▼ 公司微信公众号(公司官方)▼

  • ▼ 直接联系负责人微信号 ▼

咨询/联系我们

CONTACT

咨询/联系我们

扫码关注微信公众号