Docker 容器桥接模式禁用互联网(2023/12/14)

Docker 容器桥接模式禁用互联网

文章目录

  • Docker 容器桥接模式禁用互联网
    • 1. 环境
    • 2. 方案
      • 2.1 方案一
      • 2.2 方案二
      • 2.3 方案三
    • 3. 实现

最近在 Docker 容器中用到了一些第三方的闭源程序,考虑到隐私和安全问题决定将容器禁用外网,但该容器同时又需要访问宿主机及宿主机网段下的其它主机,所以最终决定将容器禁用互联网保留指定局域网,本文将详细介绍实现过程。

1. 环境

  • CentOS Linux release 7.9.2009 (Core);
  • Docker 23.0.1;

2. 方案

2.1 方案一

利用 docker network 的--internal参数限制 docker 网络外部访问,--internal参数官方解释如下:

$ docker network create --helpUsage:  docker network create [OPTIONS] NETWORKCreate a networkOptions:--attachable           Enable manual container attachment--aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])--config-from string   The network from which to copy the configuration--config-only          Create a configuration only network-d, --driver string        Driver to manage the Network (default "bridge")--gateway strings      IPv4 or IPv6 Gateway for the master subnet--ingress              Create swarm routing-mesh network--internal             Restrict external access to the network--ip-range strings     Allocate container ip from a sub-range--ipam-driver string   IP Address Management Driver (default "default")--ipam-opt map         Set IPAM driver specific options (default map[])--ipv6                 Enable IPv6 networking--label list           Set metadata on a network-o, --opt map              Set driver specific options (default map[])--scope string         Control the network's scope--subnet strings       Subnet in CIDR format that represents a network segment

Restrict external access to the network 即限制 docker 网络的外部访问,经过测试该方式可以隔离互联网,但同时隔离了宿主机的访问,故不满足需求。

2.2 方案二

利用 docker network 的驱动选项com.docker.network.bridge.enable_ip_masquerade禁用 docker 网络的 IP 伪装,官方解释如下:

OptionEquivalentDescription
com.docker.network.bridge.name-Bridge name to be used when creating the Linux bridge
com.docker.network.bridge.enable_ip_masquerade--ip-masqEnable IP masquerading
com.docker.network.bridge.enable_icc--iccEnable or Disable Inter Container Connectivity
com.docker.network.bridge.host_binding_ipv4--ipDefault IP when binding container ports
com.docker.network.driver.mtu--mtuSet the containers network MTU
com.docker.network.container_iface_prefix-Set a custom prefix for container interfaces

Enable IP masquerading 即是否开启 IP 伪装,使用方法如下:

docker network create --subnet 10.9.2.0/28 -o com.docker.network.bridge.enable_ip_masquerade=false my-test-network
# docker-compose.yml
version: "3.9"
services:
networks:test:driver: bridgedriver_opts:com.docker.network.bridge.enable_ip_masquerade: false

经过测试该方式可以隔离互联网的同时访问宿主机,但无法访问宿主机网段下的其它主机,故不满足需求。

2.3 方案三

通过修改容器内部的路由表实现禁止访问互联网及允许访问指定局域网,具体思路如下:

  1. 删除容器内部的默认网关实现禁止访问互联网;
  2. 添加指定局域网段的路由实现指定局域网的访问;

该方式通过路由表的方式控制可访问的资源,灵活方便,完全满足笔者的需求。

3. 实现

本文仅介绍方案三的实现,方案一与方案二因不满足笔者需求,故此处不多介绍,感兴趣的读者自行研究。

下面将以 busybox 容器为例介绍如何通过修改路由表的方式实现容器禁用互联网及允许指定局域网。

网络IP 地址
docker010.2.0.1/24
容器10.2.0.5
宿主机局域网172.20.2.1/24
宿主机172.20.2.7
  1. 创建 busybox 容器;

    # -it 交互式终端
    # --rm 容器停止后自动删除
    # --privileged 为容器提升权限,否则无法操作路由表
    $ docker run -it --rm --privileged busybox sh
    

    提示: 此处必须添加--privileged参数,否则无法在容器内部操作路由表。

  2. 修改 busybox 容器路由表;

    # 以下操作皆在容器交互式终端中执行# 获取默认网关地址,例如 10.2.0.1
    $ gw=$(route -n | tail -n +3 | grep U | grep G | awk '{print $2}')# 删除默认网关
    $ route del default gw $gw# 添加指定局域网路由
    $ route add -net 172.20.2.0 netmask 255.255.255.0 gw $gw
    

    提示: 容器内部可能找不到route命令,根据容器系统版本选择合适的包管理工具手动安装即可。

  3. 测试网络连通情况;

    # 以下操作皆在容器交互式终端中执行# 测试访问互联网,禁止访问
    $ ping -c 4 www.baidu.com
    ping: bad address 'www.baidu.com'# 测试访问宿主机,允许访问
    $ ping -c 4 172.20.2.7
    PING 172.20.2.7 (172.20.2.7): 56 data bytes
    64 bytes from 172.20.2.7: seq=0 ttl=64 time=0.091 ms
    64 bytes from 172.20.2.7: seq=1 ttl=64 time=0.083 ms
    64 bytes from 172.20.2.7: seq=2 ttl=64 time=0.077 ms
    64 bytes from 172.20.2.7: seq=3 ttl=64 time=0.116 ms--- 172.20.2.7 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max = 0.077/0.091/0.116 ms# 测试访问宿主机网段其它主机,允许访问
    $ ping -c 4 172.20.2.5
    PING 172.20.2.5 (172.20.2.5): 56 data bytes
    64 bytes from 172.20.2.5: seq=0 ttl=63 time=0.279 ms
    64 bytes from 172.20.2.5: seq=1 ttl=63 time=0.352 ms
    64 bytes from 172.20.2.5: seq=2 ttl=63 time=0.345 ms
    64 bytes from 172.20.2.5: seq=3 ttl=63 time=0.277 ms--- 172.20.2.5 ping statistics ---
    4 packets transmitted, 4 packets received, 0% packet loss
    round-trip min/avg/max = 0.277/0.313/0.352 ms
    
    # 以下操作皆在宿主机中执行# 测试访问容器,允许访问
    $ ping -c 4 10.2.0.5
    PING 10.2.0.5 (10.2.0.5) 56(84) bytes of data.
    64 bytes from 10.2.0.5: icmp_seq=1 ttl=64 time=0.051 ms
    64 bytes from 10.2.0.5: icmp_seq=2 ttl=64 time=0.050 ms
    64 bytes from 10.2.0.5: icmp_seq=3 ttl=64 time=0.064 ms
    64 bytes from 10.2.0.5: icmp_seq=4 ttl=64 time=0.062 ms--- 10.2.0.5 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.050/0.056/0.064/0.011 ms
    
  4. 路由表持久化;

    至此已经实现了本文的需求,但是路由表的修改容器重建后便会失效,因此需要将路由表的修改进行持久化。持久化的方式视情况而定(例如添加到entrypoint.sh脚本中),本文不在进行赘述。

参考文章:

  • 如何在Docker容器中阻止互联网访问-腾讯云开发者社区-腾讯云 (tencent.com)
  • 一个参数搞定 Docker 禁止单个容器访问外网-腾讯云开发者社区-腾讯云 (tencent.com)
  • docker network create | Docker Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRM是怎样帮助企业从激烈竞争中脱颖而出的?

有限的市场机会与资源推动了市场竞争。市场竞争是在所难免的,但企业可以借助CRM管理系统调整其业务策略,在市场上很多竞争者中突围。CRM系统怎样帮助企业赢得市场竞争? 以下五个功能点是关键:数据分析、客户管理、合作伙伴、营销自…

谷达冠楠科技:现在开抖音小店卖什么产品好

随着科技的发展和互联网的普及,越来越多的人开始尝试通过电商平台进行创业。抖音作为目前最受欢迎的短视频平台之一,也吸引了大量的商家入驻。那么,现在开抖音小店卖什么产品好呢? 首先,我们要明确一点,选择什么样的产…

[C/C++]——内存管理

学习C/C的内存管理 前言:一、C/C的内存分布二、C语言中动态内存管理方式三、C中动态内存管理方式3.1、new/delete操作符3.1.2、new/delete操作内置类型3.1.3、new/delete操作自定义类型 3.2、认识operator new和operator delete函数3.3、了解new和delete的实现原理3…

Android Kotlin Viewbinding封装

目录 Viewbinding配置 Activity封装 Activity使用 Fragment封装 Fragment使用 Dialog封装 Dialog使用 Viewbinding配置 android { viewBinding { enabled true } } Activity封装 import android.os.Bundle import android.view.LayoutInflater import androidx.ap…

verilog基本语法-case语句-译码电路,编码电路,选择器电路

概述: 本节主要讲解LUT构造的组合逻辑电路中的译码电路,编码电路,选择器电路。这些基本电路是使用的最广泛的电路,但是一般情况下很容易忽略这些电路。其中译码电路是构成RAM中写地址的电路,而选择电路是构成RAM中数据…

Vue xtermjs 终端

Vue xtermjs 终端 安装步骤如下 安装xtermjs所需要的插件 npm install --save xterm npm install --save xterm-addon-fit npm install --save xterm-addon-attachHTML代码片段 <template><div><a-drawertitle"终端"placement"right":cl…

视频数据卡设计方案:120-基于PCIe的视频数据卡

一、产品概述 基于PCIe的一款视频数据收发卡&#xff0c;并通过PCIe传输到存储计算服务器&#xff0c;实现信号的采集、分析、模拟输出&#xff0c;存储。 产品固化FPGA逻辑&#xff0c;实现PCIe的连续采集&#xff0c;单次采集容量2GB&#xff0c;开源的PCIe QT客…

安卓11添加切换以太网动态静态方法

客户要在app中自由切换动态&#xff0c;静态方法&#xff0c;直接把系统jar-api给他搞了半天搞不定&#xff0c;只有在系统里给他实现一个接口&#xff0c;方法如下&#xff1a; Index: packages/apps/Settings/AndroidManifest.xml--- packages/apps/Settings/AndroidManifes…

11.仿简道云公式函数实战-逻辑函数-TRUE

1. TRUE函数 TRUE 函数可直接返回逻辑值 true。 2. 函数用法 TRUE() 3. 函数示例 TRUE 函数一般不会作为函数单独使用&#xff0c;可与其他函数一起使用&#xff0c;或作为判断逻辑的结果。如&#xff0c;判断字段值是否为空时&#xff0c;设置公式为IF(ISEMPTY(方案选择)…

接口使用@requestMapping应用场景

父类&#xff1a; public class BaseController<T> {PostMappingpublic ResponseValue add(HttpServletRequest req, Validated({DeleteValid.class}) T entity) throws Exception {return service.add(req, entity);}GetMappingpublic ResponseValue searchList(HttpSe…

02 python语句判断

2.1 布尔类型与比较运算符 演示bool类型的定义 比较运算符的应用# 定义变量储存布尔类型的数据 bool1True bool2False print(fbool1变量的内容是&#xff1a;{bool1},其类型是{type(bool1)}) print(fbool2变量的内容是&#xff1a;{bool2},其类型是{type(bool2)})# 比较运算符的…

“以赛促创”火正旺! 诸暨海归小镇逐梦“天空之城”

大雪节气已过&#xff0c;寒意渐浓&#xff0c;海归小镇却涌动着一股热潮。12月13日&#xff0c;以“海归智汇新时代 聚力创赢新发展”为主题的欧美同学会第三届“双创”大赛空天装备产业赛区决赛在浙江诸暨举行。作为全国唯一一个落地此项赛事的县级城市&#xff0c;诸暨将以赛…

c++用#define宏定义来批量实例化对象

参考自 PX4-Autopilot/platforms/common/include/px4_platform_common/param.h 正常实例化一个类Myclass Myclass obj 实例化多个类&#xff1a; Myclass1 obj1; Myclass2 obj2; Myclass3 obj3; ... 如果之后还要对这些对象都进行统一的一系列操作&#xff0c;比如obj1.up…

面试题-反转链表

反转链表的java写法&#xff0c;熟能生巧。 目录 一、题目描述 数据范围 样例 二、实现代码&#xff08;java&#xff09; 一、题目描述 定义一个函数&#xff0c;输入一个链表的头结点&#xff0c;反转该链表并输出反转后链表的头结点。 思考题&#xff1a; 请同时实现迭代…

【PostgreSQL】从零开始:(三)PgAdmin4下载与安装

【PostgreSQL】从零开始:&#xff08;三&#xff09;PgAdmin4下载与安装 pgAdmin简介liunx下部署通过yum部署pgAdmin4&#xff08;6.21&#xff09;1.安装依赖包2.永久停止防火墙3.配置pgadmin4项目源4.下载并安装pgAdmin45.执行初始化命令6.访问我们的网站 liunx下通过python方…

Linux install manual 1Panel

前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…

利用机器学习实现客户细分的实战

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下机器学习实战中的案例&#xff1a;创建客户细分&#xff0c;在此过程中也会补充很多重要的知识点&#xff0c;欢迎大家一起前来探讨学习~ 一、导入数据 在此项目中&#xff0c;我们使用 UCI 机器学习代码库…

Mysql研学-SQL语言基础

一 DDL语句:数据定义语言 1 作用:操作表 2 常用关键字 CREATE(创建) DROP(删除(销毁)) ALTER修改 3 格式 -- 单行注释/* 多行注释 */删除表:DROP TABLE [IF EXISTS] 表名;括号内为查看该表是否存在有则删创建表:参考JavaBean中定义有参构造器 &#xff08;最后一列不写逗…

如何创建逼真的3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、如何创建逼真的3D模型 通过调整默认的表面贴图&#xff0c;可以为…

DNSLog漏洞探测(七)之SQL注入漏洞实战

DNSLog漏洞探测(七)之SQL注入漏洞实战 在前面的文章之中&#xff0c;我们已经学习了XSS、RCE、XXE、SSRF漏洞中有关于DNSLog平台的使用。这些漏洞本身在执行时就有解析URL地址&#xff0c;发起网络请求的操作&#xff0c;所以只要我们把DNSLog平台获取的子域名地址发送到存在漏…