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 --to-destination 172.18.0.2:80
-A PREROUTING -d 117.25.140.71 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.18.0.2:443
复制代码
重启iptables 无法获取真实IP问题解决
将内网的数据包转发到公网
我的PHP容器访问公网,需求大抵是发送短信之类(无邮件发送),用的都是http协议,所以这里我没有选择全部转发,而是只转发目的端口为80和443的数据包
添加如下规则
-A POSTROUTING -s 172.19.0.3 -p tcp -m tcp --dport 80 -j SNAT --to 117.25.140.71
-A POSTROUTING -s 172.19.0.3 -p tcp -m tcp --dport 443 -j SNAT --to 117.25.140.71
复制代码
重启iptables发现仍然无法访问公网,是不是落下了什么。。
对了,既然http协议访问其他域名提供的api服务,怎么能少了DNS解析呢?添加DNS的支持(注意:DNS解析使用的是udp协议)
补充如下规则
-A POSTROUTING -s 172.19.0.3 -p udp -m udp --dport 53 -j SNAT --to 117.25.140.71
复制代码
重启iptables,大功告成!
最后总结几点:
之所以能用宿主机iptables实现转发,是因为宿主机是内网的网关
我限制了PHP容器访问公网的目的端口,如果需要发送邮件或者访问8080等其他端口,仍需单独添加规则或者不限制具体端口号
转发内网数据包到公网,不要使用地址伪装(MASQUERADE),否则会影响本文中添加的PREROUTING规则,仍然无法获取request的真实IP(使用其他方法除外)
如果直接service iptables stop,这篇文章就不用看了。。。
##2020.3.31更新
docker19.03版本解决了这个问题,不再需要自己手动配置啦
docker修改服务器防火墙,docker宿主机iptables配置相关推荐
- docker 安装redis 挂载到宿主机
1.首先去redis获取对应版本的配置文件redis.conf: http://download.redis.io/releases/ 我选择的是 6.0.9 解压以后 有一个redis.conf ...
- docker 修改服务器,docker-修改容器挂载目录的3种方法小结
本文关键详细介绍了docker-修改容器初始化目录的3种方式总结,具备非常好的实用价值,期待对大伙儿有一定的协助.一起追随我回来瞧瞧吧 方法一:修改配置文件(需停止docker服务) 1.停止dock ...
- java 获取docker ip_docker容器内部获取宿主机ip地址方法以及报错解决
1,在docker容器内执行以下python代码或根据需要插入到你的.py文件中: import paramiko #通过pip3 install paramiko 安装 s = paramiko.S ...
- docker修改服务器参数怎么办,Docker(32)- 如何修改 docker 容器的启动参数
如果你还想从头学起 Docker,可以看看这个系列的文章哦! 前言 有时候创建容器时忘了添加 --restart 参数,导致 Docker 服务重启后,容器不会自动启动,每次都需要手动启动,很不方便 ...
- linux开启docker mysql_Linux服务器利用Docker快速搭建MySQL数据库
首先你要有一台Linux服务器 利用Xshell远程软件连接后就可以开始安装docker容器了. 1.第一步在Linux服务器上安装docker 2.第二步利用Docker拉取mysql镜像 Cent ...
- Apache修改服务器监听端口,练习 - 04 - 配置 Apache 服务器的监听端口
提供 Web 服务的 Apache 服务器,可以通过 httpd.conf 这个文件来设置,httpd 是 Apache 的一个主程序,你也可以把它当成就是 Apache 服务器.有时候 Apache ...
- docker php composer 使用_宿主机nginx与docker的PHP搭配使用
php中文网最新课程 每日17点准时技术干货分享 主要差异在于本地nginx配置 因为php-fpm的服务由docker提供, 那么就修改nginx中PHP相关的内容. 注意: 在docker中php ...
- docker 修改服务器时间同步,解决Docker容器时区及时间不同步问题的方法
今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是 ...
- 服务器防火墙,linux下iptables防火墙配置相关
iptables防火墙 iptables常用命令 iptables配置文件`/etc/sysconfig/iptables` iptables服务命令 -- 启动服务 -- 停止服务 -- 重启服务 ...
- docker修改php.ini,docker部署更改php的upload_max_filesize
第一步.创建一个uploads.ini文件,内容(设置上床文件上限为64M) file_uploads = On memory_limit = 64M upload_max_filesize = 64 ...
最新文章
- UI自动化之读取浏览器配置
- Algorand的共识协议及其核心的优势
- nc个人实战使用总结
- java接口的作用是什么?
- Community找不到Workspace按钮的处理方法
- docker hub mysql主从_使用 Docker Compose 搭建 MySQL 数据库主从复制实例
- RobotLegs框架解析
- 非极大值抑制法(NMS,non-maximum suppression)
- 128G SSD固态卡死,主控SM2258xt,颗粒PFG29-6量产开卡教程+软件
- HTML页面显示时间——网页数字时钟、钟表
- linux stubs 32.h,解决 error: gnu/stubs-32.h: No such file or directory
- dvb s2标准下载_ETSI EN 302 307-1
- 麦当劳和肯德鸡的笑话
- Phaser3之 load
- Java 动手写爬虫: 三、爬取队列
- 摄影师的“伟大”!分享一组高大上的“照骗”的前期与后期
- 不用找,你想要的游戏成套3d模型素材都在这里
- 如何用计算机打520,520,各专业是如何表白的?
- SpaceX火箭数据 API 开源,支持 Python
- STM8L低功耗调试总结