我试图发送由服务器端ServeDHCP处理的假udp(一个随机的MAC地址,假设为01:ff:ff:ff:ff:ff:ff)包,我正在运行以下dhcpv4 github存储库github.com/krolaw/dhcp4

发送发现程序包的目的是检查dhcp是否仍然有效。

实际上,我创建了一个名为check的新功能。

func (h *DHCPHandler) check () {
    con, err = net.Dial("udp", "127.0.0.1:67")
    for {
            //fake udp package???
            time.Sleep(10 * time.Minute)
    }

}

在函数的主体中,我有以下调用go handler.check()
在ServeDHCP中,我应该传递以下参数:func (h *DHCPHandler) ServeDHCP(p dhcp.Packet, msgType dhcp.MessageType, options dhcp.Options)
如何从功能支票中寄出伪造的upd包裹?

最佳答案

最后,我设法使此检查在10分钟内发送了一个更新的软件包,该软件包带有一个我知道永远不会到达的mac地址,如下所示。

func (h *DHCPHandler) check() {
    //Fetch parameters from config file
    config := getConfig() // here is a mac saved on a json file 01:ff:ff:ff:ff:ff
    macFake, err := net.ParseMAC(config.MacFake)

    if err != nil {
            fmt.Println("error with the fake mac provided on the json file", err)
    }

    // create connection
    conn, err := net.Dial("udp4", "127.0.0.1:67")
    if err != nil {
            fmt.Println("error with the connection", err)
    }

    //stay alive
    for {
            fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
            conn.Write(dhcp.RequestPacket(dhcp.Discover, macFake, h.ip, []byte{0, 1, 2, 3}, true, nil))
            time.Sleep(10 * time.Minute)
    }

}

在主要功能上,我只需要调用此检查goroutine并在服务器端(ServeDHCP)上添加以下代码:
    mac := p.CHAddr().String()
    //Fetch parameters from config file
    config := getConfig()
    if mac == config.MacFake { //udp package received and a mac saved on a json file 01:ff:ff:ff:ff:ff
            // send notification to restart if failure on a systemd
            daemon.SdNotify(false, "WATCHDOG=1")
            return
    }

最后一部分需要添加systemd检查,以我为例,我每10分钟发送一次看门狗,因此systemd检查将被设置为11min
[Service]
ExecStartPre=//something
WatchdogSec=11min
Restart=on-failure

关于go - 如何在Golang中发送伪造的udp软件包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47633520/

10-13 05:09