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