가상 네트워크 카드 드라이버 TUN/TAP(2)-테스트 인 스 턴 스

5068 단어 링크 ux 구동
1.커 널 설정
이 가상 네트워크 카드 드라이버 를 사용 할 때 커 널 을 설정 해 야 합 니 다:Device Drivers=>Network device support=>Universal TUN/TAP device driver support 
2.사례 및 분석12 #include
13
14 int tun_create(char *dev, int flags)
15 {
16     struct ifreq ifr;
17     int fd, err;
18
19     assert(dev != NULL);
20
21     if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
22         return fd;
23
24     memset(&ifr, 0, sizeof(ifr));
25     ifr.ifr_flags |= flags;
26     if (*dev != '\0')
27         strncpy(ifr.ifr_name, dev, IFNAMSIZ);
28     if ((err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0) {
29         close(fd);
30         return err;
31     }
32     strcpy(dev, ifr.ifr_name);
33
34     return fd;
35 }

TUN/TAP 장 치 를 사용 하기 위해 서 는 특정한 헤더 파일 linux/if 를 포함해 야 합 니 다.tun.h,12 줄 과 같 습 니 다.21 줄 에서 문자 장치/dev/net/tun 을 열 었 습 니 다.다음은 ioctl 의 TUNSETIFF 명령 을 위해 구조 체 ifr 를 초기 화 해 야 합 니 다.보통 두 멤버 에 게 만 관심 을 가 져 야 합 니 다 ifrname, ifr_flags。ifr_name 은 만 들 거나 열 가상 네트워크 장치 의 이름 을 정의 합 니 다.비어 있 거나 이 네트워크 장치 가 존재 하지 않 으 면 커 널 은 가상 네트워크 장 치 를 새로 만 들 고 새로운 가상 네트워크 장치 의 이름 을 되 돌려 줍 니 다.또한 파일 설명자 fd 도 이 네트워크 설정 과 연 결 됩 니 다.네트워크 장치 의 이름 이 지정 되 지 않 으 면 커 널 은 그 유형 에 따라 tunXX 와 tapXX 를 자동 으로 선택 합 니 다.ifr_flags 는 네트워크 장치 의 일부 속성 을 설명 하 는데 사용 합 니 다.예 를 들 어 점 대 점 장치 입 니까?아니면 이 더 넷 장치 입 니까?자세 한 옵션 설명 은 다음 과 같 습 니 다.
  • IFF_TUN:점대 점 설 비 를 만 듭 니 다
  • IFF_TAP:이 더 넷 장 치 를 만 듭 니 다
  • IFF_NO_PI:패 킷 정 보 를 포함 하지 않 습 니 다.기본 패 킷 은 사용자 공간 에 전 달 될 때 패 킷 정 보 를 저장 하 는 추가 패 킷 을 포함 합 니 다
  • IFF_ONE_QUEUE:단일 대기 열 모드 를 사용 합 니 다.즉,패 킷 대기 열 이 가득 찼 을 때 가상 네트워크 장치 가 패 킷 대기 열 에 여유 가 있 을 때 까지 버 립 니 다

  • 설정 할 때 IFFTUN 과 IFFTAP 는 하 나 를 선택해 야 하고,다른 옵션 은 임의로 조합 할 수 있 습 니 다.그 중 IFFNO_PI 가 열 리 지 않 았 을 때 추 가 된 가방 정보 머리 는 다음 과 같 습 니 다.struct tun_pi {
        unsigned short flags;
        unsigned short proto;
    };

    현재 flags 는 패 킷 을 받 을 때 만 유효 합 니 다.TUNPKT_STRIP 로고 가 설치 되 었 을 때 현재 사용자 공간 버퍼 가 너무 작 아서 패 킷 이 차단 되 었 음 을 표시 합 니 다.proto 구성원 은 패 킷 을 보 내 거나 받 는 프로 토 콜 을 표시 합 니 다.
    위의 코드 에 있 는 파일 설명자 fd 는 TUN 을 지원 하 는 것 을 제외 하고SETIFF 와 다른 일반적인 ioctl 명령 외 에 다음 명령 도 지원 합 니 다.
    4.567917.TUNSETNOCSUM:검사 와 검 사 를 하지 않 습 니 다.인자 가 int 형의 bool 값 입 니 다
  • TUNSETPERSIST:대응 하 는 네트워크 장 치 를 지속 모드 로 설정 하고 기본 적 인 가상 네트워크 장 치 는 관련 파일 문자 가 닫 히 면 이와 관련 된 경로 등 정보 가 동시에 사라 집 니 다.지속 모드 로 설정 하면 나중에 사용 할 수 있 도록 유 지 됩 니 다.인자 가 int 형의 bool 값 입 니 다

  • 4.567917.TUNSETOWNER:네트워크 장 치 를 설치 한 소유자.매개 변수 유형 uidt。
  • TUNSETLINK:네트워크 장치 의 링크 유형 을 설정 합 니 다.이 명령 은 가상 네트워크 장치 가 꺼 진 상태 에서 만 유효 합 니 다.인 자 는 int 형 입 니 다

  • 작은 실례int main(int argc, char *argv[])
    {
            int tun, ret;
            char tun_name[IFNAMSIZ];
            unsigned char buf[4096];

             tun_name[0] = '\0';
             tun = tun_create(tun_name, IFF_TUN | IFF_NO_PI);
            if (tun < 0) {
                    perror("tun_create");
                    return 1;
            }
            printf("TUN name is %s
    ", tun_name);

            while (1) {
                    unsigned char ip[4];

                     ret = read(tun, buf, sizeof(buf));
                    if (ret < 0)
                            break;
                    memcpy(ip, &buf[12], 4);
                    memcpy(&buf[12], &buf[16], 4);
                    memcpy(&buf[16], ip, 4);
                     buf[20] = 0;
                    *((unsigned short*)&buf[22]) += 8;
                    printf("read %d bytes
    ", ret);
                     ret = write(tun, buf, ret);
                    printf("write %d bytes
    ", ret);
            }

            return 0;
    }

    이 코드 는 ICMP 의 ECHO 패 키 지 를 간단명료 하 게 처리 하고 ECHO REPLY 로 응답 합 니 다.
    우선 이 프로그램 을 실행 합 니 다:
    root@gentux test # ./a.out
    TUN name is tun0 
    이 어 다른 터미널 에서 다음 명령 을 실행 합 니 다.
    root@gentux linux-2.6.15-gentoo # ifconfig tun0 0.0.0.0 up
    root@gentux linux-2.6.15-gentoo # route add 10.10.10.1 dev tun0
    root@gentux linux-2.6.15-gentoo # ping 10.10.10.1
    PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
    64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=1.09 ms
    64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=5.18 ms
    64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=3.37 ms
    --- 10.10.10.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2011ms
    rtt min/avg/max/mdev = 1.097/3.218/5.181/1.671 ms 
    이 를 통 해 알 수 있 듯 이 우 리 는 응답 패 키 지 를 순조롭게 받 아 들 였 다.이때 이전 터미널 로 돌아 갔다.
    read 84 bytes
    write 84 bytes
    read 84 bytes
    write 84 bytes
    read 84 bytes
    write 84 bytes 
    모든 것 이 우리 가 예상 한 바 와 같다.
    TUN/TAP 는 무엇 을 할 수 있 습 니까?
    hoho,이 질문 을 하 는 것 은 좀 어 리 석 은 것 같 습 니 다.인터넷 카드 하나 로 무엇 을 할 수 있 습 니까?나 는 너 에 게 이 를 바탕 으로 하 는 두 개의 오픈 소스 프로젝트 를 알려 줄 수 있다.
    vtun 과 open,다른 응용 에 대해 서 는 상상력 을 자 유 롭 게 발휘 하 세 요!

    좋은 웹페이지 즐겨찾기