원시 이더넷 패킷을 사용자 공간 프로그램으로 캡처하려고 합니다. 커널의 TAP/TUN 기능에 대해 읽은 후 다음 설정을 만들었습니다.
두 시스템이 직접 연결되었습니다(크로스오버 케이블). 나는 그들에게 고정 IP 10.0.0.1/24 및 10.0.0.2/24를 제공했습니다. 두 번째 장치에서 내 코드가 손상되어
장치가 성공적으로 열리고(IFF_TAP이 설정됨) tap0이 생성된 것을 볼 수 있으며, 그런 다음 얻은 파일 설명자에서 읽기 시작합니다. 이 시점에서 나는 10.0.0.1에서 10.0.0.2로 ping을 보내고 있는데 내 코드가 이러한 ICMP 바이트를 얻을 것이라고 생각했지만 아무것도 얻지 못했습니다.
다음은 내가 찾은 예를 기반으로 한 몇 가지 코드 조각입니다.
/* Connect to the device */
strcpy(tun_name, "tap0");
tun_fd = tun_alloc(tun_name, IFF_TAP | IFF_NO_PI); /* tapinterface */
if(tun_fd < 0){
exit(1);
}
/* Now read data coming from the kernel */
while(1) {
nread = read(tun_fd,buffer,sizeof(buffer));
if(nread < 0) {
close(tun_fd);
exit(1);
}
/* Do whatever with the data */
}
read() 호출은 영원히 차단되며 데이터가 없습니다.
하지만.. IP 주소(예: 10.0.0.3)로 tap0을 설정하면 커널에서는 많은 패킷을 수신하지만 다른 컴퓨터에서는 ICMP 패킷을 수신하지 않습니다. 또한 이렇게 하면 핑이 발생합니다. 장치는 전까지 응답을 받지 못합니다. 응답을 받았습니다. tap0을 삭제하고 실제(eth0)와 tap0을 연결해도 목표를 달성하지 못했습니다. 무엇을 잘못했습니까?
고마워요, 에이탄.
답변1
Tap/tun 인터페이스는 다음과 같습니다.새로운다른 쪽 끝이 특정 프로그램에 연결된 물리적 네트워크 인터페이스입니다.
그래서 와는 아무런 관련이 없습니다기존의크로스오버 케이블 한쪽 끝에 있는 인터페이스와 같은 물리적 네트워크 인터페이스입니다.
특히, "tap"이라는 이름에도 불구하고 tap/tun 인터페이스를 사용하여 해당 인터페이스에서 패킷을 캡처할 수 없습니다.
이 새로운 인터페이스로 패킷을 라우팅하거나 브리지할 수 있지만 여전히 패킷을 캡처하지 않으며 레벨 2 또는 레벨 3에서 전달되는 패킷만 가져옵니다.