最近我一直在使用一个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 (
10.0.0.14
) ping 工作站 2 (10.0.0.15
) - ping 应用程序创建一个 ICMP 数据包并通过 发送它
tun0
。 read
方法 atcustomSend()
拦截 ICMP 数据包。customSend()
线程通过将其发送到另一个协议方法otherProtocolSendfd
。- 另一个协议通过网络发送消息,并且 ping 数据包到达 Workstation2。
- Workstation2 使用 pong 消息进行回复。
- 另一个协议接收网络消息并通过写入
otherProtocolRecvfd
read
方法atcustomRecv()
接收响应数据包,并且该write
方法将其发送到tun0
接口。tun0
接口向 ping 应用程序提供响应 (pong) 数据包。
现在,我已经实现了该customSend()
部分,该部分确实可以工作并将消息传输到另一台计算机。
我关心的是写作部分。是否会write
实际tunfd
将消息发送到接口,或者我会在customSend()
方法中接收它,这正是我所期望的。如果是后者,我该如何将消息发送到接口呢?
另外,这是一个更普遍的问题,如果我有一个线程正在执行customToSend()
,另一个线程正在执行customRecv()
,那么我是否会遇到并发问题,因为两者都在使用tunfd
.
谢谢!