Nginx无法基于客户端源端口拦截请求,因TCP源端口在HTTP层不可见;实际可操作的是限制监听端口访问范围、清洗Host头、禁用非必要HTTP方法、强制Host头及UA校验。

直接拒绝来自非标准端口的 HTTP 请求,Nginx 本身无法“感知”客户端发起请求时使用的源端口(TCP 源端口属于传输层,HTTP 协议层不可见),因此不能基于客户端源端口做清洗或拦截。所谓“来自非标准端口的请求”,实际是误解——浏览器或客户端无论用什么源端口(如 54321、60000)发起 HTTP 请求,到达 Nginx 时,只体现为一个目标 IP+目标端口(如 192.168.1.10:8080)的 TCP 连接,Nginx 只能控制自己监听的端口,无法得知对方用了哪个端口。
真正可操作:拦截发往非标准监听端口的非法请求
你真正能控制的是 Nginx 自己监听哪些端口,以及对进入这些端口的请求做合规性检查。常见需求其实是:只允许特定端口(如 80/443)接收公网流量,其他监听端口(如 8080、9001)仅限内网或运维访问,对外一律拒绝。这需要两层配合:
- 在
server块中明确指定listen端口,并通过allow/deny限制来源 IP - 对未授权来源的请求,直接返回
444(静默断连)或403
例如,只允许内网访问 8080 端口:
server {listen 8080;
server_name _;
allow 10.0.0.0/8;
allow 172.16.0.0/12;
allow 192.168.0.0/16;
deny all;
return 444;
}
清洗 Host 头与协议头,防止端口伪造绕过
攻击者可能通过构造异常 Host 头(如 example.com:8080)试图诱导后端误判端口或触发 SSRF。Nginx 可主动清洗或校验:
- 统一覆盖
Host头,不透传原始值:proxy_set_header Host $host;或更严格地写死:proxy_set_header Host backend.example.com; - 拒绝含端口号的 Host 请求(适用于不允许端口出现在 Host 的场景):
return 400;
}
该规则会拦截类似 Host: api.example.com:8080 的请求,返回 400 Bad Request。
禁用非必要 HTTP 方法,缩小攻击面
非标准端口常被用于开发或内部服务,若暴露公网,需严控方法。使用 limit_except 仅放行必需方法:
limit_except GET HEAD {
deny all;
}
}
这样 PUT、DELETE、TRACE、OPTIONS 等方法全部被拒,返回 405。若需支持 CORS,可单独放开 OPTIONS:
location /api/ {limit_except GET POST OPTIONS { deny all; }
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range";
add_header Access-Control-Max-Age 1728000;
add_header Access-Control-Expose-Headers "Content-Length,Content-Range";
return 204;
}
}
验证并阻断无 Host 头或非法协议请求
HTTP/1.0 或恶意扫描器常省略 Host 头,或发送非法协议标识(如 GET / HTTP/0.9)。Nginx 虽不直接校验版本字符串,但可通过以下方式就地拒绝:
- 强制要求 Host 头存在(拦截绝大多数 HTTP/1.0 请求):
return 400;
}
- 拒绝空 User-Agent 或已知恶意 UA(如扫描器):
if ($http_user_agent ~* "(sqlmap|nmap|nikto|wget|curl)") { return 403; }


















