登录
首页 >  Golang >  Go问答

golang实现物理网卡的IP包发送方式

来源:stackoverflow

时间:2024-02-09 16:18:24 126浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《golang实现物理网卡的IP包发送方式》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我在Windows客户端上设置了一个虚拟网卡(TUN),以便VPN获取流量。在捕获虚拟网卡流量时,我执行以下资源判断逻辑:访问某些资源时,流量(IP数据包)不会通过VPN通道发送。我想直接通过物理网卡发送流量(IP 数据包)。 现在的问题是如何让物理网卡直接发送的流量。

--系统:WINDOWS --语言:GOLAN

我尝试通过解析IP数据包并绑定网络适配器地址来发送来模拟TCP/UDP,但这太慢了。 有没有办法直接绑定物理网卡并发送IP包?


正确答案


从 windows xp 开始禁用原始套接字,因此您需要第三方软件来注入 ip 数据包。

我为此使用了 winpcap 库。 go 绑定存在: https://pkg.go.dev/github.com /google/gopacket/pcap

将以太网帧写入数据链路的函数是 handle .writepacketdata

步骤是:

  1. 使用 openlive 创建物理网卡的句柄
  2. 将 ip 封装到数据链路层帧中
  3. 使用 handle.writepacketdata 将帧写入句柄

第 1 步中最棘手的部分是接口的名称。在 windows 中没有 eth0 这样的名称。所需名称类似于 \device\npf_{bbeccd43-3f2b-4594-b17b-5f38e73787e8}

要获取设备的正确名称,您可以查询 findalldevs 函数。作为管理员

package main

import (
    "fmt"

    "github.com/google/gopacket/pcap"
)

func main() {
    // get device list - run as administrator!
    devices, err := pcap.findalldevs()
    if err != nil {
        panic(err)
    }

    // print device information
    fmt.println("devices:")
    for _, device := range devices {
        fmt.println("-----------------------")
        fmt.println("name: ", device.name)
        fmt.println("description: ", device.description)
        fmt.println("addresses: ", device.description)
        for _, address := range device.addresses {
            fmt.println("  ip address: ", address.ip)
            fmt.println("  netmask: ", address.netmask)
        }
    }
}

示例输出(这是我的 wifi 适配器):

-----------------------
Name:  \Device\NPF_{BBECCD43-3F2B-4594-B17B-5F38E73787E8}
Description:  Microsoft
Addresses:  Microsoft
  IP address:  fe80::de52:6717:446:57a1
  Netmask:  
  IP address:  172.30.1.95
  Netmask:  ffffff00

好了,本文到此结束,带大家了解了《golang实现物理网卡的IP包发送方式》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>