我有一台运行着两个 docker 容器的服务器。其中一个是小型应用程序的前端,由 提供服务http-server
。该应用程序使用 Javascript fetch API 从基于 Node.js 'json-server' 模块的非常简单的数据库中获取数据,该模块在另一个容器中运行。
碰巧的是,这json-server
使得端口 3000 可供外部用户使用,即如果有人将浏览器指向http://example.com:3000
,我的数据将可用,而无需前端提供的过滤和呈现。这不是我想要的。
我想阻止端口 3000 与外部世界通信,同时允许我的其他 docker 容器照常获取数据。我认为这可以在 IP 基础上完成,但我不知道该怎么做。
这是我当前的 Iptables 配置,大部分是由 Docker 本身作为标准创建的。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.17.0.2 tcp dpt:http-alt
ACCEPT tcp -- anywhere 172.17.0.3 tcp dpt:3000
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target prot opt source destination
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
在上面的配置中,IP 172.17.0.2 是我的前端应用程序,而 172.17.0.3 是我的数据库容器的 IP。
前端容器正在启动
docker run -p 80:8080 --name=frontend -d mtr/frontend
第二个是
docker run -p 3000:3000 --name=database -d mtr/database
我也考虑过使用某种 Docker 方式来限制这种访问的可能性,但经过大量研究后我还是没有找到任何东西。
关于如何实现这一点,有什么建议吗?
答案1
由于您“接受”从“任何地方”到主机“172.17.0.3”在“tcp”端口“dpt:3000”上的“tcp”连接,并且我猜测还存在一条 DNAT 规则,该规则将每个传入连接转发到“you-public-ip-address:3000”到“172.17.0.3:3000”(参见iptables -t nat -L --line-numbers
),这被认为是正常的。
从 NAT 表中删除 DNAT 规则。
iptables -t nat -D PREROUTING <the-dnat-rule-number>