首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  DNS

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

  •  
  •   wweir · 261 天前 · 2282 次点击
    这是一个创建于 261 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    19 回复  |  直到 2019-03-12 11:17:46 +08:00
        1
    fonlan   261 天前 via Android
    构造一个 dhcp request 给 dhcp server 然后抓包解析返回的 response
        2
    wweir   261 天前 via Android
    @fonlan 已经这么干了,不过端口被占用,运行起来有点问题。
    并且,dhcp 协议里面并没有一个合适的包类型来干这个事
        3
    datocp   261 天前 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   261 天前 via Android
    @datocp 是的,我也看到了这个做法,完全没问题的。

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

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

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

    目前采取最暴力的做法,自己封装了个跨平台的 DHCP client 的简陋实现,在我的场景下轻量、好用。
    https://github.com/wweir/sower/blob/4f8376c0414a6f84d23e9092701e405e46af32a0/dns/dhcp.go#L25
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4203 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 08:43 · PVG 16:43 · LAX 01:43 · JFK 04:43
    ♥ Do have faith in what you're doing.