Skip to content

MySQL 网络与防火墙设置

网络配置基础

MySQL 网络架构

  • 客户端-服务器架构:MySQL 采用典型的客户端-服务器架构
  • TCP/IP 协议:默认使用 TCP/IP 协议进行通信
  • 端口配置:默认监听 3306 端口(MySQL 协议)和 33060 端口(MySQL X 协议,MySQL 8.0+)
  • 绑定地址:默认绑定到所有网络接口(0.0.0.0)

MySQL 网络相关文件

  • 配置文件my.cnfmy.ini,包含网络相关配置
  • PID 文件:记录 MySQL 进程 ID
  • 套接字文件:本地连接使用的 Unix 套接字或 Windows 命名管道
    • Unix/Linux:默认 /var/lib/mysql/mysql.sock
    • Windows:默认 \\.\pipe\MySQL

基本网络配置

绑定地址配置

  • 配置说明:指定 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)

  • 查看防火墙状态

    bash
    systemctl status firewalld
  • 启动并启用防火墙

    bash
    systemctl 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
  • 查看已开放的端口

    bash
    firewall-cmd --list-ports

iptables 配置(传统 Linux 系统)

  • 查看当前规则

    bash
    iptables -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 防火墙配置

图形界面配置

  1. 打开「Windows Defender 防火墙」
  2. 点击「高级设置」
  3. 选择「入站规则」→「新建规则」
  4. 选择「端口」→「TCP」
  5. 输入端口号(3306,33060)
  6. 选择「允许连接」
  7. 选择适用的网络类型
  8. 命名规则并完成

命令行配置

  • 开放 3306 端口

    powershell
    netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306
  • 开放 33060 端口

    powershell
    netsh advfirewall firewall add rule name="MySQL 33060" dir=in action=allow protocol=TCP localport=33060
  • 查看规则

    powershell
    netsh 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 测试端口

    bash
    telnet 192.168.1.100 3306
  • 使用 nc 测试端口

    bash
    nc -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:防止未经授权的文件访问

    ini
    local-infile = 0
  • 禁用符号链接:防止路径遍历攻击

    ini
    skip-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 服务未启动
    • 防火墙阻止了连接
    • 绑定地址配置错误
    • 端口配置错误
    • 用户权限问题
  • 排查步骤

    1. 检查 MySQL 服务是否运行
    2. 检查防火墙规则
    3. 检查绑定地址和端口配置
    4. 检查用户权限
    5. 使用 telnet 或 nc 测试端口连通性

连接超时

  • 可能原因

    • 网络延迟过高
    • 服务器负载过高
    • 连接超时配置过短
    • 防火墙规则配置错误
  • 排查步骤

    1. 检查网络延迟
    2. 检查服务器负载
    3. 调整连接超时配置
    4. 检查防火墙规则
    5. 检查 MySQL 连接队列

连接数过多

  • 可能原因

    • 应用程序未正确关闭连接
    • 连接池配置不合理
    • 业务量突增
    • 连接泄漏
  • 排查步骤

    1. 查看当前连接数
    2. 分析连接来源和用途
    3. 检查应用程序连接管理
    4. 调整连接池配置
    5. 考虑增加服务器资源或优化查询

云环境网络配置

云服务器网络配置

  • 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 远程访问需要:

  1. 配置 MySQL 绑定到合适的网络接口
  2. 在防火墙中开放 MySQL 端口
  3. 创建具有远程访问权限的用户并授予适当权限

Q4: 如何启用 MySQL SSL/TLS 加密?

A4: 启用 MySQL SSL/TLS 加密需要:

  1. 生成或获取 SSL 证书
  2. 在 MySQL 配置文件中配置 SSL 相关参数
  3. 重启 MySQL 服务
  4. 配置客户端使用 SSL 连接

Q5: 如何排查 MySQL 连接问题?

A5: 排查 MySQL 连接问题的步骤:

  1. 检查 MySQL 服务是否运行
  2. 检查防火墙规则是否允许连接
  3. 检查 MySQL 绑定地址和端口配置
  4. 检查用户权限和认证信息
  5. 使用 telnet 或 nc 测试端口连通性
  6. 查看 MySQL 错误日志

Q6: 如何优化 MySQL 网络性能?

A6: 优化 MySQL 网络性能的方法:

  1. 调整操作系统 TCP 参数
  2. 优化 MySQL 网络相关配置
  3. 使用连接池管理数据库连接
  4. 启用 SSL/TLS 时优化加密配置
  5. 考虑使用更快的网络硬件(如 10Gbps 网卡)

Q7: 如何限制 MySQL 只允许特定 IP 访问?

A7: 限制 MySQL 只允许特定 IP 访问的方法:

  1. 在防火墙中配置规则,只允许特定 IP 访问 MySQL 端口
  2. 在创建 MySQL 用户时指定允许访问的 IP 地址
  3. 配置 MySQL 绑定到特定网络接口

Q8: MySQL 8.0 网络配置有哪些新特性?

A8: MySQL 8.0 网络配置新特性:

  1. 支持绑定到多个 IP 地址
  2. 默认使用更安全的 caching_sha2_password 认证插件
  3. 新增 MySQL X 协议,使用 33060 端口
  4. 增强了 SSL/TLS 支持,支持 TLS 1.3
  5. 优化了高并发连接性能

Q9: 如何查看 MySQL 当前连接数?

A9: 查看 MySQL 当前连接数的方法:

  1. 使用 SHOW PROCESSLIST; 命令查看详细连接信息
  2. 使用 SHOW GLOBAL STATUS LIKE 'Threads_connected'; 查看当前连接数
  3. 使用 SHOW GLOBAL STATUS LIKE 'Connections'; 查看总连接数

Q10: 如何配置 MySQL 连接池?

A10: 配置 MySQL 连接池需要:

  1. 选择合适的连接池实现
  2. 根据服务器资源和业务需求调整连接池参数
  3. 配置连接超时、空闲超时等参数
  4. 监控连接池使用情况,及时调整配置

Q11: 如何安全地配置 MySQL 远程访问?

A11: 安全配置 MySQL 远程访问的方法:

  1. 使用强密码
  2. 限制允许访问的 IP 地址
  3. 授予最小必要权限
  4. 启用 SSL/TLS 加密
  5. 定期审计和清理用户权限
  6. 考虑使用 VPN 或 SSH 隧道访问

Q12: 如何处理 MySQL 连接数过多的问题?

A12: 处理 MySQL 连接数过多的问题:

  1. 检查应用程序是否正确关闭连接
  2. 调整连接池配置,优化连接管理
  3. 增加 MySQL 最大连接数配置
  4. 优化查询,减少连接占用时间
  5. 考虑分库分表,分散连接压力
  6. 升级服务器硬件,提高处理能力