docker 映射端口穿透内置防火墙
一、问题现象
1、现象举例:
# 自制的springboot项目的dockerfile
# springboot 其实就是一个简单的hello-world程序,写了一个HelloController 做测试
# dockerfile内容:
FROM java:8
MAINTAINER shan <test@qq2363581677@163.com>
ADD ./demo.jar /demo.jar
EXPOSE 8848
CMD java -jar /demo.jar
# 构建镜像
docker build -f ./dockerfile -t demo .
# 创建、映射端口、运行容器
docker run -d --name=demo -p 8838:8848 demo
在阿里云服务器上外置的防火墙或安全组放行端口 8838 后,在浏览器发现可以直接访问到数据
----问题在于咱还没有开启内置的防火墙firewalld,却出现了端口可以直接被访问的情况
2、使用centos7 的防火墙firewalld查看放行端口情况


使用 docker 来部署项目,发现直接使用 -p 映射端口,会出现问题:
导致docker直接透过系统本机的防火墙,不用开端口可以直接外网访问 8838 端口。
二、问题原因
1、docker无视防火墙firewalld 的原因:其实docker并不是绕过了防火墙,只是因为它往iptables里写了规则,你在firewalld里看不到而已。(centos7系统既有iptables,也有firewalld)
在docker安装完后,会接管iptables,只要你docker run的时候加入参数,他会自动向iptables里面添加规则。所以使用 -p 容器端口:主机端口,最终会在iptables中添加上容器的端口。
防火墙 iptables 和 firewalld 的关系
Iptables:是centos6自带的防火墙工具,对服务器自身、网络通信流量进行控制,用于过滤数据包,属于网络层防火墙。
FirewallD:是centos7自带的防火墙工具,但是也同样支持iptables。能够允许哪些服务可用,哪些端口可用,属于更高一层的防火墙。
iptables 与 firewalld 都不是真正的防火墙, 它们都只是用来定义防火墙策略的防火墙管理工具。
● 对于 centos7 系统既有iptables,也有firewalld
2、使用 iptables的命令可以查看到docker 容器的端口
iptables -L DOCKER

三、问题的解决
1、依靠阿里云服务器提供的外置防火墙(推荐)
有的服务器叫防火墙,有的服务器叫安全组,都是一个东西,都是系统的外置防火墙。
防火墙就像一个门,想象一下你的钱藏到你的房间,这时候有一个小偷想要来偷你的钱,小偷需要先溜进你家大门【外置防火墙(安全组/防火墙)】,然后再溜进你的房间【内置防火墙(iptables/firewalld)】。
解决方式1:依靠阿里云服务器提供的外置防火墙放行需要暴露给外界的端口
- 相当于关闭了你家大门
虽然内置防火墙和外置防火墙一起使用更加安全,但是影响了数据访问的效率了,为了速度,有时候确保安全即可,不用更加安全。
购买了腾讯云服务的老铁要注意一下:
配置安全组的时候,不要选择放行所有端口,要选择自定义,然后放行80、443、ping、ssh端口(ssh端口建议进行修改,不使用默认的22)
2、端口映射时指定监听地址为本机
对于那些只需要在本地访问,不需要向外暴露端口的服务,在进行端口映射的时候指定监听地址为127.0.0.1。
# 创建、映射端口、运行容器
docker run -d --name=demo -p 127.0.0.1:8838:8848 demo
- 这时候,外界(通过浏览器)就无法访问了到8838 端口了,即使在外置防火墙放行了端口。
3、禁用 docker 的 iptables 规则
- 原因就是docker 在iptables 加入规则,才导致内置防火墙放行了docker容器的端口,现在咱就根治它,在docker配置文件禁止修改iptables 规则。
① docker 配置修改,禁止 iptables 规则
# 编辑/lib/systemd/system/docker.service文件
# 在ExecStart后添加 --iptables=false
② 重载 docker 配置 & 重启 docker 服务
systemctl daemon-reload
systemctl restart docker
完成上述两步以及可以采用系统 firewall 控制端口访问,但会出现 docker 容器间无法访问,而且容器内也无法访问外部网络。
③ 使用类似 NAT 网络方式使得 docker 可以访问外部网络
firewall-cmd --permanent --zone=public --add-masquerade
- 使用该方法解决 docker 无视系统防火墙问题所带来的缺点:容器内无法获取得到客户端的真实 IP,由于是类似 NAT 网络,常常 nginx 日志上记录的是 docker0 网络的子网 IP,对于一些业务无法获取真实 IP 可能不能容忍,看个人的取舍吧。
4、使用 expose 方式暴露端口,然后采用 nginx 代理转发(推荐)
(1) 使用dockerCompose 编排+nginx代理转发
① dockerCompose 中编排内容:
version: "3"
services:
app:
image: app
container_name: app
build: ..
expose:
- "8888"
depends_on:
- mysql
- redis
nginx:
image: nginx
container_name: nginx
ports:
- 80:80
- 443:443
volumes:
- /mnt/docker/nginx/:/etc/nginx/
links:
- app
depends_on:
- app
② nginx 中的配置:
upstream appstream{
server app:8888; #dockerCompose编排之后,app服务名相当于域名,可以通过app找到对应的ip地址
}
server{
listen 80;
server_name blog.yilele.site;
location /api {
proxy_pass http://appstream;#nginx代理转发
}
}
(2) 上面例子的demo容器(使用dockerfile)+ nginx
server{
listen 80;
server_name blog.yilele.site;
location /hello {# 启动docker的demo容器后,可以通过命令:docker inspect demo 找到demo对应的ip地址
proxy_pass http://demo的ip地址:8888; # nginx代理转发
}
}
ports 和 expose 区别:
ports: 暴露容器端口到主机的任意端口或指定端口。不管是否指定主机端口,使用ports都会将端口暴露给主机和其他容器。
- "9000:8080" # 绑定容器的8080端口到主机的9000端口
- "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
expose: 暴露容器给
link到当前容器的容器。即暴露给处于同一个networks的容器。搭配link 进行使用。expose:
- "8000"
参考文章:《docker无视防火墙问题总结》 https://icharle.com/dockeriptables.html
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
docker 映射端口穿透内置防火墙的更多相关文章
- docker映射端口与ssh访问或容器访问
映射端口 -d 后台执行 -p映射端口 --privileged 可以使用systemctl # docker run --privileged -d -p 9000:80 jiqing9006/ce ...
- frp端口映射穿透内网
前言 frp 是一个高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务,支持 TCP.UDP.HTTP.HTTPS 等协议类型,并且 web 服务支持根据域名进行路由转发. Github: ...
- SSH 端口转发+内网穿透
用最直白的语言对本文所有内容进行定义: 端口转发(-L):用A机器(内网)登录B机器(公网), 在A机器打开端口,将收到的所有请求转发到B机器的某个端口 (在代理机上执行) 内网穿透(-R):用A机器 ...
- 虚拟机运行docker后映射端口到windows开发机
1.运行容器(以Oracle-xe-11g为例) 运行容器时先在虚拟机内映射端口 docker run -d -p 9090:8080 -p 1521:1521 wnameless/oracle-xe ...
- Docker基础-端口映射与容器互联
1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...
- [转帖]Windows 内置端口转发功能
如何在Windows中使用netsh命令进行端口转发 https://www.freebuf.com/articles/system/176889.html 早上自己做了下实验,的确可以.linux下 ...
- 80端口被屏蔽解决方法,80端口穿透之NAT端口映射技术
介绍一种NAT端口映射技术应用,达到80端口穿透目的,解决80端口被屏蔽的问题,也是80端口被屏蔽解决方法中经常用到的. 80端口穿透类似80端口转发,因为80端口被屏蔽,在数据层面来说是不能直接访问 ...
- docker容器添加对外映射端口
一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [contain ...
- Docker 更改容器映射端口
1.编辑容器的配置文件进行更改端口: docker run 运行启动时 -p 可以指定容器启动映射端口 ( ) 可以编辑配置文件 进行修改:(需要重启docker 服务 不止是是容器 才能生效.只能重 ...
随机推荐
- python基础练习题(题目 使用lambda来创建匿名函数。)
day34 --------------------------------------------------------------- 实例049:lambda 题目 使用lambda来创建匿名函 ...
- Windows10 office 点击链接提示您的组策略阻止我们为您完成此操作。设置ChromeHTML也无效.
问题: win10环境点击office 中的网络链接时 出现了如下报错(一般在卸载了系统预装的其他浏览器后出现问题) 解决方案: 1.设置默认浏览器(已经设置可跳过) 控制面板->设置小图标 ...
- VS Code 真的会一统江湖吗?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 作者 | ROBEN KLEENE / 策划 | 万佳原文链接:https://blog.ro ...
- 一文带你读懂什么是docker
一 简介 1.了解Docker的前生LXC LXC为Linux Container的简写.一种轻量级的内核虚拟化技术,隔离进程和资源. Linux Container有点像chroot,提供了一个拥有 ...
- 干货 | 手把手教你搭建一套OpenStack云平台
1 前言 今天我们为一位朋友搭建一套OpenStack云平台. 我们使用Kolla部署stein版本的OpenStack云平台. kolla是用于自动化部署OpenStack的一个项目,它基于dock ...
- IIS发布Https和Https的问题
asp.net调试页面的时候遇到一个问题,我喜欢右键点击在浏览器查看页面,打开的页面默认是https的,其实iis会同时生成http和https两种页面,但是我懒得每次去点.问题是页面中测试接口是ht ...
- Spring Security之简单举例
核心功能 Spring Security提供了三个核心的功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) 一个简单例子 默认情况 在前面的开发中,都是将spring securit ...
- 137_Power BI 自定义矩阵复刻Beyondsoft Calendar
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前两天我们用PBI原生的视觉制作了自定义的热力图,今天我们来复刻一个Beyondsoft Calendar 1. ...
- 面试官:BIO、NIO、AIO是什么,他们有什么区别?
哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,感觉上次的公司氛围不 ...
- Mac下最好用的SSH连接客户端 (Termius)
Termius是微软的一款SSH终端工具,它支持多平台.而且操作界面十分ha好看且简洁,今天分享给大家️ 软件下载 关注下方公众号,回复termius获取下载地址 软件功能介绍 Termius M ...