记一次公网接口访问异常(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的原因,那就用解决问题的思路来处理。
禁用 IPv6 DNS 查询
编辑 /etc/resolv.conf,添加以下选项:
bash
echo "options single-request" >> /etc/resolv.conf
echo "options timeout:1 attempts:1" >> /etc/resolv.conf
另外补充:
cat /etc/nsswitch.conf | grep hosts
典型输出:
hosts: files dns myhostname
ps:
files:表示先查 /etc/hosts
dns:表示使用 DNS 服务器(通过 /etc/resolv.conf)
myhostname:使用系统主机名
另外还要查下hostname -i,如果要卡很久才出来,就按下面处理
echo "172.20.200.13 $(hostname)" >> /etc/hosts
echo "172.20.200.13 $(hostname -s)" >> /etc/hosts
问题解决!!!!
被pass掉的两种办法:
#方法一:
目前国内提供的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给我掉链子了,那就扯淡了。**
**----有空还得想办法看怎么过滤。**
**----实在不想写死,不好维护。**

浙公网安备 33010602011771号