Net在arm下实现网络DNS服务

Posted Evan_ZGYF丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Net在arm下实现网络DNS服务相关的知识,希望对你有一定的参考价值。

平台:SSC359G

架构:ARM


摘要:

在arm下之前一直没自己做过dns相关的调试。

测试反馈配置/etc/resolv.conf后,DNS仍然没用

现象是arm开发板配置完IP地址、掩码、网关之后,已经能ping通外部IP。
但是无法进行域名解析。

/usr # ping 180.101.49.11
PING 180.101.49.11 (180.101.49.11): 56 data bytes
64 bytes from 180.101.49.11: seq=0 ttl=51 time=9.405 ms
64 bytes from 180.101.49.11: seq=1 ttl=51 time=9.505 ms
^C
--- 180.101.49.11 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 9.405/9.455/9.505 ms
/usr # 
/usr # ping www.baidu.com
ping: bad address 'www.baidu.com'


解决思路1:

https://www.cnblogs.com/ynxf/p/6367385.html

有文章说当运行ping baidu.com这个命令时,提示 ping bad address baidu.com。
这是因为板子的dns服务还没有配置。
这里 新建/etc/hosts文件(如果存在则只需修改)
内容如下:127.0.0.1   localhost

建立/etc/resolv.conf(DNS域名服务器IP配置)
内容可以从PC Linux上面copy过来,因为PC Linux和开发板链接Internet所需要的DNS域名是一致的
示例内容可以如下:
# Generated by NetworkManager
nameserver 192.168.128.1
nameserver 8.8.8.8
nameserver 192.168.1.1

重启开发板即可。

测试结果:没用。
通过抓包工具抓包,发现ARM设备在ping www.baidu.com时,没有往DNS域名服务器发包。

里面涉及到两个文件:

/etc/hosts(主机名查询静态表)、/etc/resolv.conf(DNS域名服务器IP配置)
/etc/hosts(主机名查询静态表)
hosts文件是Linux系统上一个负责ip地址与域名快速解析的文件,以ascii格式保存在/etc/目录下。
hosts文件包含了ip地址与主机名之间的映射,还包括主机的别名。
在没有域名解析服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的ip地址,否则就需要使用dns服务程序来解决。
通过可以将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问。 

/etc/resolv.conf(DNS域名服务器IP配置)
/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。
该文件是由域名解析器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。
解析域名,由libresolv提供,用法参见man 3 resolver
配置文件,resolv.conf(参看 man 5 resolv.conf)配置dns server的地址,
以及默认域名(即search,搜索指定的dns域), 
host.conf(参看 man 5 resolv.conf) 控制dns请求的行为,以及libresolv的返回结果
ping直接自行解析/etc/hosts, /etc/resolv.conf,发送udp报文发送dns请求


解决思路2

ping 百度域名:ping www.baidu.com,
出现:ping: bad address 'www.baidu.com'
然而直接 ping 百度的 ip 可以 ping 通:ping 202.108.22.5
我以为是因为uClibc没有libnss_dns*,libnss_files*的原因,所以改换了eglibc但是问题依旧,仍然不能够正确进行域名解析。

能PING通外网IP,互联网连接已经通了,需要排查DNS的问题。
运行命令检查DNS的情况:
nslookup www.baidu.com
nslookup www.baidu.com 8.8.8.8
1. 如果有DNS代理,DNS服务是否正常
2. 到DNS服务器的IP是否能PING通
3. 到DNS的UDP端口有没有被防火墙阻隔

测试结果:仍然没用
/ # busybox nslookup www.baidu.com 8.8.8.8
Server:    8.8.8.8
Address 1: 8.8.8.8
nslookup: can't resolve 'www.baidu.com'
通过抓包工具抓包,发现ARM设备在ping www.baidu.com时,没有往DNS域名服务器发包。

里面涉及到一个命令:nslookup

nslookup作用:
查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。
nslookup的用法相对来说还是蛮简单的,主要是下面的几个用法。

直接查询
直接查询域名情况:
命令格式:nslookup domain[dns-server]
示例:nslookup www.baidu.com

返回信息说明
服务器:本机DNS服务器信息
非权威应答:Non-authoritative answer,除非实际存储DNS Server中获得域名解析回答的,都称为非权威应答。也就是从缓存中获取域名解析结果。
address:目标域名对应物理IP可有多个
aliase:目标域名


解决思路3

参考,我换的DNS相关的库,

这些库的来源是直接从厂商提供的SDK里获取到的。

因此遇到这类问题的时候,最好能找对应SOC厂商的FAE寻求一下技术支持,因为大部分通用的库都应该是默认支持了的,有时候可能只是还没添加到文件系统里。

使用mini2440+linux,板子自带的内核,自己做的系统,现在开发板可以ping通外网的IP,但是ping不通域名,
友善的使用手册里讲,只要把etc目录下resolv.conf文件内容改为:nameserver IP(IP为实际的DNS服务器的IP)就可以实现域名解析,
实际测试还是不行。
后来问题解决了,是系统的问题,换过busybox编译的文件就可以用了

尝试把DNS相关的库全部换一遍,看下效果:

把下面的库全部换掉之后,DNS功能正常

 

以上是关于Net在arm下实现网络DNS服务的主要内容,如果未能解决你的问题,请参考以下文章

DNS解析原理

配置内网DNS实现内部域名解析

实战ASP.NET Core 6 部署在 ARM 树莓派实现 DDNS 和网络唤醒

Android性能优化之网络优化DNS和HttpDNS知识详解

实战ASP.NET Core 6 部署在 ARM 树莓派实现 DDNS 和网络唤醒

网络应用