记一次公网接口访问异常(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给我掉链子了,那就扯淡了。
----有空还得想办法看怎么过滤。
----实在不想写死,不好维护。

posted @   海yo  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示