代理:代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有助于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代理、反向代理及透明代理。
正向代理:正向代理是客户端向代理服务器发送请求,代理服务器再将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。正向代理的主要作用是隐藏客户端的真实IP地址,保护客户端的隐私,同时也可以加速访问速度,减轻目标服务器的负载压力。正向代理常用于翻墙、科学上网等场景。
反向代理:反向代理是客户端向目标服务器发送请求,但是请求会先经过代理服务器,代理服务器会根据请求的内容和规则将请求转发给目标服务器,然后将目标服务器的响应返回给客户端。反向代理的主要作用是隐藏目标服务器的真实IP地址,保护服务器的安全,同时也可以实现负载均衡、缓存加速等功能。反向代理常用于网站、应用服务器等场景。
正向代理是代理服务器代表客户端访问目标服务器,反向代理是代理服务器代表目标服务器接收客户端的请求。两者的使用场景和功能不同,需要根据具体情况选择合适的代理方式。
透明代理服务器
目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
反向代理(七层)
一、配置反向代理
nginx反向代理功能由ngx_http_proxy_module模块提供
location / {
proxy_pass http://192.168.10.12;
}
以上配置将所有的访问请求代理到后端服务器 http://192.168.10.12 上
当我们配置好反向代理后,使用客户端访问代理服务器,将能获取后端真实服务器的内容
二、真实IP
1. 配置代理服务器将客户端 IP 传递给后端服务器
查看后端服务器的访问日志,我们发现日志中记录的客户端 IP 并非真实客户端的 IP,而是代理服务器的 IP 。
之所以会这样,原因是客户端向代理服务器发起请求后,再由代理服务器向后端服务器发起请求。
站在后端服务器的角度,代理服务器才是直接通信的“客户端”,所以记录的是代理服务器的 IP,显然,记录这个 IP 是没有意义的。
由于后端服务器和客户端并没有直接的通信,所以客户端的真实 IP 只能通过代理服务器传递给后端服务器。
我们可以在代理服务器上将客户端的 IP 封装到请求报文中发送给后端服务器。
示例:
在代理服务器上配置:
location / {
proxy_pass http://webs;
proxy_set_header X-Real-IP $remote_addr; # 将 $remote_addr 的值封装到请求报文头部的 X-Real-IP 字段中 proxy_set_header 定义请求头
}
做了以上配置后,再次用客户端访问代理服务器,在后端服务器上抓包,可以看到请求头部有了 X-Real-IP 字段,它的值正是客户端真实 IP
2. 配置后端 web 服务器记录下客户端真实 IP
虽然经过以上第1步配置,代理能够将客户端真实 IP 传递过来了,但默认情况下后端服务器并不会在日志中记录请求头部 X-Real-IP 字段的值。
2-1、后端服务器为 apache 产品
对于 apache 产品,只需修改配置文件中的 LogFormat 即可:
LogFormat "%{X-Real-ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2-2、后端为 nginx
如果后端为nginx,有两种方法可实现:
A、直接修改 log_format ,将 $remote_addr 改为 $http_x_real_ip 即可
B、安装 real_ip 模块(ngx_http_realip_module),然后修改配置文件:
...
location / {
root html;
index index.html index.htm;
set_real_ip_from 代理服务器IP;
real_ip_header X-Real-IP;
}
...
这样配置后,$remote_addr 的值将会从请求报文中的 X-Real-IP 字段中获取。