气隙容器
目录
隔离容器允许您通过控制容器发送和接收数据的位置来限制容器网络访问。此功能将自定义代理规则应用于容器网络流量,有助于保护容器不应具有无限制互联网访问的环境。
Docker Desktop 可以将容器网络流量配置为接受连接、拒绝连接或通过 HTTP 或 SOCKS 代理进行隧道传输。您可以控制策略适用的 TCP 端口以及是使用单个代理还是通过代理自动配置 (PAC) 文件使用每个目标的策略。
此页面提供了隔离容器的概述和配置步骤。
谁应该使用隔离容器?
隔离容器可帮助组织在受限环境中维护安全性
- 安全开发环境:防止容器访问未经授权的外部服务
- 合规性要求:满足需要网络隔离的监管标准
- 数据丢失防护:阻止容器将敏感数据上传到外部服务
- 供应链安全:控制容器在构建期间可以访问哪些外部资源
- 企业网络策略:对容器化应用程序强制执行现有网络安全策略
隔离容器的工作原理
隔离容器通过拦截容器网络流量并应用代理规则来运行
- 流量拦截:Docker Desktop 拦截来自容器的所有出站网络连接
- 端口过滤:只有指定端口 (
transparentPorts) 上的流量才受代理规则约束 - 规则评估:PAC 文件规则或静态代理设置决定如何处理每个连接
- 连接处理:根据规则,流量可以直接允许、通过代理路由或被阻止
一些重要考虑事项包括
- 现有的
proxy设置继续适用于主机上的 Docker Desktop 应用程序流量 - 如果 PAC 文件下载失败,容器将阻止对目标 URL 的请求
- URL 参数格式为
http://host_or_ip:port或https://host_or_ip:port - 主机名适用于端口 80 和 443,但其他端口只适用于 IP 地址
先决条件
在配置隔离容器之前,您必须拥有
配置隔离容器
将容器代理添加到您的 admin-settings.json 文件。例如
{
"configurationFileVersion": 2,
"containersProxy": {
"locked": true,
"mode": "manual",
"http": "",
"https": "",
"exclude": [],
"pac": "http://192.168.1.16:62039/proxy.pac",
"transparentPorts": "*"
}
}配置参数
containersProxy 设置控制应用于容器流量的网络策略
| 参数 | 描述 | 值 |
|---|---|---|
已锁定 | 防止开发者覆盖设置 | true(已锁定)、false(默认) |
mode | 代理配置方法 | system(使用系统代理)、manual(自定义) |
http | HTTP 代理服务器 | URL(例如,"http://proxy.company.com:8080") |
https | HTTPS 代理服务器 | URL(例如,"https://proxy.company.com:8080") |
排除 | 绕过这些地址的代理 | 主机名/IP 数组 |
pac | 代理自动配置文件的 URL | PAC 文件 URL |
透明端口 | 受代理规则约束的端口 | 逗号分隔的端口或通配符 ("*") |
配置示例
阻止所有外部访问
"containersProxy": {
"locked": true,
"mode": "manual",
"http": "",
"https": "",
"exclude": [],
"transparentPorts": "*"
}允许特定的内部服务
"containersProxy": {
"locked": true,
"mode": "manual",
"http": "",
"https": "",
"exclude": ["internal.company.com", "10.0.0.0/8"],
"transparentPorts": "80,443"
}通过企业代理路由
"containersProxy": {
"locked": true,
"mode": "manual",
"http": "http://corporate-proxy.company.com:8080",
"https": "http://corporate-proxy.company.com:8080",
"exclude": ["localhost", "*.company.local"],
"transparentPorts": "*"
}代理自动配置 (PAC) 文件
PAC 文件通过为不同目标定义规则,对容器网络访问提供精细控制。
PAC 文件基本结构
function FindProxyForURL(url, host) {
if (localHostOrDomainIs(host, 'internal.corp')) {
return "PROXY 10.0.0.1:3128";
}
if (isInNet(host, "192.168.0.0", "255.255.255.0")) {
return "DIRECT";
}
return "PROXY reject.docker.internal:1234";
}PAC 文件返回值
| 返回值 | 操作 |
|---|---|
PROXY host:port | 通过指定主机和端口的 HTTP 代理路由 |
SOCKS5 host:port | 通过指定主机和端口的 SOCKS5 代理路由 |
DIRECT | 允许不带代理的直接连接 |
PROXY reject.docker.internal:any_port | 完全阻止请求 |
高级 PAC 文件示例
function FindProxyForURL(url, host) {
// Allow access to Docker Hub for approved base images
if (dnsDomainIs(host, ".docker.io") || host === "docker.io") {
return "PROXY corporate-proxy.company.com:8080";
}
// Allow internal package repositories
if (localHostOrDomainIs(host, 'nexus.company.com') ||
localHostOrDomainIs(host, 'artifactory.company.com')) {
return "DIRECT";
}
// Allow development tools on specific ports
if (url.indexOf(":3000") > 0 || url.indexOf(":8080") > 0) {
if (isInNet(host, "10.0.0.0", "255.0.0.0")) {
return "DIRECT";
}
}
// Block access to developer's localhost
if (host === "host.docker.internal" || host === "localhost") {
return "PROXY reject.docker.internal:1234";
}
// Block all other external access
return "PROXY reject.docker.internal:1234";
}验证隔离容器配置
应用配置后,测试容器网络限制是否有效
测试被阻止的访问
$ docker run --rm alpine wget -O- https://www.google.com
# Should fail or timeout based on your proxy rules
测试允许的访问
$ docker run --rm alpine wget -O- https://internal.company.com
# Should succeed if internal.company.com is in your exclude list or PAC rules
测试代理路由
$ docker run --rm alpine wget -O- https://docker.io
# Should succeed if routed through approved proxy
安全考虑
- 网络策略强制:隔离容器在 Docker Desktop 级别工作。高级用户可能会通过各种方式绕过限制,因此请考虑为高安全环境添加额外的网络级别控制。
- 开发工作流程影响:过于严格的策略可能会破坏合法的开发工作流程。进行彻底测试并为必要的服务提供明确的例外。
- PAC 文件管理:将 PAC 文件托管在可靠的内部基础设施上。PAC 下载失败会导致容器网络访问被阻止。
- 性能考虑:包含许多规则的复杂 PAC 文件可能会影响容器网络性能。保持规则简单高效。