背景

以前服务器都是直接配置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配置相关推荐

  1. docker 安装redis 挂载到宿主机

    1.首先去redis获取对应版本的配置文件redis.conf:  http://download.redis.io/releases/ 我选择的是 6.0.9 解压以后 有一个redis.conf ...

  2. docker 修改服务器,docker-修改容器挂载目录的3种方法小结

    本文关键详细介绍了docker-修改容器初始化目录的3种方式总结,具备非常好的实用价值,期待对大伙儿有一定的协助.一起追随我回来瞧瞧吧 方法一:修改配置文件(需停止docker服务) 1.停止dock ...

  3. java 获取docker ip_docker容器内部获取宿主机ip地址方法以及报错解决

    1,在docker容器内执行以下python代码或根据需要插入到你的.py文件中: import paramiko #通过pip3 install paramiko 安装 s = paramiko.S ...

  4. docker修改服务器参数怎么办,Docker(32)- 如何修改 docker 容器的启动参数

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! 前言 有时候创建容器时忘了添加 --restart 参数,导致 Docker 服务重启后,容器不会自动启动,每次都需要手动启动,很不方便 ...

  5. linux开启docker mysql_Linux服务器利用Docker快速搭建MySQL数据库

    首先你要有一台Linux服务器 利用Xshell远程软件连接后就可以开始安装docker容器了. 1.第一步在Linux服务器上安装docker 2.第二步利用Docker拉取mysql镜像 Cent ...

  6. Apache修改服务器监听端口,练习 - 04 - 配置 Apache 服务器的监听端口

    提供 Web 服务的 Apache 服务器,可以通过 httpd.conf 这个文件来设置,httpd 是 Apache 的一个主程序,你也可以把它当成就是 Apache 服务器.有时候 Apache ...

  7. docker php composer 使用_宿主机nginx与docker的PHP搭配使用

    php中文网最新课程 每日17点准时技术干货分享 主要差异在于本地nginx配置 因为php-fpm的服务由docker提供, 那么就修改nginx中PHP相关的内容. 注意: 在docker中php ...

  8. docker 修改服务器时间同步,解决Docker容器时区及时间不同步问题的方法

    今天在系统集成测试时由测试人员提交了一个测试bug,原因是提交业务数据时间与实际时间(北京时间)有偏差,导致统计异常.由于我们集成测试是向测试人员直接提供完整的Docker镜像作为测试环境,原因应该是 ...

  9. 服务器防火墙,linux下iptables防火墙配置相关

    iptables防火墙 iptables常用命令 iptables配置文件`/etc/sysconfig/iptables` iptables服务命令 -- 启动服务 -- 停止服务 -- 重启服务 ...

  10. docker修改php.ini,docker部署更改php的upload_max_filesize

    第一步.创建一个uploads.ini文件,内容(设置上床文件上限为64M) file_uploads = On memory_limit = 64M upload_max_filesize = 64 ...

最新文章

  1. UI自动化之读取浏览器配置
  2. Algorand的共识协议及其核心的优势
  3. nc个人实战使用总结
  4. java接口的作用是什么?
  5. Community找不到Workspace按钮的处理方法
  6. docker hub mysql主从_使用 Docker Compose 搭建 MySQL 数据库主从复制实例
  7. RobotLegs框架解析
  8. 非极大值抑制法(NMS,non-maximum suppression)
  9. 128G SSD固态卡死,主控SM2258xt,颗粒PFG29-6量产开卡教程+软件
  10. HTML页面显示时间——网页数字时钟、钟表
  11. linux stubs 32.h,解决 error: gnu/stubs-32.h: No such file or directory
  12. dvb s2标准下载_ETSI EN 302 307-1
  13. 麦当劳和肯德鸡的笑话
  14. Phaser3之 load
  15. Java 动手写爬虫: 三、爬取队列
  16. 摄影师的“伟大”!分享一组高大上的“照骗”的前期与后期
  17. 不用找,你想要的游戏成套3d模型素材都在这里
  18. 如何用计算机打520,520,各专业是如何表白的?
  19. SpaceX火箭数据 API 开源,支持 Python
  20. STM8L低功耗调试总结

热门文章

  1. android虚拟应用沙箱,Android的SandBox(沙箱)
  2. 用Python3对QQ导出的文本聊天记录进行整理。
  3. 深入了解触摸事件的分发
  4. 最优化理论与方法学习笔记01——黄金分割法与进退法求单峰区间Matlab编程实现
  5. 怎么更换照片背景颜色
  6. 浏览器下载文件的方法总结
  7. html超链接位置居中,html 标题 超链接 居中 换行 图片 新标签页
  8. 群晖套件中心没有docker_群晖中通过docker安装huginn
  9. 澳洲计算机设计专业大学排名,澳洲设计专业大学排名TOP5
  10. autojs识别二维码