mysql 和 pg ip 白名单

前言,很重要

虽然mysql 和 pg都有 黑白名单的能力,但是服务器上依旧要严谨配置iptables、云服务器组等等吧,看环境

系列

https://blog.csdn.net/woaixuejinglzq/article/details/158892875?spm=1011.2124.3001.6209

mysql

  1. 仅允许特定 IP 访问

    假设你有一个用户 myuser,只想让它从 IP 地址 192.168.1.100 连接:

    sql 复制代码
    -- 如果用户不存在,创建用户并限定主机
    CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY '你的密码';
    
    -- 如果用户已存在(假设原来是 myuser@'%'),需要删除原来的并重建,或直接修改权限
    -- 先查看现有用户
    SELECT host, user FROM mysql.user WHERE user = 'myuser';
    -- 删除允许所有IP的旧记录(谨慎操作)
    DROP USER 'myuser'@'%';
    -- 新建限定IP的用户
    CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY '你的密码';
    
    -- 授予权限(例如授予所有权限)
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.100';
    FLUSH PRIVILEGES;
  2. 允许一个 IP 段(例如 192.168.1.0/24)访问

    MySQL 支持使用通配符:

    • %:匹配任意多个字符

    • _:匹配一个字符

    sql 复制代码
    -- 允许 192.168.1.0 - 192.168.1.255 整个网段
    CREATE USER 'myuser'@'192.168.1.%' IDENTIFIED BY '你的密码';
    GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.%';
    
    -- 也可以使用子网掩码格式(MySQL 8.0+ 支持)
    CREATE USER 'myuser'@'192.168.1.0/255.255.255.0' IDENTIFIED BY '你的密码';
  3. 允许本机访问

    sql 复制代码
    -- localhost 通常指通过 socket 连接
    CREATE USER 'myuser'@'localhost' IDENTIFIED BY '你的密码';
    -- 127.0.0.1 指通过 TCP/IP 回环地址连接
    CREATE USER 'myuser'@'127.0.0.1' IDENTIFIED BY '你的密码';
    复制代码

验证白名单:

sql 复制代码
-- 查看所有用户及其允许的 Host
SELECT host, user FROM mysql.user;

pg

改配置 /var/lib/postgresql/data/pg_hba.conf,注意,和上面引用文章的配置不是同一个

就类似这样改

sql 复制代码
# pg_hba.conf
local   all             all                                     trust

host    appdb    appuser    192.168.1.100/32  scram-sha-256
host    backup   backupuser 192.168.1.101/32  scram-sha-256
host    all      admin      10.0.0.0/24       cert
  • TYPE(第一列) : local - 只针对本地Unix域套接字连接(不是TCP/IP) host对应TCP/IP

  • DATABASE(第二列) : all - 匹配所有数据库

  • USER(第三列) : all - 匹配所有用户

  • address(第四列):如果是local,这一列是METHOND

  • METHOD(第五列) : trust - 无条件允许连接,无需密码

method常用值补充

password / md5 / scram-sha-256(密码认证)/ trust / reject

  • password: 明文密码传输(不安全)

  • md5: MD5加密密码(较安全,但已过时)

  • scram-sha-256: 最安全的密码认证方式(PostgreSQL 10+推荐)

perr

  • 仅用于local连接

  • 使用操作系统用户名进行认证

  • 要求PostgreSQL用户名与操作系统用户名一致

ident

  • 通过ident服务器获取客户端操作系统用户名

  • 通常与TCP wrappers配合使用

cert

  • 使用SSL客户端证书进行认证

  • 需要配置SSL

ldap / radius / pam(外部认证)

  • 通过LDAP、RADIUS或PAM进行认证

  • 适用于企业统一认证环境

sql 复制代码
host    all    all    192.168.1.0/24    ldap ldapserver=ldap.example.com

用到的小技巧

先备注一些基础的东西

第四列Address用的CIDR表示法,比如127.0.0.1/32 这是一个ipv4的写法

前面的127.0.0.1就代表ip了,/32则是表示子网掩码长度,也可以说是网络前缀位数

ipv4中,用32位二进制来表达一个ip然后每8位分割,

  • IPv4地址共32位(4个8位二进制数)

  • 127.0.0.1 的二进制:01111111.00000000.00000000.00000001

  • /32 意味着前32位是网络号 → 只有这一个地址

如果写成10.0.0.0/24 就代表10.0.0.0 - 10.0.0.255所有的ip,注意奥**10.0.0.0 10.0.0.255特殊的**,一般不会分配给设备

然后就是说正经技巧了

sql 复制代码
host    all    all    192.168.1.1/32    trust
host    all    all    192.168.1.2/31    trust  -- 2-3
host    all    all    192.168.1.4/30    trust  -- 4-7
host    all    all    192.168.1.8/29    trust  -- 8-15
host    all    all    192.168.1.16/28   trust  -- 16-31
host    all    all    192.168.1.32/27   trust  -- 32-63
host    all    all    192.168.1.64/26   trust  -- 64-127
host    all    all    192.168.1.128/25  trust  -- 128-255

这样就可以做到范围表达了,或者用reject来做

sql 复制代码
-- PostgreSQL按顺序匹配,第一个匹配的规则生效!
-- 所以这样的顺序不对:
host    all    all    192.168.1.0/24    trust    -- 这条会先匹配所有
host    all    all    192.168.1.0/32    reject   -- 永远不会执行

-- 正确的顺序(拒绝在前):
host    all    all    192.168.1.0/32    reject   -- 先拒绝 .0
host    all    all    192.168.1.0/24    trust    -- 再允许其他
相关推荐
数据知道2 小时前
MongoDB:如何将读请求分流到从节点,减轻主节点压力(读偏好)
数据库·mongodb
喵叔哟2 小时前
08-依赖注入与服务容器
数据库·oracle
’长谷深风‘2 小时前
从零开始学 SQLite:从基础命令到 C 语言编程实战
c语言·数据库·sqlite·软件编程
jackletter2 小时前
在pgsql中封装一个json函数,让它完全模拟mysql中的json_set
数据库·mysql·json·pgsql·json_set
冬夜戏雪2 小时前
【学习日记】
java·开发语言·数据库
邓草3 小时前
phpStudy v8.1 离线版一键安装包(小皮面板)
运维·服务器·mysql
LaughingZhu3 小时前
Product Hunt 每日热榜 | 2026-03-11
大数据·数据库·人工智能·经验分享·搜索引擎
2301_767902643 小时前
mysql语言
数据库·mysql·oracle
她说..3 小时前
Redis 中常用的操作方法
java·数据库·spring boot·redis·缓存