nginx 反向代理停止端口覆盖

nginx reverse proxy stop port override

我目前正在使用 nginx 运行 一个 vps 上的两个节点应用程序。但是,它正在工作,如果我手动输入另一个 URL 的端口,它将 运行 另一个应用程序,即转到 mydomain1.com 和 mydomain2.com 正确路由到节点应用程序 运行ning 在端口 1337 和 1338 上。但是我可以执行 mydomain1.com:1337 或 mydomain1.com:1338 并且我可以访问任何一个应用程序,这似乎不正确。我可以,如果可以,如何防止将端口附加到交叉访问应用程序?

这是我的文件,位于 etc/nginx/conf.d、mydomain1.conf 和 mydomain2.conf:

mydomain1.conf

    server {
        listen 80;

        server_name mydomain1.com;

        location / {
            proxy_pass http://localhost:1337;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }

mydomain2.conf

    server {
        listen 80;

        server_name mydomain2.com;

        location / {
            proxy_pass http://localhost:1338;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }

我还添加了一个 /etc/nginx/nginx.conf 文件,内容如下:

    server_names_hash_bucket_size 64;

这似乎更像是一个防火墙问题?域名只是让你进入机器,如果节点服务器在 'exposed' 端口上 运行,那么你当然可以访问它们。您可能应该锁定暴露的端口,并可能在应用程序路由中强制执行域重定向。

Web 服务器可能只需要为 http 公开端口 80,为 https 公开 443,为 ssh 公开 22,也许 25 为 ftp

我正在为我自己的问题添加一个答案,我接受了一个让我朝着正确方向前进的答案。这个答案可能对直接点击此线程的人有用。

肯定有更强大的方法,但对我来说,使用 linux iptables 和以下内容仅允许端口 80 和端口 22(用于我的 ssh 会话),因此用户无法输入 mydomain1:1337 或 mydomain1:1338,它还包括一些基本的攻击保护:

同花顺

    iptables -F

阻止空数据包

    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

syn-flood 攻击防护

    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

XMAS 数据包保护

    iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

允许本地主机

    iptables -A INPUT -i lo -p all -j ACCEPT

现在我们可以允许网络服务器流量:

    iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
    iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

允许关联,建立

    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

像这样设置你的防火墙是明智的,它显然提供了一个解决方案。

如果您有兴趣,您的节点应用程序可访问的实际原因是,除非您将它们绑定到 IP,否则它们会侦听您所有网络接口上的流量,因此将响应您 public 知识产权。

将您的节点应用程序(或您计算机上的任何服务器 运行)绑定到 127.0.0.1,它只会响应内部请求,包括由 Nginx 代理的请求,但不会响应外部世界。

正如其他答案所指出的,最好的办法是同时设置防火墙 仅绑定您的节点应用程序以侦听 localhost.


对于你没有与iptables混淆的防火墙,你可以使用ufw (Uncomplicated Firewall)。这使得保护 Web 服务器的端口变得非常轻松:

  • 默认情况下最初拒绝所有传入连接
  • 只允许 HTTP:80HTTPS:443SSH:22FTP:21

对于 debian/ubuntu 系统,该过程如下所示(首先确保您是 rootsudo):

$ apt install ufw
$ ufw default deny incoming

$ ufw allow ssh
$ ufw allow http
$ ufw allow https
$ ufw allow ftp

$ ufw enable

如果您键入 ufw status,您可以看到您激活了哪些规则。


为了仅将您的节点进程绑定到本地主机(这样任何不在您的服务器上的东西都无法连接到该端口),您可以将主机名作为 server.listen() (or app.listen() for express 的第二个参数传递) :

const PORT = process.env.PORT || 1337;
const HOST = "localhost" || "127.0.0.1"; // You can use either of these

app.listen(PORT, HOST, err => {
    if (err) throw err;
    console.log(`Listening on http://${HOST}:${PORT}`);
});