tun/tap 디바이스 생성 코드인데요..디바이스 생성이 안되네요;

vlzkcbcb의 이미지

아래코드를 이용하여 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); 
    }
 
}
bugiii의 이미지

tun/tap 디바이스의 사용자 권한은 확인 하셨나요?

tunctl 로 사용자 권한을 지정하고 미리 만들어 놓고 하셔도 됩니다.

vlzkcbcb의 이미지

파일디스크립터는 어떻게 가져오나요?

말씀해주신대로 tunctl 를 이용하여 가상인터페이스를 만들었으나

실제 tcp/udp 통신 프로그래밍에서 활용을 해야하는데..

VPN 을 구현해보고싶은 마음은 굴뚝같고..초반부터 막히니 속상하네요 ㅠㅠ

bugiii의 이미지

예제를 보시고 코딩을 하신 것 같은데 올려주신 코드중에 약간 빠진 것이 있는 것 같아, 개인적으로 간단하게 만들어 쓰고 있는 코드를 아래에 올립니다.

loki 라이브러리는 금방 찾으실 수 있을 것이고, ScopeGuard은 에러시 close를 자동으로 호출하기 위해서 사용한 것입니다.

아래와 같이 하면 새로 디바이스를 만들어서 돌려주고

string dev_name;
int fd = tap_open( dev_name );
cout << fd << ", " << dev_name.c_str() << endl;

아래와 같이 하면 지정한 디바이스를 열어서 돌려줍니다. (tunctl로 미리 만들어 두었다면)

string dev_name( "tap0" );
int fd = tap_open( dev_name );
cout << fd << ", " << dev_name.c_str() << endl;

#include &lt;string>
#include &lt;cstdlib>
#include &lt;cstring>
#include &lt;cerrno>
#include &lt;unistd.h>
#include &lt;fcntl.h>
#include &lt;sys/ioctl.h>
#include &lt;sys/socket.h>
#include &lt;linux/if.h>
#include &lt;linux/if_tun.h>
#include &lt;loki/ScopeGuard.h>
 
using namespace std;
 
#ifndef OTUNSETNOCSUM
/* pre 2.4.6 compatibility */
#define OTUNSETNOCSUM  (('T'&lt;&lt; 8) | 200)
#define OTUNSETDEBUG   (('T'&lt;&lt; 8) | 201)
#define OTUNSETIFF     (('T'&lt;&lt; 8) | 202)
#define OTUNSETPERSIST (('T'&lt;&lt; 8) | 203)
#define OTUNSETOWNER   (('T'&lt;&lt; 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 &lt; 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 ) &lt; 0 ) {
                if( EBADFD == errno ) {
                        if( ioctl( fd, OTUNSETIFF, &ifr) &lt; 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 );
}
vlzkcbcb의 이미지

하지만 ANSI C 로 구현을 해야해서 좀 무리가 있네요 ㅠㅠ

bugiii의 이미지

제가 올린 코드에 특별한 내용은 없으니, 원래 올려주신 코드와 비교를 해보시면 충분히 C로 풀어 쓰실 수 있을 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.