nginx反向代理停止端口覆盖

问题描述 投票:1回答:4

我目前正在使用nginx在一个vps上运行两个节点应用程序。但它正在工作,从任一URL,如果我手动输入另一个端口,它将运行另一个应用程序,即转到mydomain1.com和mydomain2.com正确路由到在端口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;
nginx reverse-proxy
4个回答
2
投票

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

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


2
投票

正如其他答案所指出的那样,最好的办法是设置防火墙,只绑定你的节点应用程序来监听localhost


对于防火墙,你不必乱用iptables,你可以使用ufw(简单防火墙)。这使得保护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,您可以看到您有哪些活动规则。


为了只将您的节点进程绑定到localhost(以便服务器上没有的任何东西都无法连接到该端口),您可以将主机名作为server.listen()的第二个参数(或app.listen()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}`);
});

1
投票

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

如果您感兴趣,可以访问节点应用程序的实际原因是,除非您将它们绑定到IP,否则它们将侦听所有网络接口上的流量,因此将响应您的公共IP上的请求。

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


0
投票

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

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

红晕

    iptables -F

阻止空包

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

同步洪水攻击保护

    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

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

    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
© www.soinside.com 2019 - 2024. All rights reserved.