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메소드는 customSend()ICMP 패킷을 가로챕니다.
  4. customSend()다른 프로토콜 메소드로 전송하여 스레드합니다 otherProtocolSendfd.
  5. 다른 프로토콜이 네트워크를 통해 메시지를 보내고 ping 패킷이 Workstation2에 도착합니다.
  6. Workstation2는 탁구 메시지로 응답합니다.
  7. 또 다른 프로토콜은 네트워크 메시지를 수신하여 다음과 같이 씁니다.otherProtocolRecvfd
  8. read메소드는 customRecv()응답 패킷을 수신하고 이 write메소드는 이를 tun0인터페이스로 보냅니다.
  9. tun0인터페이스는 ping 애플리케이션에 응답(퐁) 패킷을 제공합니다.

이제 해당 부분을 구현했으므로 customSend()실제로 작동하고 메시지를 다른 컴퓨터로 전송합니다.

제가 신경쓰는 부분은 글쓰기 부분이에요. 메시지가 write실제로 tunfd인터페이스로 전송됩니까, 아니면 메서드에서 메시지가 수신됩니까 ? customSend()이것이 제가 기대하는 것입니다. 후자인 경우 인터페이스에 메시지를 어떻게 보내나요?

또한 이것은 보다 일반적인 질문입니다. 하나의 스레드가 실행되고 customToSend()다른 스레드가 실행되는 경우 customRecv()둘 다 를 사용하므로 동시성 문제가 발생합니까 tunfd?

감사해요!

관련 정보