如何将tap接口连接到互联网?

How to connect a tap interface to the internet?

作为个人项目,我想使用 C/C++ 并使用 tap 界面构建一个 TCP/IP 堆栈。我有一个连接到互联网的 wlan0 接口(无线)。现在我想通过这个 wlan0 接口从互联网发送和接收数据包。

我该怎么做?

这些是我用来创建我的点击界面的命令:

sudo ip tuntap add name tap1 mode tap  
sudo ip link set tap1 up 
sudo ip link set tap1 promisc on
sudo ip addr add 10.0.0.2/24 dev tap1  
sudo ip route add dev tap1 10.0.0.0/24

这是ip a

的输出
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether dc:f5:05:2c:12:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.14/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0
       valid_lft 84147sec preferred_lft 84147sec
    inet6 fe80::1e59:c571:bc2f:66b9/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
6: tap1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether da:e8:0d:67:e7:fd brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 scope global tap1
       valid_lft forever preferred_lft forever
    inet6 fe80::d8e8:dff:fe67:e7fd/64 scope link 
       valid_lft forever preferred_lft forever

如果你想测试它,这是代码(我还在写它) https://github.com/Bechir-Brahem/tuntap-device

tap 设备只是一个虚拟以太网接口 - 您在其上发送的内容,您可以在设备文件 (/dev/tap) 上读回,以及您写入此设备的内容,作为传入tap0.

上的数据包

你能做什么:

  1. 您可以通过网络链接或原始套接字来完成此操作。本质上,它是一种特殊的套接字类型,您可以在其上发送和接收原始以太网数据包。

  2. 您可以使用 brctl 命令将 tap0wlan0 桥接到 br0 桥中。 Wifi 和以太网接口不能桥接在一起(它们在以太网级别上是不同的,802.11 数据包在 802.3 上没有意义,反之亦然)。

您可能无法在一百 kB 的 C 代码以下创建运行良好的 tcp 实现。这是因为tcp只是在用户层简单。