外观
MySQL 网络与防火墙设置
网络配置基础
MySQL 网络架构
- 客户端-服务器架构:MySQL 采用典型的客户端-服务器架构
- TCP/IP 协议:默认使用 TCP/IP 协议进行通信
- 端口配置:默认监听 3306 端口(MySQL 协议)和 33060 端口(MySQL X 协议,MySQL 8.0+)
- 绑定地址:默认绑定到所有网络接口(0.0.0.0)
MySQL 网络相关文件
- 配置文件:
my.cnf或my.ini,包含网络相关配置 - PID 文件:记录 MySQL 进程 ID
- 套接字文件:本地连接使用的 Unix 套接字或 Windows 命名管道
- Unix/Linux:默认
/var/lib/mysql/mysql.sock - Windows:默认
\\.\pipe\MySQL
- Unix/Linux:默认
基本网络配置
绑定地址配置
- 配置说明:指定 MySQL 服务器监听的网络接口
- 安全建议:生产环境中应绑定到特定 IP 地址,而非所有接口
- 配置示例:ini
# 绑定到特定 IP 地址 bind-address = 192.168.1.100 # 绑定到多个 IP 地址(MySQL 8.0+ 支持) bind-address = 192.168.1.100,10.0.0.100 # 仅允许本地连接 bind-address = 127.0.0.1
端口配置
- 默认端口:
- MySQL 协议:3306
- MySQL X 协议(MySQL 8.0+):33060
- 端口修改建议:生产环境中可考虑修改默认端口,增加安全性
- 配置示例:ini
# 修改 MySQL 协议端口 port = 3307 # 修改 MySQL X 协议端口(MySQL 8.0+) mysqlx-port = 33061
连接数限制
- 配置说明:限制 MySQL 服务器允许的最大并发连接数
- 配置建议:根据服务器资源和业务需求调整
- 配置示例:ini
# 设置最大连接数 max_connections = 1000 # 设置每个用户的最大连接数 max_user_connections = 100
连接超时配置
- 配置说明:设置连接相关的超时时间
- 配置示例:ini
# 服务器关闭非活动连接之前等待的秒数 wait_timeout = 28800 # 服务器关闭交互式连接之前等待的秒数 interactive_timeout = 28800 # 连接握手超时时间 connect_timeout = 10
防火墙设置
防火墙基础知识
- 防火墙类型:
- 硬件防火墙:独立的物理设备
- 软件防火墙:运行在服务器上的软件(如 iptables、firewalld、Windows 防火墙)
- 防火墙规则:基于源 IP、目标 IP、端口、协议等条件允许或拒绝流量
- 最小权限原则:只开放必要的端口和服务
Linux 防火墙配置
firewalld 配置(RHEL/CentOS 7+、Fedora)
查看防火墙状态:
bashsystemctl status firewalld启动并启用防火墙:
bashsystemctl start firewalld systemctl enable firewalld开放 MySQL 端口:
bash# 开放 MySQL 3306 端口 firewall-cmd --permanent --add-port=3306/tcp # 开放 MySQL X 协议 33060 端口(MySQL 8.0+) firewall-cmd --permanent --add-port=33060/tcp # 重新加载防火墙规则 firewall-cmd --reload允许特定 IP 访问:
bash# 允许 192.168.1.0/24 网段访问 3306 端口 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' firewall-cmd --reload查看已开放的端口:
bashfirewall-cmd --list-ports
iptables 配置(传统 Linux 系统)
查看当前规则:
bashiptables -L -n开放 MySQL 端口:
bash# 开放 3306 端口 iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # 开放 33060 端口(MySQL 8.0+) iptables -A INPUT -p tcp --dport 33060 -j ACCEPT # 保存规则 # RHEL/CentOS service iptables save # Debian/Ubuntu iptables-save > /etc/iptables/rules.v4允许特定 IP 访问:
bash# 允许 192.168.1.100 访问 3306 端口 iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPT # 允许 10.0.0.0/24 网段访问 3306 端口 iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT
Windows 防火墙配置
图形界面配置
- 打开「Windows Defender 防火墙」
- 点击「高级设置」
- 选择「入站规则」→「新建规则」
- 选择「端口」→「TCP」
- 输入端口号(3306,33060)
- 选择「允许连接」
- 选择适用的网络类型
- 命名规则并完成
命令行配置
开放 3306 端口:
powershellnetsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306开放 33060 端口:
powershellnetsh advfirewall firewall add rule name="MySQL 33060" dir=in action=allow protocol=TCP localport=33060查看规则:
powershellnetsh advfirewall firewall show rule name=all
SSL/TLS 配置
SSL/TLS 基础知识
- 作用:加密 MySQL 客户端与服务器之间的通信,防止数据泄露和篡改
- 支持版本:MySQL 5.7.11+ 默认启用 SSL/TLS,MySQL 8.0+ 增强了 SSL/TLS 支持
- 证书类型:
- 自签名证书:适合测试环境
- 第三方 CA 证书:适合生产环境
生成 SSL/TLS 证书
使用 MySQL 自带工具生成
生成命令:
bash# MySQL 5.7+ mysql_ssl_rsa_setup --datadir=/var/lib/mysql/ssl # MySQL 8.0+ mysql_ssl_rsa_setup --datadir=/var/lib/mysql/ssl --uid=mysql生成的文件:
ca.pem:CA 证书ca-key.pem:CA 私钥server-cert.pem:服务器证书server-key.pem:服务器私钥client-cert.pem:客户端证书client-key.pem:客户端私钥public_key.pem:公钥private_key.pem:私钥
配置 SSL/TLS
服务器端配置:
ini# 启用 SSL ssl-ca=/var/lib/mysql/ssl/ca.pem ssl-cert=/var/lib/mysql/ssl/server-cert.pem ssl-key=/var/lib/mysql/ssl/server-key.pem # 要求客户端使用 SSL(可选) require_secure_transport=ON客户端配置:
ini# 客户端 SSL 配置 [client] ssl-ca=/var/lib/mysql/ssl/ca.pem ssl-cert=/var/lib/mysql/ssl/client-cert.pem ssl-key=/var/lib/mysql/ssl/client-key.pem
验证 SSL 连接
服务器端验证:
sql-- 查看 SSL 配置 SHOW VARIABLES LIKE '%ssl%'; -- 查看当前连接是否使用 SSL SHOW STATUS LIKE 'Ssl_cipher';客户端验证:
bash# 使用 SSL 连接 mysql -u root -p --ssl-mode=REQUIRED # 查看连接状态 \s
网络优化
TCP/IP 协议优化
- 操作系统 TCP 参数调整:bash
# 增加 TCP 连接跟踪表大小 echo 'net.nf_conntrack_max = 65536' >> /etc/sysctl.conf # 增加本地端口范围 echo 'net.ipv4.ip_local_port_range = 1024 65535' >> /etc/sysctl.conf # 启用 TIME-WAIT 快速回收 echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf # 调整 TCP 缓冲区大小 echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf echo 'net.ipv4.tcp_rmem = 4096 87380 16777216' >> /etc/sysctl.conf echo 'net.ipv4.tcp_wmem = 4096 65536 16777216' >> /etc/sysctl.conf # 启用 BBR 拥塞控制算法 echo 'net.ipv4.tcp_congestion_control = bbr' >> /etc/sysctl.conf # 应用配置 sysctl -p
MySQL 网络参数优化
- 配置示例:ini
# 网络缓冲区大小 net_buffer_length = 16K # 最大允许的数据包大小 max_allowed_packet = 64M # 读取缓冲区大小 read_buffer_size = 256K # 随机读取缓冲区大小 read_rnd_buffer_size = 512K # 写入缓冲区大小 write_buffer_size = 256K # 排序缓冲区大小 sort_buffer_size = 512K # 连接队列大小 back_log = 50
连接池配置
- 作用:管理数据库连接,减少连接建立和关闭的开销
- 常用连接池:
- Java:HikariCP、Druid、c3p0
- Python:SQLAlchemy、mysql-connector-python 连接池
- PHP:PDO 连接池、mysqli 连接池
- 连接池配置建议:
- 最大连接数:根据服务器资源和业务需求调整
- 最小空闲连接数:保持一定数量的空闲连接
- 连接超时时间:避免连接长时间占用
- 空闲超时时间:及时回收空闲连接
远程访问配置
授权远程访问
- 创建远程用户:sql
-- 创建允许从任何主机访问的用户 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'password'; -- 创建允许从特定 IP 访问的用户 CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'password'; -- 授予权限 GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 刷新权限 FLUSH PRIVILEGES;
测试远程连接
使用 MySQL 客户端:
bash# 从远程主机连接 mysql -h 192.168.1.100 -u remote_user -p使用 telnet 测试端口:
bashtelnet 192.168.1.100 3306使用 nc 测试端口:
bashnc -zv 192.168.1.100 3306
网络安全加固
基本安全措施
- 修改默认端口:减少端口扫描攻击
- 限制绑定地址:只绑定到必要的网络接口
- 启用 SSL/TLS:加密客户端-服务器通信
- 使用强密码:为 MySQL 用户设置强密码
- 限制用户访问:根据最小权限原则授予权限
- 定期审计权限:定期检查和清理不必要的用户和权限
IP 访问控制
- 使用防火墙限制 IP:只允许特定 IP 或网段访问 MySQL 端口
- 使用 MySQL 内置 IP 限制:在创建用户时指定允许访问的 IP
- 使用代理服务器:通过代理服务器访问 MySQL,增加一层安全防护
连接加密
强制使用 SSL/TLS:
ini# 在 my.cnf 中配置 require_secure_transport=ON为用户设置 SSL 要求:
sql-- 要求用户使用 SSL ALTER USER 'secure_user'@'%' REQUIRE SSL; -- 要求用户使用特定的 SSL 选项 ALTER USER 'secure_user'@'%' REQUIRE X509;
禁用不必要的网络功能
禁用 LOCAL INFILE:防止未经授权的文件访问
inilocal-infile = 0禁用符号链接:防止路径遍历攻击
iniskip-symbolic-links = 1
不同 MySQL 版本的网络设置差异
MySQL 5.5/5.6
- SSL 支持:默认禁用,需要手动配置
- 绑定地址:只支持绑定到单个 IP 地址
- 连接数限制:最大连接数默认为 151
- 认证插件:默认使用
mysql_native_password - 性能:对高并发连接支持有限
MySQL 5.7
- SSL 支持:默认启用,生成自签名证书
- 绑定地址:只支持绑定到单个 IP 地址
- 连接数限制:最大连接数默认为 151
- 认证插件:默认使用
mysql_native_password,但支持sha256_password - 性能:增强了高并发连接支持
- 安全性:增强了密码验证和权限管理
MySQL 8.0
- SSL 支持:默认启用,增强了 SSL/TLS 支持
- 绑定地址:支持绑定到多个 IP 地址
- 连接数限制:最大连接数默认为 151,但可调整到更高
- 认证插件:默认使用
caching_sha2_password,增强了安全性 - MySQL X 协议:新增 33060 端口,支持 X 协议
- 性能:进一步优化了高并发连接支持
- 安全性:增强了密码验证、权限管理和审计功能
- TLS 版本:支持 TLS 1.3
网络监控与故障排查
网络监控工具
MySQL 内置命令:
sql-- 查看当前连接 SHOW PROCESSLIST; -- 查看连接统计 SHOW GLOBAL STATUS LIKE 'Threads_%'; SHOW GLOBAL STATUS LIKE 'Connections'; -- 查看网络相关状态 SHOW GLOBAL STATUS LIKE '%net%';系统监控工具:
netstat/ss:查看网络连接和端口监听tcpdump/wireshark:网络数据包分析iptraf/iftop:网络流量监控mytop:MySQL 实时监控
常见网络问题排查
连接被拒绝
可能原因:
- MySQL 服务未启动
- 防火墙阻止了连接
- 绑定地址配置错误
- 端口配置错误
- 用户权限问题
排查步骤:
- 检查 MySQL 服务是否运行
- 检查防火墙规则
- 检查绑定地址和端口配置
- 检查用户权限
- 使用 telnet 或 nc 测试端口连通性
连接超时
可能原因:
- 网络延迟过高
- 服务器负载过高
- 连接超时配置过短
- 防火墙规则配置错误
排查步骤:
- 检查网络延迟
- 检查服务器负载
- 调整连接超时配置
- 检查防火墙规则
- 检查 MySQL 连接队列
连接数过多
可能原因:
- 应用程序未正确关闭连接
- 连接池配置不合理
- 业务量突增
- 连接泄漏
排查步骤:
- 查看当前连接数
- 分析连接来源和用途
- 检查应用程序连接管理
- 调整连接池配置
- 考虑增加服务器资源或优化查询
云环境网络配置
云服务器网络配置
VPC 配置:
- 创建专用 VPC 网络
- 配置子网和路由表
- 设置网络 ACL 规则
安全组配置:
- 创建专用安全组
- 只允许必要的端口和 IP 访问
- 配置入站和出站规则
弹性 IP:
- 为 MySQL 服务器分配弹性 IP
- 配置 DNS 解析
容器环境网络配置
Docker 网络:
- 使用桥接网络或自定义网络
- 配置端口映射
- 使用 Docker Compose 管理网络
Kubernetes 网络:
- 使用 ClusterIP 服务内部访问
- 使用 NodePort 或 LoadBalancer 服务外部访问
- 配置网络策略限制 Pod 间通信
常见问题(FAQ)
Q1: MySQL 默认端口是多少?
A1: MySQL 默认使用 3306 端口(MySQL 协议),MySQL 8.0+ 还使用 33060 端口(MySQL X 协议)。
Q2: 如何修改 MySQL 监听端口?
A2: 在 MySQL 配置文件(my.cnf 或 my.ini)中修改 port 参数,然后重启 MySQL 服务。
Q3: 如何允许 MySQL 远程访问?
A3: 允许 MySQL 远程访问需要:
- 配置 MySQL 绑定到合适的网络接口
- 在防火墙中开放 MySQL 端口
- 创建具有远程访问权限的用户并授予适当权限
Q4: 如何启用 MySQL SSL/TLS 加密?
A4: 启用 MySQL SSL/TLS 加密需要:
- 生成或获取 SSL 证书
- 在 MySQL 配置文件中配置 SSL 相关参数
- 重启 MySQL 服务
- 配置客户端使用 SSL 连接
Q5: 如何排查 MySQL 连接问题?
A5: 排查 MySQL 连接问题的步骤:
- 检查 MySQL 服务是否运行
- 检查防火墙规则是否允许连接
- 检查 MySQL 绑定地址和端口配置
- 检查用户权限和认证信息
- 使用 telnet 或 nc 测试端口连通性
- 查看 MySQL 错误日志
Q6: 如何优化 MySQL 网络性能?
A6: 优化 MySQL 网络性能的方法:
- 调整操作系统 TCP 参数
- 优化 MySQL 网络相关配置
- 使用连接池管理数据库连接
- 启用 SSL/TLS 时优化加密配置
- 考虑使用更快的网络硬件(如 10Gbps 网卡)
Q7: 如何限制 MySQL 只允许特定 IP 访问?
A7: 限制 MySQL 只允许特定 IP 访问的方法:
- 在防火墙中配置规则,只允许特定 IP 访问 MySQL 端口
- 在创建 MySQL 用户时指定允许访问的 IP 地址
- 配置 MySQL 绑定到特定网络接口
Q8: MySQL 8.0 网络配置有哪些新特性?
A8: MySQL 8.0 网络配置新特性:
- 支持绑定到多个 IP 地址
- 默认使用更安全的
caching_sha2_password认证插件 - 新增 MySQL X 协议,使用 33060 端口
- 增强了 SSL/TLS 支持,支持 TLS 1.3
- 优化了高并发连接性能
Q9: 如何查看 MySQL 当前连接数?
A9: 查看 MySQL 当前连接数的方法:
- 使用
SHOW PROCESSLIST;命令查看详细连接信息 - 使用
SHOW GLOBAL STATUS LIKE 'Threads_connected';查看当前连接数 - 使用
SHOW GLOBAL STATUS LIKE 'Connections';查看总连接数
Q10: 如何配置 MySQL 连接池?
A10: 配置 MySQL 连接池需要:
- 选择合适的连接池实现
- 根据服务器资源和业务需求调整连接池参数
- 配置连接超时、空闲超时等参数
- 监控连接池使用情况,及时调整配置
Q11: 如何安全地配置 MySQL 远程访问?
A11: 安全配置 MySQL 远程访问的方法:
- 使用强密码
- 限制允许访问的 IP 地址
- 授予最小必要权限
- 启用 SSL/TLS 加密
- 定期审计和清理用户权限
- 考虑使用 VPN 或 SSH 隧道访问
Q12: 如何处理 MySQL 连接数过多的问题?
A12: 处理 MySQL 连接数过多的问题:
- 检查应用程序是否正确关闭连接
- 调整连接池配置,优化连接管理
- 增加 MySQL 最大连接数配置
- 优化查询,减少连接占用时间
- 考虑分库分表,分散连接压力
- 升级服务器硬件,提高处理能力
