是否有通用的方法获取当前 DHCP lease 的 DNS 信息 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX    DNS

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

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

    当前想要获取路由器设置的默认 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
    @rrfengdhcpd / 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     Solana     944 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:07 PVG 06:07 LAX 15:07 JFK 18:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86