当前想要获取路由器设置的默认 DNS 数据( eg:192.168.1.1 )。
已知这些数据可以通过 DHCP 协议获取,但相应端口已经被占用了(UDP:67),无法直接使用。
目前可以选择针对各个操作系统的 dhcp 客户端解决方案,读取本地缓存的 lease 文件,但很不优雅。
有没有什么手段,能够统一、优雅得读取 lease 数据呢?或者有其它读取对应的 DNS 配置的方式?
1
fonlan 2019-01-29 08:01:45 +08:00 via Android
构造一个 dhcp request 给 dhcp server 然后抓包解析返回的 response
|
2
wweir OP @fonlan 已经这么干了,不过端口被占用,运行起来有点问题。
并且,dhcp 协议里面并没有一个合适的包类型来干这个事 |
3
datocp 2019-01-29 08:24:55 +08:00 via Android
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 |
4
wweir OP |
5
rrfeng 2019-01-29 09:20:54 +08:00 via Android
没明白端口占用是什么问题…
|
6
wweir OP @rrfeng dhcpd / dhcp-client / launnchd 会默认占用 udp 的 67 端口。
我换用非标准的端口做一些尝试,也没有成功,不清楚是端口原因还是哪里没理解到位 |
8
hanbaobao2005 2019-01-29 10:03:47 +08:00
@wweir 会占用端口? 还是你只是看到 dhcpd / dhcp-client / launnchd 的数据包从 UDP 67 发数据了?
是 67 还是 68? |
9
goofool 2019-01-29 10:12:42 +08:00
调用路由器的 API
|
10
goofool 2019-01-29 11:14:24 +08:00
https://gist.github.com/f6622ed29ecc27926d029c388c468894.git
之前用 golang 写的 dhcplib,给你截取一部分,可以用来获取 lease |
11
elfive 2019-01-29 13:17:43 +08:00
Libpcap 手动构造数据包,然后手动抓包解析;
|
13
LGA1150 2019-01-29 15:24:12 +08:00 via Android
你是要在服务器上还是在客户端上获取?
客户端不会占用 UDP 67 |
14
wweir OP |
17
wweir OP @fonlan
@hanbaobao2005 @rrfeng @LGA1150 是的,没占用。 丫的,用的 google 的封装,就没怀疑库的正确性,最后发现,库函数封装错了。 https://godoc.org/go.universe.tf/netboot/dhcp4#Conn.SendDHCP 封装里,只认为 server 端会进行广播,而实际上,dhcp 的第一步,就是客户端进行广播 @goofool @elfive 多谢啦,仔细看了一下 pcap 是个好东西,早看到的话,我就不用手动封装几个 payload 了 |
18
elfive 2019-02-02 09:21:19 +08:00
@wweir 我也是今年接触的,后来 c++写了个基于 pcap 的简单的路由器,理论上你只需要实现 dhcp 协议就行了,伪造数据报文,抓包就行。
|
19
wweir OP @goofool 试了 pcap 方案,感觉太重了,我的需求犯不着用重武器,而且测试代码在 Windows 上有问题 。
目前采取最暴力的做法,自己封装了个跨平台的 DHCP client 的简陋实现,在我的场景下轻量、好用。 https://github.com/wweir/sower/blob/4f8376c0414a6f84d23e9092701e405e46af32a0/dns/dhcp.go#L25 |