是否有通用的方法获取当前 DHCP lease 的 DNS 信息

2019-01-28 23:34:50 +08:00
 wweir

当前想要获取路由器设置的默认 DNS 数据( eg:192.168.1.1 )。

已知这些数据可以通过 DHCP 协议获取,但相应端口已经被占用了(UDP:67),无法直接使用。

目前可以选择针对各个操作系统的 dhcp 客户端解决方案,读取本地缓存的 lease 文件,但很不优雅。

有没有什么手段,能够统一、优雅得读取 lease 数据呢?或者有其它读取对应的 DNS 配置的方式?

5492 次点击
所在节点    DNS
19 条回复
fonlan
2019-01-29 08:01:45 +08:00
构造一个 dhcp request 给 dhcp server 然后抓包解析返回的 response
wweir
2019-01-29 08:19:56 +08:00
@fonlan 已经这么干了,不过端口被占用,运行起来有点问题。
并且,dhcp 协议里面并没有一个合适的包类型来干这个事
datocp
2019-01-29 08:24:55 +08:00
dhcp-option=br-TAP_SOFT,3
#
dhcp-option=br-TAP_SOFT,6,192.168.30.253
dhcp-option=br-TAP_SOFT,121,192.168.1.0/24,192.168.30.253

Dnsmasq 的话应该是 option 6 指定 dns
wweir
2019-01-29 09:00:59 +08:00
@datocp 是的,我也看到了这个做法,完全没问题的。

不过,我这强迫症又犯了,总想着能有一个通用一点的、跨平台的方式来获取这个数据。
要是实在不行,估计最后还得回退到这个方案。
rrfeng
2019-01-29 09:20:54 +08:00
没明白端口占用是什么问题…
wweir
2019-01-29 09:37:22 +08:00
@rrfeng dhcpd / dhcp-client / launnchd 会默认占用 udp 的 67 端口。
我换用非标准的端口做一些尝试,也没有成功,不清楚是端口原因还是哪里没理解到位
fonlan
2019-01-29 09:53:34 +08:00
@wweir 我说的是用 tcpdump 之类的方式抓包,根本不关端口的事儿,直接在网卡上抓
hanbaobao2005
2019-01-29 10:03:47 +08:00
@wweir 会占用端口? 还是你只是看到 dhcpd / dhcp-client / launnchd 的数据包从 UDP 67 发数据了?
是 67 还是 68?
goofool
2019-01-29 10:12:42 +08:00
调用路由器的 API
goofool
2019-01-29 11:14:24 +08:00
https://gist.github.com/f6622ed29ecc27926d029c388c468894.git

之前用 golang 写的 dhcplib,给你截取一部分,可以用来获取 lease
elfive
2019-01-29 13:17:43 +08:00
Libpcap 手动构造数据包,然后手动抓包解析;
rrfeng
2019-01-29 14:13:37 +08:00
@wweir client 没道理占一个端口,我觉得可以再研究一下。
LGA1150
2019-01-29 15:24:12 +08:00
你是要在服务器上还是在客户端上获取?
客户端不会占用 UDP 67
wweir
2019-01-29 18:21:17 +08:00
wweir
2019-01-29 18:23:21 +08:00
@LGA1150 占用的,可通过如下命令确认
sudo lsof -i ":67"
LGA1150
2019-01-29 18:34:16 +08:00
@wweir 确定是客户端占用的 UDP 67 ??哪个进程?
wweir
2019-02-01 22:57:34 +08:00
@fonlan
@hanbaobao2005
@rrfeng
@LGA1150
是的,没占用。
丫的,用的 google 的封装,就没怀疑库的正确性,最后发现,库函数封装错了。
https://godoc.org/go.universe.tf/netboot/dhcp4#Conn.SendDHCP
封装里,只认为 server 端会进行广播,而实际上,dhcp 的第一步,就是客户端进行广播

@goofool
@elfive
多谢啦,仔细看了一下 pcap 是个好东西,早看到的话,我就不用手动封装几个 payload 了
elfive
2019-02-02 09:21:19 +08:00
@wweir 我也是今年接触的,后来 c++写了个基于 pcap 的简单的路由器,理论上你只需要实现 dhcp 协议就行了,伪造数据报文,抓包就行。
wweir
2019-03-12 11:17:46 +08:00
@goofool 试了 pcap 方案,感觉太重了,我的需求犯不着用重武器,而且测试代码在 Windows 上有问题 。

目前采取最暴力的做法,自己封装了个跨平台的 DHCP client 的简陋实现,在我的场景下轻量、好用。
https://github.com/wweir/sower/blob/4f8376c0414a6f84d23e9092701e405e46af32a0/dns/dhcp.go#L25

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531404

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX