尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

内网 Elasticsearch 域名 DNS 解析失败导致 ConnectionError 排查指南

内网 Elasticsearch 域名 DNS 解析失败导致 ConnectionError 排查指南 内网 Elasticsearch 域名 DNS 解析失败导致 ConnectionError 排查指南本文记录 Flask 后端调用 Elasticsearch 时出现NameResolutionError/ConnectionError的完整排查过程与解决方案。文中 IP、域名、账号均为示例占位请勿直接照搬生产环境配置。一、问题现象本地启动 Flask 开发服务后调用对比接口返回500控制台报错如下elastic_transport.ConnectionError: Connection error caused by: NameResolutionError( HTTPSConnection(hostelasticsearch.example.corp, port443): Failed to resolve elasticsearch.example.corp ([Errno 11001] getaddrinfo failed) )调用栈大致为app.py → main() → get_time_range() → fetch_cb_report_source() → remoteEs.search()表面看是「连接 ES 失败」但根因往往在DNS 解析阶段连接尚未建立。二、错误链路说明访问https://elasticsearch.example.corp:443举例并非真实 时程序通常分两步步骤动作失败时的表现1DNS 解析域名 → IPgetaddrinfo failed、NameResolutionError2TCP/HTTPS 连接超时、连接被拒绝、证书错误等本次错误发生在第 1 步系统查不到域名对应的 IP后续 HTTPS 请求无法发起Elasticsearch 客户端将其包装为ConnectionError。完整链路Flask 接口 ↓ Elasticsearch 客户端 (remoteEs.search) ↓ urllib3 解析域名 elasticsearch.example.corp ↓ 本机 DNS如 8.8.8.8返回域名不存在 ↓ socket.getaddrinfo 失败 (Windows: Errno 11001) ↓ NameResolutionError → ConnectionError → HTTP 500三、根因分析公网 DNS 为何解析不了内网域名3.1 两类 DNS 的分工公网 DNS如8.8.8.8、114.114.114.114维护互联网上的公开域名记录baidu.com、github.com等。企业内网 DNS如192.168.XX.XX举例并非真实维护公司内部域名例如 ES、数据库、内部 API 等。内网服务域名如elasticsearch.example.corp的 A 记录通常只配置在内网 DNS 上不会写入全球公网 DNS。3.2 典型企业网络模型┌────────────────────────────────────────────────────── ───┐ │ 开发者电脑 │ │ DNS 配置8.8.8.8公网优先 / 192.168.XX.XX内网举例并非真实 │ └──────────────────────────┬───────────────────────── ─────┘ │ 解析 elasticsearch.example.corp │ ┌───────────────┴───────────────┐ ▼ ▼ 公网 DNS (8.8.8.8) 内网 DNS (192.168.XX.XX) ❌ 无此记录 ✅ 192.168.XX.XX0 → Non-existent domain → 返回内网 IP若本机优先使用公网 DNS解析内网域名会直接失败与 ES 服务是否正常无关。3.3 常见原因归纳网卡 DNS 将公网 DNS 设为主、内网 DNS 未生效或排在后面未连接公司 VPN无法使用内网 DNS内网采用Split DNS内外网同一域名不同解析结果外网查不到内网记录ES 使用私有 IP 段如192.168.x.x、10.x.x.x本就不应出现在公网 DNS四、排查步骤4.1 确认是否为 DNS 问题Windows# 使用当前系统 DNSnslookup elasticsearch.example.corp# 指定公网 DNS 测试nslookup elasticsearch.example.corp 8.8.8.8# 指定内网 DNS 测试向网管或同事确认内网 DNS 地址nslookup elasticsearch.example.corp 192.168.XX.XX预期对比测试方式典型结果公网 DNSNon-existent domain/ 找不到内网 DNS返回内网 IP如192.168.XX.XX0若内网 DNS 能解析、公网不能即可确认是DNS 选型问题而非代码逻辑错误。4.2 查看本机 DNS 配置# Windowsipconfig/all# 或 PowerShellGet-DnsClientServerAddress-AddressFamily IPv4关注哪块网卡、DNS 顺序、是否存在VPN 虚拟网卡覆盖 DNS。4.3 绕过 DNS验证 ES 服务本身在已知内网 IP 的前提下由内网 DNS 解析得到勿随意猜测测试连通性# 测试 443 端口需替换为实际内网 IP示例勿用于生产curl-k https://192.168.XX.XX0或使用 Pythonfromelasticsearch8importElasticsearch esElasticsearch(https://用户名:密码192.168.XX.XX0,verify_certsFalse,ssl_show_warnFalse,request_timeout10,)print(es.info())若直连 IP 成功、域名失败进一步证明问题在 DNS不在 ES 集群或业务代码。4.4 查看代码中的 ES 地址业务代码中 ES 客户端常类似fromelasticsearch8importElasticsearch remoteEsElasticsearch(https://用户名:密码elasticsearch.example.corp,verify_certsFalse,ssl_show_warnFalse,request_timeout100000,)域名写死在代码里时本机必须能解析该域名否则所有remoteEs.search()都会在连接前失败。五、解决方案按推荐顺序方案 A调整 DNS推荐长期有效将公司内网 DNS设为主 DNS公网 DNS 作备用。Windows 图形界面控制面板 → 网络和 Internet → 网络连接右键当前网卡 → 属性 → Internet 协议版本 4 (TCP/IPv4)首选 DNS192.168.XX.XX示例以 IT 提供为准备用 DNS8.8.8.8效果内网域名走内网 DNS 解析公网域名仍可正常访问。适用长期在公司内网或稳定 VPN 环境开发。方案 B修改 hosts 文件临时/个人开发在无法立即改 DNS 时可在本机 hosts 中增加静态映射文件路径WindowsC:\Windows\System32\drivers\etc\hosts示例内容需管理员权限编辑192.168.XX.XX0 elasticsearch.example.corp特点项目说明作用范围仅本机影响范围仅该域名生效时间一般立即生效建议重启相关进程维护成本ES IP 变更需手动更新适用快速 unblock 本地开发不建议作为团队统一方案。方案 C连接 VPN在家或外网办公时先连公司 VPN确保能路由到 ES 所在内网网段DNS 流量走 VPN 下发的内网 DNS未连 VPN 时即使 hosts/DNS 配好也可能因路由不可达仍连不上。方案 D环境变量覆盖 ES 地址可选需改代码在data_search.py等模块中支持环境变量便于本地调试importosfromelasticsearch8importElasticsearch _DEFAULT_ES_URLhttps://用户名:密码elasticsearch.example.corpES_URLos.environ.get(ELASTICSEARCH_URL,_DEFAULT_ES_URL)remoteEsElasticsearch(ES_URL,verify_certsFalse,ssl_show_warnFalse,request_timeout100000,)本地临时指定 IP仍须在 VPN/内网可达setELASTICSEARCH_URLhttps://用户名:密码192.168.XX.XX0 python app.py注意不要把含密码的 URL 提交到 Git生产环境用配置中心或密钥管理。六、hosts 方案的影响说明修改 hosts不会修改公司服务器也不会影响其他同事电脑。维度影响作用域仅当前电脑域名仅 hosts 中列出的域名程序所有访问该域名的程序Flask、脚本、curl 等撤销删除对应行即可恢复副作用通常无IP 变更时需同步更新七、如何区分「DNS 问题」与「其他连接问题」错误信息可能原因getaddrinfo failed/NameResolutionErrorDNS 解析失败 → 优先查 DNS / hosts / VPNConnection refused有 IP 但端口未监听或防火墙拦截Connection timed out网络不通、未连 VPN、路由问题401 UnauthorizedDNS 与网络正常账号密码或权限问题SSL certificate verify failed证书问题与 DNS 无关本次案例属于第一类域名都解析不到谈不上连 ES。八、总结ConnectionError 不一定是 ES 挂了要先看是否是NameResolutionError。公网 DNS 不包含企业内网域名记录内网 ES 域名只能由内网 DNS或 hosts解析。排查顺序nslookup 对比公网/内网 DNS → ipconfig 看 DNS 顺序 → 直连 IP 验证 ES → 再改 DNS / hosts / VPN。长期建议内网 DNS 优先临时开发可用 hosts外网必须 VPN。代码中的 ES 域名是内网地址时开发机网络/DNS 必须与生产访问路径一致否则本地必现 ConnectionError。九、附录一键自检脚本Python将ES_HOST替换为你的内网 ES 域名示例域名非真实地址importsocket ES_HOSTelasticsearch.example.corpES_PORT443print( 1. 系统 DNS 解析 )try:ipsocket.gethostbyname(ES_HOST)print(fOK:{ES_HOST}-{ip})exceptsocket.gaierrorase:print(fFAIL:{e})print(→ 检查 DNS / hosts / VPN)print(\n 2. 端口探测需已知 IP 或解析成功 )try:ipsocket.gethostbyname(ES_HOST)socksocket.create_connection((ip,ES_PORT),timeout5)sock.close()print(fOK:{ip}:{ES_PORT}可达)exceptExceptionase:print(fFAIL:{e})声明本文为个人技术总结所有示例代码均为虚构教学模型与任何真实业务系统、公司项目无关。核心目的是分享 多口径查询怎么拆模块。
返回列表