docker 内的 Express 应用程序。仅限制对主机本地主机的访问

问题描述 投票:0回答:3

我试图限制对我的express/nodejs 应用程序的访问,以便只能从其域 URL 访问它。目前,如果我转到

http://ip-address-of-server:3000
,应用程序将绕过 nginx 直接获得服务。

我尝试在 app.listen 中添加“localhost”--

app.listen(4000, 'localhost' ,  () => console.log('Server running'));

但这最终会使应用程序完全无法访问。即使通过 nginx。

该应用程序在 Docker 容器内运行。并且nginx正在主机上运行。我认为这可能是导致它的原因,但不知道如何解决这个问题。

node.js express docker nginx
3个回答
2
投票

您可以为您的应用程序使用 Docker 主机模式网络,因为您提到“应用程序在 docker 容器内运行。并且 nginx 在主机上运行。”。

参考 - https://docs.docker.com/network/host/

这样,就可以通过同一网络上的 nginx 访问它。在 docker 主机模式网络中启动容器后,您的“localhost”设置将开始照常工作。


2
投票

看起来您想要进行基于 IP 的过滤,即您希望只能从 nginx(本地主机或远程)和本地访问 node.js 程序。

有两种方法

  • 使用express-ipfilter中间件。 https://www.npmjs.com/package/express-ipfilter 根据ips过滤请求

  • 让node.js监听所有内容,但更改主机上的iptables以限制对特定ip的端口访问。使用 -p 将 Node.js 容器的端口公开给主机,并向外界关闭该端口的 iptable

我更喜欢第二种方式,因为它更强大并且限制网络级别的流量


0
投票

关于 vivekyad4v 的答案的附加说明:

网络模式“主机”在 Windows 中无法正常工作。它还不允许从容器内部绑定到主机的 IP 地址

参见 https://docs.docker.com/engine/network/drivers/host/#limitations

对我有用的是在需要从外部访问的服务之间创建一个共享网络,并将网络驱动程序设置为“透明”。这使得 Express 应用程序可以从外部访问,并且它应该适用于任何操作系统。

您的 docker-compose.yml 文件应如下所示:

services:
    ...
    backend:
        ...    
        networks:
          - default
networks:
  default:
    driver: transparent
© www.soinside.com 2019 - 2024. All rights reserved.