在docker中运行第三方服务时,通常需要绑定服务端口到本地主机。但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的,所以我们需要对iptables进行手动修改。

这里以从名为centos.19.09.05的image建立一个容器为例:

首先,如果系统是CentOS7的话,需要关闭自带firewalld防火墙,并切换为iptables.

假设需要将新容器的27017端口映射到主机的27017端口,一般情况下我们使用命令

docker run -idt -p : centos.19.09.05 /bin/bash

在容器中27017端口服务运行起来后,我们在外网使用端口扫描工具,发现本地主机的27017端口已经打开了,而我们还未在防火墙上进行开放操作;此时检查iptabes规则:

iptables --list

发现在Chain DOCKER下多出了一条

Chain DOCKER ( references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:

其中172.17.0.2为该容器在docker网桥中的IP,可见该规则允许任意来源的地址访问27017端口,所以我们需要删除该规则,并替换成安全性更高的规则。

#删除DOCKER链中的1号规则;如果待删除规则不位于第一行,则将数字改为对应行号
iptables -D DOCKER #此容器只接受来自地址123.345.456.567的连接请求
iptables -A DOCKER -s 123.345.456.567 -d 172.17.0.2 -p tcp --sport -j ACCEPT

再次进行端口扫描,发现27017端口已经关闭,只有IP为123.234.345.456的主机能够连接。


还有一种更简单的方式。因为docker绕过防火墙的原理是修改了iptables,那不让它修改即可,此方法无需切换默认防火墙。

按照https://blog.csdn.net/qadzhangc/article/details/96140703 所述设置即可,经试验不可省略步骤,否则可能造成容器无法连接外网。

vim /etc/default/docker

#修改文件,此处设置等同于在创建容器时手动指定iptables=false参数
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -iptables=false"
vim /etc/docker/daemon.json
{
"iptables": false
}
#此处对更改设置之前创建的容器也有效,编辑后需重启docker服务

对ufw的设置主要是为容器建立起转发,如果容器内的服务不需要访问外网,不做也可以。

firewalld的操作与ufw有些不同

#ubuntu(ufw)操作为
vim /etc/default/ufw DEFAULT_FORWARD_POLICY="ACCEPT" #对应centos(firewalld)上操作为:
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct -i eth0 -j ACCEPT #eth0为宿主机网卡名
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD_direct -o eth0 -j ACCEPT
firewall-cmd --reload
ubuntu(ufw):
vim /etc/ufw/before.rules 在`*filter`前面添加下面内容
*nat
:POSTROUTING ACCEPT [:]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/ -j MASQUERADE
COMMIT centos(firewalld):
firewall-cmd --zone=public --add-masquerade #默认docker0在public zone里
firewall-cmd --reload

解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题的更多相关文章

  1. 解决docker容器中Centos7系统的中文乱码

    解决docker容器中Centos7系统的中文乱码问题有如下两种方案: 第一种只能临时解决中文乱码: 在命令行中执行如下命令: # localedef -i zh_CN -f UTF-8 zh_CN. ...

  2. 解决docker容器的窗口大小问题

    解决docker容器的窗口大小问题 最近哥们在是使用docker时,发现有些容器内部窗口大小有问题. 如下午所示,vi窗口只占据左上角一部分.正常情况下vi应该铺满整个窗口才对呀. 所以哥们找到了解决 ...

  3. 解决docker容器启动时候无法映射端口的问题

    当我们停止防火墙后,docker容器启动映射端口可能无法映射端口,这个时候需要重建docker0网桥. 详细的错误是这样的: docker: Error response from daemon: d ...

  4. docker容器添加对外映射端口

    一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [contain ...

  5. Docker配置tomcat端口映射后无法访问(404)

    1.配置tomcat端口映射 2.访问测试 3.修改webapps文件,webapps.dist是所需文件 4.虚拟机中重新访问 5.在主机也能访问成功(注意路径为虚拟机IP,不是localhost)

  6. [转]解决Docker容器时间与主机不一致问题

    原文: https://blog.csdn.net/luckystar689/article/details/76572046 https://stackoverflow.com/questions/ ...

  7. 解决docker容器中文乱码,修改docker容器编码格式

    前台上传文件到服务器后,服务器返回给前台的文件列表中出现中文乱码,所有的中文文件名全部变成?,英文文件名则正常显示. 问题经过定位,发现后台代码的multipartfile类在执行transterto ...

  8. centos:解决docker容器内挂载目录无权限 ls: cannot open directory .: Permission denied

    docker运行一个容器后,将主机中当前目录下的文件夹挂载到容器的文件夹后 进入到docker容器内对应的挂载目录中,运行命令ls后提示: ls: cannot open directory .: P ...

  9. Docker(34)- 如何修改 docker 容器的目录映射

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 问题背景 docker run ...

随机推荐

  1. [译] NAT - 网络地址转换(2016)

    [译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...

  2. git 命令常用笔记

    1. 全局操作 git --version //git 机器上是否存在 git init --bare project.git //服务端:初始化一个新的仓库 chown -R zhangsan:zh ...

  3. cocos2dx图片加密解密(npk方式)

    话不多说,直接开始: 准备的工具: 链接:https://pan.baidu.com/s/1Om4kBNWcG2jL_RTsHqqzpQ 提取码:bv7i npkCreate.exe是加密图片的工具, ...

  4. 开发工具之GIT

    GIT WORKFLOW this readme created on 2019.07.28 by Suarez7988 这是一遍介绍git版本控制流程的中文说明,必须通篇阅读一下 https://g ...

  5. window环境下zookeeper的安装(自用---仅供参考)

    转自: https://www.cnblogs.com/ysw-go/p/11396343.html 第一部分:单机模式 1)下载地址:http://www.pirbot.com/mirrors/ap ...

  6. jquery(第一章)认识jquery

    Jquery对象就是通过JQuery包装DOM对象后产生的对象,在JQuery对象中无法使用DOM对象的任何方法. 1.4.2 JQuery对象的和DOM对象的互相转换 若获取的对象是JQuery对象 ...

  7. linux报错Loading mirror speeds from cached hostfile解决方法

    首先本人当时也是遇到这个问题,首先配置了虚拟机的 yum,移步这篇博客https://www.cnblogs.com/xuzhaoyang/p/11239096.html 然后在进行了如下操作 首先还 ...

  8. nginx+uwsgi02---django部署(推荐)

    参考  https://blog.csdn.net/weixin_39198406/article/details/79277580 https://www.cnblogs.com/alex3714/ ...

  9. Oracle 11.2.0.4_Linux单例篇

    Linux 下安装Oracle步骤: 1.设置ip地址  2.设置主机名 3.安装oracle依赖的软件包 mkdir /media/cdrom -p mount /dev/cdrom  /media ...

  10. LeetCode 第 167 场周赛

    1290.二进制链表转整数 1291.顺次数 1292.元素和小于等于阈值的正方形的最大边长 1293.网格中的最短路径 1290.二进制链表转整数 1290.二进制链表转整数 给你一个单链表的引用结 ...