Nginx如何批量屏蔽自定义端口直接IP访问仅允许域名访问
核心原因
Nginx的默认服务(default_server)是按端口独立匹配的,你之前的配置只给80端口设了兜底拦截,4100、4200这类自定义端口没有配置对应的兜底规则,IP直连这些端口时,请求会自动落到该端口下第一个加载的业务服务上,自然不会触发404拦截。
配置方案
不需要给每个端口单独写规则,用通配监听+全局default_server做统一兜底即可,步骤如下:
- 新建配置文件
/etc/nginx/conf.d/00-block-ip-direct.conf(文件名以00开头保证优先加载,优先级高于其他业务配置),写入以下内容:
# 拦截所有HTTP端口的IP直连请求 server { listen *:* default_server; listen [::]:* default_server; server_name _; return 444; # 直接断开连接,不返回任何响应 } # 拦截所有HTTPS端口的IP直连请求 server { listen *:* ssl default_server; listen [::]:* ssl default_server; server_name _; # 随便放一个自签证书即可,仅用于完成SSL握手拦截,不需要可信证书 ssl_certificate /etc/nginx/ssl/dummy.crt; ssl_certificate_key /etc/nginx/ssl/dummy.key; return 444; }
- 你现有的所有业务服务配置不需要做任何修改,保持原有
listen 自定义端口、server_name 业务域名的配置即可。当请求的Host头匹配你配置的业务域名时,会自动转发到对应服务,不会触发拦截。 - 执行配置校验和重载:
nginx -t nginx -s reload
可选调整
如果你不想直接断开连接,想把IP直连的用户引导到域名,可以把两个server块里的return 444;替换成:
return 301 https://你的主域名$request_uri;
注意事项
- 不要把这个兜底配置放在业务配置的后面,否则default_server属性会被业务服务抢占,导致拦截失效。用00开头的文件名放在conf.d目录是最稳妥的方式,Nginx会按ASCII顺序加载配置文件,数字开头的文件会最先加载。
- 如果你不需要拦截HTTPS的IP直连,可以删掉第二个SSL相关的server块,但建议保留,避免用户通过
https://IP:端口的方式跳过域名校验访问服务,触发SSL证书不信任警告。 - 之前你写的80端口单独拦截的规则可以删掉,全局通配规则已经覆盖了80端口的场景。
内容的提问来源于stack exchange,提问作者xDrago
相关产品推荐
相关产品推荐

