为了账号安全,请及时绑定邮箱和手机立即绑定

如何在数据链路层(以太网)监听并在传输层响应

如何在数据链路层(以太网)监听并在传输层响应

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 关注
  • 537 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号