记一次公网接口访问异常(dns异常)(处理过程记录)
背景
接项目经理反馈业务不好使,研发通过应用日志发现是访问互联网的某个接口请求失败。我接力继续排查
分析
1.拿接口到互联网前置机curl一下
这边用百度代替
curl https://www.baidu.com -s -w '\n状态码:%{http_code}\nhttp连接耗时:%{http_connect} \n域名解释耗时:%{time_namelookup} \n建立tcp时长:%{time_connect} \n预传输耗时:%{time_pretransfer} \n客户端到服务器时长:%{time_starttransfer} \n总耗时:%{time_total} \n下载大小:%{size_download} \n下载速度:%{speed_download}'
可以看到有时候能用,有时候不能用。
有tcp三次握手,肯定要先做dns解析。所有有必要查下dns的配置。
2.查看dns的配置
nmcli dev show | grep DNS
cat /etc/resolv.conf
3.ping一下DNS(不通)
ping 114.114.114.114
试了好几次都ping不通,这不能说明什么,继续
4.检查下dns
nslookup www.baidu.com 114.114.114.114
也有时候可以,有时候不行
基本可以确认dns不好使。
阶段结论1
怀疑客户的网络环境出口对114.114.114.114有什么限制,联系客户排查安全相关系统或者防火墙之类的有没有什么报错,大概率是这方面受限。或者提供客户自己的dns,替换dns,再继续排查。
新dns配置并继续排查
由于客户要求,禁用114.114.114.114,给了个他们自己的dns服务器地址218.85.152.99
配置新dns配置
1.修改xxxxx进行配置
查看连接名,并修改配置
nmcli dev show|grep CONNECTION ##确认连接名
nmcli con mod "ens160" ipv4.dns "218.85.152.99"
nmcli con show "ens160" | grep 'ipv4.dns' ##查看修改是否成功
systemctl restart NetworkManager ##重启一下
2.修改/etc/resolv.conf
[root@centos goproxy]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 218.85.152.99
禁用服务器本身的ipv6
1.修改配置1
vim /etc/sysctl.conf
---
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
---
sysctl -p #立即生效
检查禁用ipv6是否生效
sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6
sysctl net.ipv6.conf.lo.disable_ipv6
2.修改配置2
nmcli con modify ens160 ipv6.method ignore
nmcli conn sho ens160 | grep ipv6.method
systemctl restart NetworkManager
继续排查
部署个goproxy验证一下日志
阶段结论2
按道理不应该再解析成ipv6地址,但确实还是如此,那就有一种可能性,那就是DNS服务器强制返回IPv6地址,继续找客户协助排查。
换个角度思考
一直找不到解析成ipv6的原因,那就用解决问题的思路来处理。两种办法:
方法一:
目前国内提供的DNS基本上都能解析成ipv4和ipv6,既然如此,用dnsmasq做个本地DNS缓存,设置只解析成ipv4,给服务器用。
以下是dnsmasq配置模版
https://thekelleys.org.uk/dnsmasq/docs/dnsmasq.conf.example
以下是dnsmasq的man
https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
以下是dnsmasq的CHANGELOG
https://thekelleys.org.uk/dnsmasq/CHANGELOG
好像也没找到禁止解析ipv6的方法。
偷懒问了AI老师,ipv4-only,检查都过不去(版本更迭变化很大)
[root@centos goproxy]# cat /etc/dnsmasq.conf
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
server=8.8.8.8
cache-size=1000
no-negcache
no-resolv
ipv4-only
[root@centos goproxy]# dnsmasq --test
dnsmasq: bad option at line 6 of /etc/dnsmasq.conf
有个大佬说可以通过如下配置禁止ipv6查询,但是我试了还是不行。。。我的版本是2.76
https://www.haiyun.me/archives/1348.html
#所有com域名禁止ipv6查询
server=/com/8.8.8.8
address=/com/::
#所有域名过滤ipv6查询
server=/#/8.8.8.8
address=/#/::
学艺不精,年底工作量大,任务重,也没时间研读,后续再研究,等大佬带我飞。
方法二:
1.只找能解析成ipv4的DNS来用。
2.只能解析成ipv4的DNS大多数是国外的DNS,为避免延迟问题,做个本地DNS缓存。(有国内的安全稳定的跪求推荐!!!)
[root@centos goproxy]# cat /etc/dnsmasq.conf
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
server=9.9.9.9
server=149.112.112.112
server=1.1.1.1
#所有域名过滤ipv6查询
#server=/#/8.8.8.8
#address=/#/::
#server=/com/8.8.8.8
#address=/com/::
cache-size=1000
no-negcache
no-resolv
检测效果
[root@centos goproxy]# nslookup www.baidu.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
www.a.shifen.com canonical name = www.wshifen.com.
Name: www.wshifen.com
Address: 103.235.46.96
Name: www.wshifen.com
Address: 103.235.47.188
----问题就先这么解决吧。。。。。。。。。。。。。。
----哪天Quad9公共DNS服务或者CloudFlare DNS给我掉链子了,那就扯淡了。
----有空还得想办法看怎么过滤。
----实在不想写死,不好维护。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤