Immutant2 server 日志出现可疑的 Undertow 错误
结论
这通常与应用是否集成 Alipay 无关。从日志看,某个客户端把 Immutant2/Undertow 的 HTTP 端口当作代理服务器,并发送了代理隧道请求:
CONNECT www.alipay.com:443 HTTP/1.1
Undertow 收到了请求,但当前服务只是普通的 Servlet Web 应用,没有配置 HTTP 正向代理,也没有能够处理 CONNECT 方法及该请求目标的 Servlet 路由。因此,Servlet 路径匹配失败并抛出:
UT000068: Servlet path match failed
如果服务端口暴露在公网,常见原因是自动化扫描器在寻找可滥用的开放代理。如果端口只对内网开放,则要检查客户端、系统代理、浏览器扩展或网络设备,确认是否误将该地址设成了代理服务器。
为什么请求中会出现 Alipay
HTTP CONNECT 方法主要用于让代理服务器建立 TCP 隧道,通常用来转发 HTTPS 流量。客户端会直接把目标主机和端口写入请求目标:
CONNECT www.alipay.com:443 HTTP/1.1
Host: www.alipay.com:443
这不代表 Immutant 应用主动连接了 Alipay,也不能说明应用代码引用了支付接口。www.alipay.com:443 只是请求方提供的目标地址,出现在发往服务器的原始 HTTP 请求中。
扫描器可能用这个域名测试代理能否访问一个稳定的 HTTPS 网站,也可能是某个代理检测工具预设了该测试目标。仅凭这一条日志,无法判断请求方的身份或动机。
为什么会触发 UT000068
Servlet 应用通常接收这样的请求:
GET /status HTTP/1.1
Host: example.com
其中的 /status 可以按照 Servlet 映射规则匹配到相应的处理器。
代理形式的 CONNECT 请求则使用 host:port 作为请求目标:
www.alipay.com:443
旧版 Undertow 的 Servlet 路径匹配流程可能无法将这种请求目标作为有效的 Servlet 路径处理,因而抛出 IllegalArgumentException。这条异常更像是一个不适用的请求进入了 Servlet 处理链,不一定说明应用本身发生了业务故障。
建议的排查步骤
1. 确认端口是否暴露在公网
检查防火墙、安全组、路由器端口转发以及容器端口映射。如果测试服务不需要公网访问,应只监听回环地址或内网地址,例如:
(run app {:host "127.0.0.1"
:port 8080})
具体配置取决于 Immutant/WunderBoss 的启动方式。没有确认配置语义前,不要直接照搬这段代码。
2. 查询请求来源
查看 Undertow 访问日志、反向代理日志或防火墙日志,重点记录以下信息:
- 源 IP 和源端口
- 请求时间
- HTTP 方法
- 请求目标
Host、User-Agent等请求头- 同一来源是否还访问了其他代理测试地址
当前的异常堆栈没有源 IP。仅凭这段日志,无法判断请求来自公网、局域网还是本机进程。
3. 检查代理配置
如果源地址属于自己的设备,应检查:
- 操作系统的 HTTP/HTTPS 代理设置
- 浏览器代理设置和扩展
- Java 启动参数,如
http.proxyHost、https.proxyHost HTTP_PROXY、HTTPS_PROXY、ALL_PROXY环境变量- 测试工具、抓包软件、VPN 或网关设备
- 容器和 CI 环境中的代理变量
尤其要确认是否误将应用地址配置成:
http://server-address:application-port
4. 在入口层拒绝 CONNECT
普通 Web 应用通常不需要接受 CONNECT。如果服务前面有 Nginx,可以明确限制该请求方法:
location / {
if ($request_method = CONNECT) {
return 405;
}
proxy_pass http://127.0.0.1:8080;
}
在 Nginx 中使用 if 需要谨慎,这里只是展示一种简单的入口拦截方式。实际配置也可以使用 limit_except、网关策略、WAF 或防火墙。
应用层同样可以拒绝不需要的方法,例如添加 Ring 中间件:
(defn reject-connect [handler]
(fn [request]
(if (= :connect (:request-method request))
{:status 405
:headers {"Content-Type" "text/plain; charset=utf-8"
"Allow" "GET, HEAD, POST, PUT, DELETE, OPTIONS"}
:body "Method Not Allowed"}
(handler request))))
但这段异常可能在请求到达 Ring 处理器之前就已经发生。此时应用中间件无法拦截,需要在反向代理、防火墙或 Undertow 配置层处理。
5. 评估升级 Undertow/Immutant
如果使用的是较旧版本的 Immutant2、Undertow 或 WildFly 组件,可以核对相应版本的变更记录,并在测试环境中评估升级。升级可能改善异常请求的解析和错误处理,但无法代替访问控制,也不能阻止公网扫描。
在确认完整版本、依赖树和部署方式之前,不能断定某个特定版本一定修复了这一现象。
安全方面需要注意什么
只有这一条日志,还不足以证明服务器已被入侵。它首先说明有人或某个程序向服务端口发送了代理格式的请求。
仍需确认服务器没有被配置成可用的开放代理。可以从受控客户端发送测试请求:
curl -v -x http://server-address:port https://example.com/
正常的普通 Web 应用应拒绝该请求,或者无法建立隧道。不要对不属于自己的服务器进行此类测试。
如果请求只出现一两次,来源是陌生的公网 IP,而且代理测试失败,通常可以视为常见的互联网扫描。如果同一来源持续发送请求、请求量明显增加,或者服务器确实成功转发了流量,应立即限制端口访问,检查代理相关配置,并审查网络连接和系统日志。
备注:内容仅供参考。
