Nginx禁止未绑定域名或IP访问80和443端口实践小结

兄弟姐妹,请分析下,Nginx禁止未绑定域名或IP访问80和443端口实践小结
最新回答
岁月并非如歌

2024-11-30 17:18:24

在决定请求由哪个server块执行时,nginx主要关注listen和server_name字段。当根据listen无法得到最佳匹配,会开始解析server_name。nginx检查请求中的"Host"头,该值包含客户端实际请求的域名或IP。如果无匹配规则,会选择可用列表中的第一个server。这会导致未绑定域名或IP直接访问80和443端口增加后端逻辑服务压力并产生不合理的错误日志。因此,通过在nginx的server块中添加default_server,禁止未绑定域名或IP访问80和443端口,可以过滤不合理流量。

在nginx中,server_name指令的匹配规则包括准确匹配、以*通配符开始和结束的字符串、匹配正则表达式以及未匹配时使用default_server。如果没有指定default_server,则会选第一个可用server。为防止未匹配的host值访问,可以通过返回444错误码让nginx断开与浏览器的连接,避免垃圾流量影响网站。

nginx对default_server的解释指出,当请求使用IP地址而非服务器名时,可以使用“Host”请求头字段处理,即使请求未包含server name。在catch-all server示例中,使用“_”作为server name,它代表一个无效域名集合中的一个,与真实域名无交集。其他无效名称如“--”和“!@#”也可使用。基于域名的虚拟服务器中,nginx首先决定请求应由哪个server处理。在所有虚拟服务器均监听80端口的简单配置中,仅测试“Host”请求头字段来确定请求应路由至哪个server。若其值未匹配任何server name,或请求未包含此字段,则路由至默认server,即配置中的第一个server。默认server参数自0.8.21版本起可用,早期版本需使用default参数。重要的是,默认server是端口属性,而非服务器名称属性。

若不允许无"Host"头字段的请求处理,可定义一个只丢弃请求的server。在此配置中,server name设为空字符串,匹配无"Host"头字段的请求,并返回nginx非标准的444错误码,以关闭连接。自0.8.48版本起,此为默认设置,无需显式指定server_name。在早期版本中,使用机器的主机名作为默认server name。

nginx在处理请求时,使用"Host"头进行server_name匹配,不考虑TLS SNI。这意味着SSL服务器必须接受SSL连接,即拥有证书/密钥。证书/密钥可以是任何,例如自签名。

详细的配置步骤可以参考相关文章。了解如何正确设置nginx的“default”服务器用于HTTPS、理解Nginx中Server和Location的匹配逻辑等信息。