kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

发表于 2021-11-21 更新于 2021-11-25
本文字数: 2.5k 阅读时长 ≈ 2 分钟

linux安装nginx

  1. 安装nginx所需的依赖
1
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
  1. 在/usr/local/下创建nginx目录

  2. https://nginx.org/download/下载tar.gz包,并解压tar -zxvf xxxx.tar.gz

  3. 配置./configure –prefix=/usr/local/nginx

  4. 执行make && make install

  5. 切换到/usr/local/nginx/sbin,执行nginx -t

如果出现以下,则说明安装成功。

1
2
3
[root@ming sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx//conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx//conf/nginx.conf test is successful
  1. 运行nginx,执行./nginx

如果出现以下界面,说明安装成功。

image-安装成功

  1. 如果打不开,检查防火墙是不是没开放80端口。
1
2
3
4
5
firewall-cmd --query-port=80/tcp
# 开放端口,-permanent 表示永久生效,没有此参数重启后失效
firewall-cmd --add-port=80/tcp --permanent
#重启防火墙
systemctl restart firewalld
  1. 配置nginx开机自启动
1
vi /etc/rc.d/rc.local

添加以下内容

1
2
# nginx开机自启动
/usr/local/nginx/sbin/nginx

获取真实IP

remote_addr: 记录的是上一级代理的IP,如果只有一层代理,上一层是客户端,即remote_addr就是客户端的真实ip地址。remote_addr不会被篡改,因为如果被篡改了,TCP三次握手连接都不会成功。

x_real_ip: 字面意思上看是真实ip,多层代理都可以设置,但会覆盖上一级代理的值。如果nginx中配置了proxy_set_header X_Real_IP $remote_addr,则x_real_ip记录的是上一级代理的ip。

例如,存在以下的多层代理:client(10.160.10.1) -> proxy1(10.160.10.70) -> proxy2(10.160.10.71) -> 云服务器()
假设在proxy1和proxy2中都设置了proxy_set_header X_Real_IP $remote_addr,那么到了云服务器那层的日志获取到的X_Real_IP就是上一层代理proxy2的ip:10.160.10.71

X_Forwarder_For: 记录请求的路由顺序,会把每一层代理的X_Forwarder_For都连接起来,用逗号分隔开。

例如上面的代理,如果proxy1和proxy2都设置了proxy_set_header X_Forwarder_For $proxy_add_x_̲forwarded_for,那么到了云服务器那层的日志获取到的X_Forwarder_For:10.160.10.1 -> 10.160.10.70 ,不会包含proxy2的ip地址,proxy2的地址可以通过remote_addr来获取。

如果nginx中设置的是proxy_set_header X_Forwarder_For $remote_addr,则经过每一层代理,X_Forwarder_For都不会被追加,而是被上一层的remote_addr覆盖了。

一般来说,X_Forwarder_For的第一个IP就是客户端的真实IP地址,但是X_Forwarder_For是可以伪造的。比如在第一层代理proxy1之前使用curl添加X_Forwarder_For:1.1.1.1,这样proxy1记录X_Forwarder_For的时候,记录的值是1.1.1.1,10.160.10.82. 实际上第二个IP才是客户端真正的IP地址。

为了防止伪造X_Forwarder_For,可以配置覆盖X_Forwarder_For而不是追加,但是要根据具体的场景分析:

1
2
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

如果只有一层代理的情况,以上的配置就可以直接通过X_Forwarder_For直接获取客户端真实的IP地址。即使有人伪造X_Forwarded_For|X_Real_IP请求头,也会被强制替换成remote_addr.
如果只有一层代理,X_Real_IP与X_Forwarder_For是等效的。

小结:
1.如果部署的服务没有任何的代理,后端只能通过remote_addr获取IP地址,不要相信任何的请求头,因为请求头可以伪造。
2.如果部署的服务有经过代理,在代理配置正确的前提下,可以通过X_Forwarder_For记录的第一个IP来获取客户端真实的IP地址,但是需要校验是否符合IP的格式,因为伪造的请求头可以是任何形式。如果只有一层代理,也可以使用X_Real_IP来获取客户端真实的IP地址,而且在只有一层代理的情况下,X_Real_IP不会被伪造的请求头替换,因为会被强制替换成remote_addr.
同时,使用了代理之后,应该禁止外部直接连到后端服务器,因为直接连到后端服务器没有经过代理服务器,是没有X_Forwarder_For和X_Real_IP的请求头的。

参考X_Forwarder_For

springboot关于获取真实IP的配置

配置remote-ip-header导致X_Forwarded_For丢失
Nginx + Tomat获取客户端真实IP
Nginx根据IP匹配不同的URL

一毛也是爱~
Kim.Zhang 微信支付

微信支付

  • 文章目录
  • 站点概览
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
  1. 1. linux安装nginx
  2. 2. 获取真实IP
  3. 3. springboot关于获取真实IP的配置
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%