我有一个 EC2 实例,带有公共(弹性)和私有 IP 地址。我想运行一个端口绑定 only 到私有 IP 地址的 docker 容器。
我的 docker-compose.yml 看起来像这样:
version: '3.8'
services:
app:
network_mode: host
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
container_name: npm
ports:
- "10.10.100.100:81:81" # internal IP address
我的外部 IP 地址 (elasticIP) 类似于 3.29.50.100。 我认为上述
10.10.100.100:81:81
会限制进入我的实例的流量,只允许来自 10.10.100.100 IP 地址的流量,并拒绝所有其他流量。我添加了network_mode: host
认为可以解决问题。
但是,我仍然可以从 elasticIP 地址(例如“http://3.29.50.100:81”和主机上的任何其他地址,例如“http://127.0.0.1:81”)访问我的容器服务.
Docker 文档似乎表明上述内容应该有效。
我做错了什么?
IP 绑定实际上做的是绑定到具有该 IP 地址的网络接口。然而,您的 EC2 实例实际上只有一个网络接口。 AWS 网络正在执行 NAT 以将流量从公共 IP 发送到私有 IP,因此所有流量仍会到达该单个网络接口。
要通过 docker-compose 做你想做的事,你首先必须为 EC2 实例分配第二个弹性网络接口,而没有为该 ENI 分配公共 IP,然后绑定到它。
但是,在 AWS 中有一种更简单的方法来处理这类事情。您可以简单地更新 EC2 实例的安全组,以便端口
81
的唯一入站规则指定您的 VPC 的 CIDR 块。然后只有源自您的 VPC 的请求才能访问 EC2 服务器上的端口81
。来自 VPC 外部的任何请求都将被阻止访问该端口。