在反向代理模式下阻止通过 http 端口访问 rocket.chat

Block access to rocket.chat via http port in reverse proxy mode

我在 CentOS 7.6 上安装了 rocket.chat 版本 0.72.3 作为私人本地团队聊天。

然后为了配置反向代理以强制 rocket.chat 使用 SSL 协议,我安装了 nginx 版本 1.12.2 并按照 link https://rocket.chat/docs/developer-guides/mobile-apps/supporting-ssl/ 配置 nginx 作为反向代理。

配置成功后,我有两个url都指向我的rocket.chat应用程序(http://localhost:3000https://localhost:443)。我的意思是 rocket.chat 在这两个 link 下都可以访问,其中 http 访问是多余的。

如何禁止通过 http://localhost:3000 访问 rocket.chat

我通过阻止与 localhost 的外部连接并使用 iptables 允许与 localhost 的内部连接解决了这个问题:

iptables -A INPUT -p tcp --dport 3000 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -j DROP

但我仍然想知道是否有与 nginx 相关的配置来解决问题?

您需要 1) 仅将 rocketchat 服务绑定到本地主机接口和 2) 让 nginx 监听 public 接口并充当代理(您可能已经这样做了)。

因此,首先打开您的 rocketchat.service 文件(可能在 /lib/systemd/system/rocketchat.service 中,但这取决于您如何配置 rocketchat 服务)并在 [Service] 部分添加此行:

[Service]
Environment=BIND_IP=127.0.0.1

不要担心您已经有一个(或一些)Environment 个条目,这些条目是汇总的(对我来说,每个变量都有一个 Environement 条目)。

然后打开您的 nginx 配置(可能 /etc/nginx/sites-enabled/default,但这可能有所不同)并确保 server 块仅在端口 443 上侦听并执行其代理工作。我的 nginx 相关条目如下所示:

# Upstreams
upstream backend {
    server 127.0.0.1:3000;
}

server {
    listen 443;
    server_name mydomain.com;
    error_log /var/log/nginx/rocketchat.access.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    location / {
            proxy_pass http://127.0.0.1:3000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forward-Proto http;
            proxy_set_header X-Nginx-Proxy true;

            proxy_redirect off;
    }
}

您可能需要 reload/restart nginx 和 rocketchat 服务并重新加载配置发布

$ sudo systemctl daemon-reload

命令。

对我来说它完美无缺。