2

反向代理如何传递客户端 IP

 1 year ago
source link: https://vpsxb.net/3980/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

反向代理如何传递客户端 IP

> 网络资源 > 反向代理如何传递客户端 IP
202206191902179.png

先解释两个概念:正向代理、反向代理。

正向代理是为了隐藏客户端身份,一个正向代理一般服务于一个或多个客户端,代表客户端去访问各种互联网上的服务,比如 Tor、比如科学上网时候用到的那个啥。相对应,反向代理就是为了隐藏服务端身份,方便做一些负载均衡、认证、加密、缓存、传输内容压缩的工作。

反向代理在服务领域应用得非常广泛,部署应用时如果不放一个反向代理,出门都不好意思和别人打招呼。反向代理一般工作在 OSI 模型的4层或者7层,工作在4层时可以基于 ip、端口进行流量转发,工作在7层时可以基于 4-7层的内容进行转发。

由于反向代理至少工作在4层,在流量经过反向代理后,3、4层的客户端信息会丢失,而其中一些信息对于服务端来说又具有切实的用途,比如 IP,可以根据 IP 来进行访问请求的地理分布统计以支持营销决策、或者安排就近的 CDN 服务以优化服务体验、或者进行访问的白名单控制、或者为了支持监管要求——比如最近知乎、微信上线的显示 IP 归属地功能。有时候确实不得不违反分层原则,某些功能就是横切整个分层结构的。

那如何保留 IP 等客户端信息?对应反向代理工作的位置,也有两种方式。

1、当反向代理工作在4层时,可以通过 Proxy Protocol 来实现,主要是在 tcp 三次握手结束后插入一个携带原始连接信息的包,协议细节不赘述。

以 Nginx 为例,发送端需要启用配置 proxy_protocol。

stream {
  server {
    listen 192.168.1.100:80;
    proxy_protocol on;
    proxy_pass 192.168.2.1:80;
  }
}

接收端需要声明接收 proxy protocol。

http {
  server {
    listen 192.168.2.100:80 proxy_protocol;
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.2.0/24;
  }

  location / {
    proxy_pass http://backend:8080;
    proxy_set_header X-Forwarded-For $proxy_protocol_addr;
  }
}

Nginx 还有一种方式是把自己的 IP 地址伪装为客户端 IP,再和后端建立 Socket 连接。但是要求 worker 进程以特权账号运行,以修改当前系统里的 IP 表和路由表。不提倡这种做法。

user root;
stream {
  server {
    listen 192.168.1.1:1234;
    proxy_bind $remote_addr transparent;
    proxy_pass 192.168.2.1:1234;
  }
}

以 Haproxy 为例,若要接收,则在 frontend 上配置 accept-proxy;若要发送,则在 backend 上配置 send-proxy。

frontend myweb
  bind :80 accept-proxy
  default_backend othersweb

backend othersweb
  balance roundrobin
  server s1 192.168.56.20:3000 check send-proxy

2、当反向代理工作在7层时,可以通过 Http 协议扩展头 X-Forwarded-* 头部或 Forwarded 头部来实现。

X-Forwarded-For: <client>, <proxy1>, <proxy2>
X-Forwarded-Proto: <protocol>
X-Forwarded-Host: <host>

Nginx 配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以 X- 开头的头部通常为实验性质的扩展头部,当成功普及以后,就成为了事实上的标准,反而不好替换,对其进行标准化后的头部为 Forwarded。

Forwarded: by=<identifier>; for=<identifier>; host=<host>; proto=<http|https>

Nginx 没有内置变量支持 $proxy_add_forwarded,需要自行创建

proxy_set_header Forwarded $proxy_add_forwarded;

tcp-udp-load-balancing-nginx-tips-tricks

nginx-forwarded

haproxy-enable-proxy-protocol


https://www.chenqing.work/?p=2839


VPS小白 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK