解决经由frp穿透后服务端无法获取客户端ip的办法

2024 年 8 月 2 日 星期五(已编辑)
/ ,
13
摘要
为解决防火墙拦截到违规请求记录服务器内网IP的问题,可以在相关proxies配置中增加transport.proxyProtocolVersion="v2"。另外,需要在对应的Nginx配置中增加相应配置,例如在nginx-ingress-controller的configmap中添加。这样可以使防火墙记录客户端真实公网IP。
这篇文章上次修改于 2024 年 8 月 2 日 星期五,可能部分内容已经不适用,如有疑问可询问作者。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

解决经由frp穿透后服务端无法获取客户端ip的办法

博主服务运行环境为k3s,流量经由阿里云的服务器的80,443端口通过frp穿透到家庭服务器k3s环境的30871和30166端口。由于搭建了safeline防火墙,当防火墙拦截到违规请求的时候会记录客户端的ip,但是显示的全部都是服务器内网ip。解决办法如下:

serverAddr = "<your server ip>"
serverPort = 7000
auth.token = "<your token>"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 8000


[[proxies]]
name = "80"
type = "tcp"
localIP = "127.0.0.1"
localPort = 30871
remotePort = 80
transport.proxyProtocolVersion = "v2"

[[proxies]]
name = "443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 30166
remotePort = 443
transport.proxyProtocolVersion = "v2"

[[proxies]]
name = "6443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6443
remotePort = 6443

在相关 proxies 的配置下方增加 transport.proxyProtocolVersion = "v2"

另外,对应的Nginx需要增加如下配置,以nginx-ingress为例:

allow-snippet-annotations: 'false'
compute-full-forwarded-for: 'true'
forwarded-for-header: X-Forwarded-For
plugins: safeline
use-forwarded-headers: 'true'
use-proxy-protocol: 'true'

该配置是 ingress-nginx-controllerconfigmap

至此,waf记录的ip为客户端的真实公网ip

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...