docker修改服务器防火墙,docker宿主机iptables配置

背景

以前服务器都是直接配置LNMP环境,最近手头正好有一台需要重新配置,想尝试使用docker来配置多PHP版本环境。docker配置十分顺利,感谢有明大佬的小册,和DNMP项目。

待解决

服务器配置好后,在几天的试用过程中,发现如下两个问题:

NGINX PHP容器中无法获取request的真实IP

PHP容器中无法访问公网

过程

无法访问公网,无法获取真实IP,首先想到了防火墙的问题;关闭iptables,问题解决。可是iptables不能关呀,虽说现在云服务器都有安全组过滤,但防火墙是最后一道防线,不能在云厂商的怀抱里裸奔啊……

查看了docker的网络部分,docker暴露容器端口是由docker-proxy来实现的,至于docker-proxy是什么略过不表。肯定是iptables影响了docker-proxy导致数据包的源ip发生了改变,无法获取真实IP;无法访问公网,则是数据包找不到出口,被iptables拦截掉了,在内网转圈圈

既然docker的各容器处于内网中,于是我想到了iptables的转发功能。

解决

假设我的公网IP为 117.25.140.71

NGINX容器内网IP为 172.18.0.2

PHP容器内网IP为 172.18.0.3 172.19.0.3

把公网来的数据包直接转发给NGINX容器,跳过docker-proxy

添加如下规则

-A PREROUTING -d 117.25.140.71 -p tcp -m tcp --dport 80 -j DNAT -

你可能感兴趣的:(docker修改服务器防火墙)