亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在數據鏈路層(以太網)監聽并在傳輸層響應

如何在數據鏈路層(以太網)監聽并在傳輸層響應

Go
慕哥9229398 2022-06-06 16:04:22
我想做的是監聽 IPv6 的以太網幀并響應特定端口上的 UDP 調用。我能夠捕獲我關心的以太網幀并解析出 UDP 有效負載,但是當我嘗試回顯該有效負載時,我遇到了問題。這是我的“服務器”代碼:func main() {    fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, int(htons(syscall.ETH_P_IPV6)))    iface, err := net.InterfaceByName("lo")    if err != nil {        log.Fatal(err)    }    err = syscall.BindToDevice(fd, iface.Name)    if err != nil {        log.Fatal(err)    }    for {        buf := make([]byte, iface.MTU)        n, callerAddr, err := syscall.Recvfrom(fd, buf, 0)        if err != nil {            log.Fatal(err)        }        data := buf[:n]        packet := gopacket.NewPacket(data, layers.LayerTypeEthernet, gopacket.Default)        udpPacket := packet.Layer(layers.LayerTypeUDP)        if udpPacket != nil {            udpPck, _ := udpPacket.(*layers.UDP)            // I only care about calls to 8080 for this example            if udpPck.DstPort != 8080 {                continue            }            err = udpPck.SetNetworkLayerForChecksum(packet.NetworkLayer()); if err != nil {                log.Fatal(err)            }            log.Print(packet)            log.Printf("UDP Port from %v --> %v", udpPck.SrcPort, udpPck.DstPort)            log.Printf("Payload '%v'", string(udpPck.Payload))            // Flip the source and destination so it can go back to the caller            ogDst := udpPck.DstPort            udpPck.DstPort = udpPck.SrcPort來自客戶端的問題是連接被拒絕read udp6 [::1]:56346->[::1]:8080: recvfrom: connection refused,我的猜測是來自 linux 內核,因為嚴格來說我沒有將任何東西綁定到 8080。我需要來自 IPv6 標頭的數據(上面未顯示),這就是為什么我需要在數據鏈路層上監聽的原因,但由于我還需要響應 UDP 請求,所以事情變得有點棘手。我有但不喜歡的一個選項是在一個單獨的 goroutine 中執行一個標準net.ListenUDP,然后在讀取數據后阻塞,直到從 syscall 套接字偵聽器讀取 IPv6 標頭,然后從那里響應 udp 連接。如果這是我唯一的選擇,我會接受它,但我很想看看是否有更好的方法可以做。
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

我認為即使您通過構建鏈路層幀進行響應,您仍然需要偵聽 UDP 端口。否則系統的網絡堆棧將以 ICMP 消息響應,這就是導致“連接被拒絕”錯誤的原因。

我還沒有嘗試過,但我認為如果你從接口中刪除 IP 地址,它會阻止內核 IP 堆棧在其上運行。但是,您可能需要處理一些 ARP 消息。

或者,您可以嘗試使用TUN/TAP 接口,這樣您就可以完全控制從用戶空間發生的事情。


查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 497 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號