docker nginx获取客户端真实IP,nginx容器,php容器获取客户ip是172内网地址解决方法

docker容器虽然很方便,
但在使用中还是会遇到一些问题,
比如在nginx容器中获取到客户端的IP是172网段的内网地址,
而我们实际是想要得到用户的真实IP。

一、 nginx容器无法获得客户ip的现象

下面子恒老师讲一下具体的情况,
然后再讲nginx容器怎么得到客户真实IP地址,
网络结构如下:

在宿主机中启动了一个nginx容器和一个php容器,
nginx与宿主机使用 443 端口作映射,
当客户端访问php脚本时,
nginx会转发给上游的phh容器处理。

这里的nginx容器日志中,php容器获取到的客户IP,
都是172开头的IP地址。

二、 nginx容器获取用户真实IP思路

解决这个问题的关键是:把docker网桥加入到防火墙的internal区域

三、 nginx容器,php容器得到客户端IP操作

下面以centos7系统为例,
讲解下怎么实现docker容器获取用户实际IP

3.1 查询你docker容器中网桥名称

ifconfig
br-815da7XXXXXX: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:efff:XXXX:XXXX  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ef:XX:XX:XX  txqueuelen 0  (Ethernet)
        RX packets 1187  bytes 166115 (162.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1688  bytes 159136 (155.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

使用ifconfig命令,
类似br-815da7XXXXXX这就是docker容器的网桥名称

3.2 把网桥加入到防火墙的internal(内部)区域

firewall-cmd --permanent --zone=internal --change-interface=br-815da7XXXXXX

3.3 重启防火墙

systemctl firewalld

这样当用户再次访问你的nginx容器,php容器时,
就能获取到对方的真实IP了。

转载:https://www.qinziheng.com/nginx/8928.htm

 
posted @ 2020-04-07 21:20  liuxinyu123  阅读(4440)  评论(0编辑  收藏  举报