You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 13 PgAudit审计日志如何捕获客户端真实IP而非VPN IP

PostgreSQL PgAudit 捕获VPN接入客户端真实IP解决方案

PostgreSQL 原生的 %h(客户端主机名/IP)、%r(客户端主机+端口)参数仅能读取TCP连接层的源IP,VPN接入场景下该源IP为VPN网关地址,因此默认配置无法直接拿到客户端真实公网/内网IP,可通过以下方案实现:

方案1:VPN网关注入真实IP(推荐)

如果可以修改VPN网关配置,优先通过连接参数传递真实IP:

  • 配置VPN网关在转发PostgreSQL连接请求时,将客户端真实IP写入PostgreSQL连接的自定义会话变量,例如命名为session.client_real_ip,同时在pg_hba.conf中限制仅VPN网关IP有权限修改该变量,避免恶意伪造
  • 修改postgresql.conf的log_line_prefix配置,新增自定义变量的输出占位符:
log_line_prefix = '%t %a %u-%d-%h %[session.client_real_ip]'
  • 重载PostgreSQL配置生效,后续日志会同时输出VPN网关IP和客户端真实IP

方案2:VPN会话日志关联

如果无法修改VPN网关配置,可以打通VPN设备的会话日志和PostgreSQL审计日志做映射:

  • 导出VPN设备的会话映射表:客户端真实IP <-> 分配的VPN虚拟IP <-> 会话建立/断开时间戳
  • 通过VPN虚拟IP和连接时间戳两个维度,和PgAudit日志做关联匹配,即可对应到客户端真实IP

方案3:云RDS内置参数

如果使用云厂商托管的PostgreSQL实例,大部分厂商默认会将穿透VPN/代理的客户端真实IP写入内置会话变量,例如阿里云RDS的network.original_source_ip、AWS RDS的rds.client_real_ip,直接将对应变量加入log_line_prefix即可直接输出。

注意

如果既不能修改VPN网关配置,也无法获取VPN会话日志,PostgreSQL本身无法获取TCP层以外的客户端真实IP,不存在其他绕过限制的获取方案。


内容的提问来源于stack exchange,提问作者xxestter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:06:00