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

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

  •  
  •   wweir · 2019-01-28 23:34:50 +08:00 · 5496 次点击
    这是一个创建于 2154 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    之前用 golang 写的 dhcplib,给你截取一部分,可以用来获取 lease
    elfive
        11
    elfive  
       2019-01-29 13:17:43 +08:00
    Libpcap 手动构造数据包,然后手动抓包解析;
    rrfeng
        12
    rrfeng  
       2019-01-29 14:13:37 +08:00 via Android
    @wweir client 没道理占一个端口,我觉得可以再研究一下。
    LGA1150
        13
    LGA1150  
       2019-01-29 15:24:12 +08:00 via Android
    你是要在服务器上还是在客户端上获取?
    客户端不会占用 UDP 67
    wweir
        15
    wweir  
    OP
       2019-01-29 18:23:21 +08:00
    @LGA1150 占用的,可通过如下命令确认
    sudo lsof -i ":67"
    LGA1150
        16
    LGA1150  
       2019-01-29 18:34:16 +08:00 via Android
    @wweir 确定是客户端占用的 UDP 67 ??哪个进程?
    wweir
        17
    wweir  
    OP
       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
        18
    elfive  
       2019-02-02 09:21:19 +08:00
    @wweir 我也是今年接触的,后来 c++写了个基于 pcap 的简单的路由器,理论上你只需要实现 dhcp 协议就行了,伪造数据报文,抓包就行。
    wweir
        19
    wweir  
    OP
       2019-03-12 11:17:46 +08:00
    @goofool 试了 pcap 方案,感觉太重了,我的需求犯不着用重武器,而且测试代码在 Windows 上有问题 。

    目前采取最暴力的做法,自己封装了个跨平台的 DHCP client 的简陋实现,在我的场景下轻量、好用。
    https://github.com/wweir/sower/blob/4f8376c0414a6f84d23e9092701e405e46af32a0/dns/dhcp.go#L25
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2918 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:52 · PVG 21:52 · LAX 05:52 · JFK 08:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.