tun/tap 디바이스 생성 코드인데요..디바이스 생성이 안되네요;
글쓴이: vlzkcbcb / 작성시간: 금, 2009/11/27 - 12:40오후
아래코드를 이용하여 ip주소를 갖는 가상 디바이스를 하나 올리려하는데요
파일디스크립터는 가져오는데..실제로 인터페이스가 올라오질 않는데...뭐가문제인가요?
IFF_TUN 를 IFF_TAP 으로 바꾸어도 마찬가지입니다..ㅠㅠ
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <asm/ioctl.h>
int tun_up(char *dev)
{
struct ifreq ifr;
int fd, err;
if( (fd = open("/dev/net/tun", O_RDWR)) < 0 )
return -1;
memset(&ifr, 0, sizeof(ifr));
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
*
* IFF_NO_PI - Do not provide packet information
*/
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
if( *dev )
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
if( (err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ) {
close(fd);
return err;
}
strcpy(dev, ifr.ifr_name);
return fd;
}
int main(void)
{
char tun_dev[16]="tap0";
char set[50]="";
int n = 0;
int fd;
n += sprintf(set + n, "%s", "ifconfig ");
n += sprintf(set + n, "%s", tun_dev);
n += sprintf(set + n, "%s", " 192.168.0.1 netmask 255.255.255.0");
if ( (fd = tun_up(tun_dev)) < 0 )
{
printf("fail\n");
}
else
{
system(set);
printf("%s dev fd = %d\n",tun_dev,fd);
}
}Forums:


tun/tap 디바이스의
tun/tap 디바이스의 사용자 권한은 확인 하셨나요?
tunctl 로 사용자 권한을 지정하고 미리 만들어 놓고 하셔도 됩니다.
tunctl 로 만든 가상인터페이스의..
파일디스크립터는 어떻게 가져오나요?
말씀해주신대로 tunctl 를 이용하여 가상인터페이스를 만들었으나
실제 tcp/udp 통신 프로그래밍에서 활용을 해야하는데..
VPN 을 구현해보고싶은 마음은 굴뚝같고..초반부터 막히니 속상하네요 ㅠㅠ
예제를 보시고
예제를 보시고 코딩을 하신 것 같은데 올려주신 코드중에 약간 빠진 것이 있는 것 같아, 개인적으로 간단하게 만들어 쓰고 있는 코드를 아래에 올립니다.
loki 라이브러리는 금방 찾으실 수 있을 것이고, ScopeGuard은 에러시 close를 자동으로 호출하기 위해서 사용한 것입니다.
아래와 같이 하면 새로 디바이스를 만들어서 돌려주고
아래와 같이 하면 지정한 디바이스를 열어서 돌려줍니다. (tunctl로 미리 만들어 두었다면)
#include <string> #include <cstdlib> #include <cstring> #include <cerrno> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <linux/if.h> #include <linux/if_tun.h> #include <loki/ScopeGuard.h> using namespace std; #ifndef OTUNSETNOCSUM /* pre 2.4.6 compatibility */ #define OTUNSETNOCSUM (('T'<< 8) | 200) #define OTUNSETDEBUG (('T'<< 8) | 201) #define OTUNSETIFF (('T'<< 8) | 202) #define OTUNSETPERSIST (('T'<< 8) | 203) #define OTUNSETOWNER (('T'<< 8) | 204) #endif static int tuntap_open( string& dev_name, bool istun ) { int fd = open( "/dev/net/tun", O_RDWR ); Loki::ScopeGuard auto_close = Loki::MakeGuard( close, fd ); if( fd < 0 ) return -1; ifreq ifr; memset( &ifr, 0, sizeof ifr ); ifr.ifr_flags = ( istun ? IFF_TUN : IFF_TAP ) | IFF_NO_PI; if( !dev_name.empty() ) strncpy( ifr.ifr_name, dev_name.c_str(), IFNAMSIZ ); if( ioctl( fd, TUNSETIFF, &ifr ) < 0 ) { if( EBADFD == errno ) { if( ioctl( fd, OTUNSETIFF, &ifr) < 0 ) return -1; } else { return -1; } } dev_name = ifr.ifr_name; auto_close.Dismiss(); return fd; } int tun_open( string& tun_name ) { return tuntap_open( tun_name, true ); } int tap_open( string& tap_name ) { return tuntap_open( tap_name, false ); }직접 만드신 코드를 공유해주시다니 감사드립니다.
하지만 ANSI C 로 구현을 해야해서 좀 무리가 있네요 ㅠㅠ
제가 올린 코드에
제가 올린 코드에 특별한 내용은 없으니, 원래 올려주신 코드와 비교를 해보시면 충분히 C로 풀어 쓰실 수 있을 것입니다.
댓글 달기