00:00
那好,同学们,接下来我们看一下如何在我们的这个上游服务器当中获得到呃,真正的用户的IP地址呢,其实这个呃办法呢有很多啊,现在呢,我们给大家介绍最简单的一种就是通过header,在HTP协议当中呢,有很多有用的header,然后额外呢,还有一个扩展的header,它并不在HTTP1.1的协议当中,也就是这个X forwardd。这个header。我们可以把呃,客户端的IP地址写到这个hier当中,在我们的上游服务器呢,再去读取这个header,然后就能得到呃用户的IP地址,那原理其实很简单,嗯。在这儿我们看一下。因为这是我的,呃,客户机啊,它有两个IP地址,不管是用哪个,它访问到的都是真正的这个客户机的IP地址,对吧?那就取决于它究竟是通过哪个网卡和我们这个反向代理服务器进行的连接,那当请求到我们反向代理服务器的时候呢,其实它能够把真正的IP地址传递过去的,是吧,也就是在反向代理服务器这个环节,它是能够和真正的用户去建立连接,然后他在和上游服务器去建立连接。
01:10
然后在这个过程当中呢,可以在我们的反向代理服务器当中,在传递请求的时候,在header里边额外加上。这么一个配置,就是这个X。啊,For这么一个header,那我们的呃上游服务器再去读取客户机的IP地址的时候呢,你就不要再去读呃它的这个remote a DR了,这个remote a DR。Remote address啊,这个remote ad drr,这相当于物理连接,就pcp连接的时候啊,真正建立连接的这个IP地址,这个IP地址是无法改变和伪造的,也就是我的tomcat和mcat相连的呢,就是这个NGS,这个remote ad DR,它一定是这个NG这台机器啊,他的IP地址,也就是你在通过remote a DR是无论如何也拿不到我们上这个这个呃,客户端的这个IP地址的,因为客户端并没有和我们的上游服务器建立连接,对吧。
02:13
啊,那我们可以通过这种remote a DR在反应代理服务器上获取到这个。真实的这个呃,用户的IP地址,因为他们两个是物理上真正连接的,然后把这个remote a DR呢,给它写到set到这个X for的啊,这个header里,然后后端的或者上游服务器呢,我们通过读取这X for的for。这个header,呃,来去读取,呃,客户端的IP地址相当于NG,虽然说我和你建立的物理连接还是我的IP地址,但是呢,我在header里边额外再给你写上一个客户机的IP地址。啊,原理就是这样,那我们带着大家来简单的配一下。啊,在这呢,我们这反应袋里呢,已经配好了,对吧,在啊tomcad那边呢,我们去读取一下这个啊,这个X forwarded for这么一个header,也就是在。
03:09
这啊,最后的这个IP地址,它并不是这remote a drl了啊,而是这个hier里边个呃一个这个呃一个属性在这是request get header,大家看。然后我们在这呢,需要配置一下这个header,注意这是在反应代理服务器上配置的啊。配置的语法啊,这跟这个一样啊proceed。这个名字呢,就已经不太一样了。啊,额外的,我们直接给它粘过来。啊,这是header的名称,然后这边是header的值啊,一个key,一个value啊,这边是remote a DR。啊,A d drr,这是和N这物理连接连接的TCP的这个真正的地址啊。
04:04
然后我们配置好,然后CTRLS保存,接下来呢,我们嗯。再重启一下N几,然后再看看。这个请求大,这是44.601对吧。这个我们先不变啊,然后我们再新开一个窗口,这样可以比较走。大家看这个IP address,这就是44.1了,这就是我们的客户机了,然后如果你要在tomcat里再去读这remote的话,这还是44.101,也就是我们这个反应代理服务器的IP地址对吧?啊,所以在这不能读这remote a dl了,而是读这IP address。那在这呢,还有另外的一些引发的问题,虽然说我们现在已经把这个。呃,IP地址呢,通过这个X的for啊,给给它给读出来了,我们可以去考思考一下,那通过这么去读这IP地址的话,他有没有可能会被伪造,也就是去伪造这个头部信息。
05:04
对吧,像有一些工具像postman,我在这呢,就不带大家去演示了,比如说我们通过postman,然后去设置这个header啊,在请求的时候就去设置了一下这个header,那会不会呃,在上游服务器里边读到的这个IP地址,它是伪造的IP地址,大家可以想一下。那实际上它是不会的啊,为什么呢?因为我们在。呃,整个这个流程当中,虽然说你的客户端。啊,比如说我这客户端,我伪造了一个IP地址,呃,写到了这个header的这个,呃X for的for这个属性里,但是在N里。会重置。啊,这个hier以及真正的IP地址,因为这个remote ADR是无法伪造的,他们两个是一定是物理连接,这个大家能听明白吧?啊,即使你已经设置了一个假的header在这儿呢,也会把它给覆盖掉,重写进去。
06:04
这是第一个问题,呃,那么第二个问题呢,我们可以在这考虑一下啊,如果这个反应代理服务器,它已经不是一个NG了,也就在这个NG后边呢,还有一个反代理服务器。那这种情况呢,呃,也是可能会出现的,尤尤其是你的系统越做越大,比如做到了中大型项目,这会儿呢,我们可以看一下这个架构图。在这里边的NG的服务器啊,它已经不再是一个单一的这个简单的呃,反应代理服务器做集群负载均衡用的了,这里边可能会做一些逻辑啊,比如说做一些这个呃,一些健全啊,一些这个URL的重写啊等等等等,这些业务呢,已经包含在NG服务器里了,但是呢,NG它还有上游服务器,这种情况是比较常见的,尤其系统做的比较大的时候啊,你小系统是不可能有这个两层的,对吧?啊,唯一唯一的这个有可能的就是在前边呢。
07:01
它是一个LS,然后这边呢,是一个NG对吧?啊是这么一种情况,那这会儿我们想要在客户机获取到真实的呃,用户的这个IP地址的话,就可能就会出问题,你想。和我们这个真实的这个客户端相连的是。这台机器,这台机器它的remote a drr是和客户机真正相连的,对不对,他能拿到真正的客户机的IP地址啊,这是TCP连接嘛,对吧,然后把这个头给它写进去啊,加一个sx for word for,那如果在这呢,我还是继续在重用之前的这个方法。啊,再接在这个remote ad drr这这个属性都给它读出来,然后再写到头里,你想想这第二台机器和它相邻的,比如说我们把这IP改一下,这是2102,这台机器的remote a d drr是谁啊,它是101对不对?那你再给他写的X forwarded for里边,是不是就把原来这个真实客户机的IP地址给它给覆盖掉了,而不是这个真实的这个IP地址了,而是这个他的上级上级反应代理服务器了。
08:09
那我们的这个真正的这个上游服务器拿到的这个X for的属性是已经被重置过的,对不对。那真正被重置过了之后,再去读这个地址,它是第一级的分佣代理服务器了啊,就所以这样就拿不到真正的IP,真正的客户机的IP地址了,那怎么做。做法的最简单的处理方法啊,这也是我们通常会用的啊,就是在第二级反应代理服务器里呢,我不再去啊获取呃,这个remote a DR啊,直接把这个请求呢,给它转发到后盾就可以了啊,把这X的for给它给带回去,带到这个。这个这个真正的上游服务器就行了,如果你在这再去重新重置一下Mo a DR的话,那肯定就出了出了问题了嘛,对吧,这是第一种处理方式,这种方式呢比较简单,它第二种处理方式呢,它可以在X的for,在我这个第二级的反应代理服务器里边额外的再加一个,而不是覆盖掉。
09:07
啊,加一个它和它相连的remote a DR啊,也就是啊这个s for在第一级的反应代理服务器里。他能够得到的是。真正的客户机的IP地址。这IP1啊,这么写吧,IP1是真正的这个客户机的IP地址,然后在第二层的这个反应代理服务器里呢,我还可以再加一个IP2,这IP2呢,就是它的上游这这个不是是它的这个反应特力服务器,就是这个101啊,所以在最终端的,呃,或者说最上游的tomcat里边能得到的f for的IP地址呢,有两个。一个是,呃。这个反应代理服务器的44.101,还有一个就是真实的客户机的IP地址啊,这是多级的代理服务器里,我们我们就可以这么去设置,这是比较简单的,当然还有很多的这个,呃,第三方的工具。
10:03
啊,或者是第三方的这个,呃,这个这个扩展的这个module啊,也可以用啊,但最简单来说,我们一般来说就可以这么去做了,就可以了啊。
我来说两句