微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

侦听虚拟网络接口 背景实际问题

如何解决侦听虚拟网络接口 背景实际问题

不要被我谈论 L2TP 弄糊涂了。尽管我的问题与 L2TP 相关,但它本身并不是 L2TP 问题。这更像是一个网络问题。

背景

我正在编写一个使用 L2TP 的应用程序。这是我第一次使用 L2TP 和 linux L2TP 子系统,所以我希望我做对了。 创建 L2TP 以太网会话时,子系统会自动创建虚拟网络接口。
启动接口后,我可以使用 Wireshark 进行检查,并且确实将所需的数据发送到接口。这是没有任何包装的。它不在以太网帧或任何东西内,而只是包含在 L2TP 数据包中的数据字节。
我无法控制实际创建设备,但我可以查询它的名称,因此它的索引等,到目前为止一切顺利。

实际问题

我的问题实际上非常简单:如何将发送到虚拟接口的数据获取到我的用户空间应用程序中?
我在 unix 上没有很多网络经验,但我希望这是一个相当简单的问题,可以通过获取我可以使用的文件描述符来解决 read / recv 或以某种方式将套接字绑定到该网络接口。
我找不到任何 (gen-)netlink / ioctl API(或其他任何东西)来执行此操作或类似操作。

尽管我的应用程序是用 GO 而非 C 编写的,但使用 C 的解决方案就完全足够了。 Tbh 在这一点上,我会很高兴任何以编程方式解决此问题的方法。 :)

先谢谢了

解决方法

我刚刚找到了一个教程,可以回答我自己的问题。使用 AF_PACKET 套接字实际上非常简单。

有一个 lovely tutorial on microhowto.info,它解释了 AF_PACKET 套接字的工作原理,比我以往任何时候都好。它甚至包括一个部分“仅从特定的捕获网络接口”


这是一个适用于我的用例的最小示例:

#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <net/ethernet.h>
#include <linux/if_packet.h>
#include <sys/socket.h>

// [...]

// Create socket
int fd = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
if (fd == -1) {
    perror("ERROR socket");
    exit(1);
}

// Interface index (i.e. obtainable via ioctl SIOCGIFINDEX)
int ifindex = 1337;

// create link layer socket address
struct sockaddr_ll addr = {0};
addr.sll_family = AF_PACKET;
addr.sll_ifindex = ifindex;
addr.sll_protocol = htons(ETH_P_ALL)

if (bind(fd,(struct sockaddr*)&addr,sizeof(addr)) == -1) {
    perror("ERROR bind");
    exit(1);
}

char buffer[65535];
ssize_t len;    
do { 
    len = recv(fd,buffer,sizeof(buffer) -1,0);
    if (len < 0) {
        perror("ERROR recvfrom");
        exit(1);
    }
    printf("recived data (length: %i)\n",(int) len);
} while (len > 0);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。