写入 Tun/Tap 接口

写入 Tun/Tap 接口

最近我一直在使用一个tun接口通过我的方法重定向互联网流量。为此,我遵循教程。

10.0.0.15我的想法是有一个程序接收通过接口进入的IP数据包tun0并将它们重定向到customSend(),将数据包发送到另一台计算机(使用另一个协议,但这不相关)。另一台计算机将响应该数据包并customRecv()获取它并将其发送到tun0接口。

这是我的代码示例:

void customSend() {
    // whenever a packet is sent from my computer to 10.0.0.15 the
    // read method will be triggered.
    size = read(tunfd, buffer, sizeof(buffer));
    // send packet using another protocol
    write(otherProtocolSendfd, buffer, size);
}

void customRecv() {
    // whenever a packet is received from another protocol
    // this will be triggered
    size = read(otherProtocolRecvfd, buffer, sizeof(buffer));
    // redirect the packet to tun0
    write(tunfd, buffer, size);
}

void main() {
    // init the tun0 interface
    int tunfd = init_tun_interface();
    // create a thread running customSend and one running customRecv
}

为了更容易理解,我将展示一个例子。

  1. 工作站 1 ( 10.0.0.14) ping 工作站 2 ( 10.0.0.15)
  2. ping 应用程序创建一个 ICMP 数据包并通过 发送它tun0
  3. read方法 atcustomSend()拦截 ICMP 数据包。
  4. customSend()线程通过将其发送到另一个协议方法otherProtocolSendfd
  5. 另一个协议通过网络发送消息,并且 ping 数据包到达 Workstation2。
  6. Workstation2 使用 pong 消息进行回复。
  7. 另一个协议接收网络消息并通过写入otherProtocolRecvfd
  8. read方法atcustomRecv()接收响应数据包,并且该write方法将其发送到tun0接口。
  9. tun0接口向 ping 应用程序提供响应 (pong) 数据包。

现在,我已经实现了该customSend()部分,该部分确实可以工作并将消息传输到另一台计算机。

我关心的是写作部分。是否会write实际tunfd将消息发送到接口,或者我会在customSend()方法中接收它,这正是我所期望的。如果是后者,我该如何将消息发送到接口呢?

另外,这是一个更普遍的问题,如果我有一个线程正在执行customToSend(),另一个线程正在执行customRecv(),那么我是否会遇到并发问题,因为两者都在使用tunfd.

谢谢!

相关内容