You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx如何批量屏蔽自定义端口直接IP访问仅允许域名访问

核心原因

Nginx的默认服务(default_server)是按端口独立匹配的,你之前的配置只给80端口设了兜底拦截,4100、4200这类自定义端口没有配置对应的兜底规则,IP直连这些端口时,请求会自动落到该端口下第一个加载的业务服务上,自然不会触发404拦截。

配置方案

不需要给每个端口单独写规则,用通配监听+全局default_server做统一兜底即可,步骤如下:

  1. 新建配置文件/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;
}
  1. 你现有的所有业务服务配置不需要做任何修改,保持原有listen 自定义端口、server_name 业务域名的配置即可。当请求的Host头匹配你配置的业务域名时,会自动转发到对应服务,不会触发拦截。
  2. 执行配置校验和重载:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:15:40