nginx关闭ip直接访问

990 阅读2分钟

场景

在完成了我的个人网站进行部署以后,域名均配置了CDN的CNAME,原以为只能通过域名访问服务了,但是我发现当在浏览器输入http://hostIPhttps://hostIP时,依旧可以访问到网站的html文件,下面介绍解决此问题的方案。

官方文档中提供的方法

增加default server,丢弃所有未配置Host请求头的所有请求。

If you do not want to process requests with undefined “Host” header lines, you may define a default server that just drops the requests:

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

该方案可以阻断 http://hostIP 的访问,但是我们的服务器上配置了HTTPS证书,在使用https://hostIP访问时,依旧可以访问到网站,并且在浏览器可以看到证书关联的域名信息,最终导致域名背后的主机地址泄漏。

使用重定向

通过查阅,我使用了重定向的方法解决此问题,首先是增加了对443端口的监听,注意需要配置ssl_certificate和ssl_certificate_key的地址,负责会报错,最后通过301重定向到localhost,这里没有重定向到自己的网站,避免和域名产生关联。

server {
    listen 80 default_server;
    server_name _;
    listen 443 default_server;
    server_name _;
    ssl_certificate    /pathto/fullchain.pem;
    ssl_certificate_key    /pathto/privkey.pem;
    return 301 http://127.0.0.1;
}

:::caution 注意 如果在配置CDN之前,就已经将域名和IP做了关联,其实依然是有可能会泄漏的。 :::

更进一步

以上方案对我这种个人小站来说,已经基本足够,但依然有所不足,比较有规模的网站,可以考虑通过以下方案,提升安全性。

  • 限制访问:通过使用防火墙(安全组)允许受信任的地址访问实例来限制访问,在安全组中配置最严格的规则。例如限制端口访问、IP 地址访问等。
  • 安全级别:创建不同的安全组规则应用于不同安全级别的实例组上,确保运行重要业务的实例无法轻易被外部触达。
  • 网络逻辑隔离:通过私有网络进行逻辑区的划分。
  • 账户权限管理:当对同一组云资源需要多个不同账户控制时,通过策略机制控制其对云资源的访问权限。
  • 安全登录:仅支持必须通过堡垒机登录用户的 Linux 类型实例。关闭密码访问途径。

2022-02-18-20220218150001