nginx 禁用通过http访问我的docker容器

hgqdbh6s  于 2023-08-03  发布在  Nginx
关注(0)|答案(1)|浏览(105)

我正在尝试设置一个debian服务器,我有多个应用程序运行在docker容器中,每个容器都有自己的端口
让我们假设它的IP是(160.160.160.160),链接到一个域example160.com和两个应用程序(两个docker容器),运行在5500600
我还设置了一些反向代理配置,这样我就可以通过app5500.example160.comapp6600.example160.com这样的子域访问应用程序。
下面是其中一个配置的示例

server {
    listen 443 ssl; # managed by Certbot
    server_name app5500.example160.com;

    location / {
        proxy_pass https://127.0.0.1:80/;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
    }

    ssl_certificate /etc/letsencrypt/live/example160.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example160.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    listen 80;
    server_name app5500.example160.com;
    
    if ($host = app5500.example160.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    return 404; # managed by Certbot
}

字符串
正如你所看到的,我做了一个从http到https的重定向,只有当我试图访问http://app5500.example160.com时才能工作,但问题是我仍然能够通过url访问容器,如http://www.example160.com:5500http://160.160.160.160:5500,我不知道如何阻止它,以便只能通过https://app5500.example160.com访问容器
我尝试了这个解决方案,但添加了其他nginx配置来重定向其他子域,但它不起作用

server {
    listen 443 ssl;
    server_name *.example160.com;

    if ($host !~ ^example160\.com$) {
        return 301 https://example160.com$request_uri;
    }

    ssl_certificate /etc/letsencrypt/live/example160.com-0001/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example160.com-0001/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    return 404;
}

server {
    listen 80 default_server;
    server_name *.example160.com;

    return 301 https://example160.com$request_uri;
}


我甚至尝试用iptables和nftables设置防火墙,但最终没有安装防火墙,因为它们没有帮助。

wi3ka0sx

wi3ka0sx1#

不要在所有接口上发布容器端口,而是将它们绑定到localhost:

docker run -p 127.0.0.1:5500:5500 ...

字符串
这样,它们将 * 仅 * 可由您的nginx代理访问;将无法从远程位置直接连接到端口。
或者,在容器中运行代理(如果您还没有这样做),然后根本不需要发布容器端口 *。代理将能够直接连接到容器,因为它们将在同一内部网络上运行。
您只需要发布代理端口。

相关问题