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了。