我的 Web 服务器是否可以通过其 IP 地址直接访问?我该如何设置?

我的 Web 服务器是否可以通过其 IP 地址直接访问?我该如何设置?

目前我有一个 Django 服务器,如果你去www.notmyactualwebsite.com。但是,我得到一堆直接访问 IP 地址的机器人,即 12.34.56.78:443,Django 将抛出异常并提醒我可能需要将 12.34.56.78:443 添加到 ALLOWED_HOSTS 设置中。

这让我很疑惑:我真的应该允许通过直接 IP 访问我的网站吗?我无法想象很多人会真的这么做,所以就这样放任不管就好了吗?

答案1

根据我的问题的评论和这里的答案https://stackoverflow.com/questions/47846521/i-continuously-receive-invalid-http-host-header-error-email-after-i-upgrade-my我了解到:

  1. 显然大多数网站不允许直接 IP 连接,因此您也不需要适应这种情况。

  2. 我的 nginx 设置应该是阻止此类访问的层,它可以使用这些默认块捕获所有不被接受的服务器名称:

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    return 444;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

现在,这实际上不起作用。我不完全了解 SSL 证书,所以我很想有人评论一下为什么会这样,但即使正常访问网站(即未正确使用 IP 地址),此服务器配置也会导致 ERR_CONNECTION_CLOSED 或 ERR_CONNECTION_RESET 错误。我找到了答案,那就是您需要添加 SSL 证书,因为这是一个 HTTPS 端点:https://stackoverflow.com/questions/35677044/nginx-ssl-certificate-directive-doesnt-work-within-server-block-browser-shows

因此我从常规 django 服务器块复制了 SSL 证书,现在 SSL 块如下所示:

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    return 444;
    ssl_certificate /etc/letsencrypt/live/notmyactualwebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/notmyactualwebsite.com/privkey.pem; # managed by Certbot
}

除此之外,显然最好不要为 IP 提供基于域的 SSL 证书。因此,您可以根据此处的答案生成自己的证书阻止通过 HTTPS 直接访问 Web 服务器 IP

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj '/CN=<SERVER-IP>'

然后你的最终结果如下所示:

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    return 444;

    # This will actually trigger a browser SSL error because they won't trust
    # your self-signed certificate but it's probably to a bot anyway
    ssl_certificate         /path/to/certificate.crt;
    ssl_certificate_key     /path/to/privateKey.key;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 444;
}

相关内容