记一次公网接口访问异常(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

![](https://img2024.cnblogs.com/blog/3076989/202412/3076989-20241204191509885-1485929675.png)
![](https://img2024.cnblogs.com/blog/3076989/202412/3076989-20241204190318737-1992521842.png)
![](https://img2024.cnblogs.com/blog/3076989/202412/3076989-20241204190339992-998541305.png)

**----问题就先这么解决吧。。。。。。。。。。。。。。**
**----哪天Quad9公共DNS服务或者CloudFlare DNS给我掉链子了,那就扯淡了。**
**----有空还得想办法看怎么过滤。**
**----实在不想写死,不好维护。**




posted @ 2024-11-27 16:53  海yo  阅读(375)  评论(0)    收藏  举报