我试图限制对我的express/nodejs 应用程序的访问,以便只能从其域 URL 访问它。目前,如果我转到
http://ip-address-of-server:3000
,应用程序将绕过 nginx 直接获得服务。
我尝试在 app.listen 中添加“localhost”--
app.listen(4000, 'localhost' , () => console.log('Server running'));
但这最终会使应用程序完全无法访问。即使通过 nginx。
该应用程序在 Docker 容器内运行。并且nginx正在主机上运行。我认为这可能是导致它的原因,但不知道如何解决这个问题。
您可以为您的应用程序使用 Docker 主机模式网络,因为您提到“应用程序在 docker 容器内运行。并且 nginx 在主机上运行。”。
参考 - https://docs.docker.com/network/host/
这样,就可以通过同一网络上的 nginx 访问它。在 docker 主机模式网络中启动容器后,您的“localhost”设置将开始照常工作。
看起来您想要进行基于 IP 的过滤,即您希望只能从 nginx(本地主机或远程)和本地访问 node.js 程序。
有两种方法
使用express-ipfilter中间件。 https://www.npmjs.com/package/express-ipfilter 根据ips过滤请求
让node.js监听所有内容,但更改主机上的iptables以限制对特定ip的端口访问。使用 -p 将 Node.js 容器的端口公开给主机,并向外界关闭该端口的 iptable
我更喜欢第二种方式,因为它更强大并且限制网络级别的流量
关于 vivekyad4v 的答案的附加说明:
网络模式“主机”在 Windows 中无法正常工作。它还不允许从容器内部绑定到主机的 IP 地址
参见 https://docs.docker.com/engine/network/drivers/host/#limitations
对我有用的是在需要从外部访问的服务之间创建一个共享网络,并将网络驱动程序设置为“透明”。这使得 Express 应用程序可以从外部访问,并且它应该适用于任何操作系统。
您的 docker-compose.yml 文件应如下所示:
services:
...
backend:
...
networks:
- default
networks:
default:
driver: transparent