IPTABLES:仅对外部用户阻止端口

IPTABLES:仅对外部用户阻止端口

我有一台运行着两个 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>

相关内容