TUN(4)

명칭
tun - 터널 소프트웨어 네트워크 디바이스

서식
pseudo-device tun [count]

해설
tun 인터페이스는 소프트웨어 루프백 기구이며, 대략적으로 설명하면(자) pty(4) 의 네트워크 인터페이스판과 같은 것입니다. 즉 tun (은)는, pty 드라이버가 단말에 대해서 행하는 것을, 네트워크 인터페이스에 대해서 실시합니다.

tun 드라이버는 pty 드라이버와 같게, 2 개의 인터페이스를 제공하는: 드라이버가 시뮬레이트 하고 있는 통상의 기능과 같은 인터페이스 (이것은 tun 의 경우에는 네트워크 인터페이스이며, pty 의 경우에는 단말입니다) 및, 캐릭터형 특수 디바이스 “제어” 인터페이스입니다.

네트워크 인터페이스에는 tun0, tun1 등과 같이 이름을 붙일 수 있습니다. 이것은 pseudo-device 행으로 지정되었다 count 의 수만큼 있습니다. 각 인터페이스는 네트워크 인터페이스의 통상의 ioctl(2) ( SIOCSIFADDR (이)나 SIOCSIFNETMASK 등 )을 서포트하고 있으므로, 다른 인터페이스와 같게 ifconfig(8) 그리고 사용할 수가 있습니다. 이 인터페이스는 기동시에는 POINTOPOINT 인터페이스입니다만, 변경할 수가 있습니다. 후술 하는 제어 디바이스의 설명을 참조해 주세요. 시스템이 패킷을 네트워크 인터페이스 에 보내게 되었을 때, 그 패킷을 제어 디바이스로부터 읽을 수가 있습니다 ( 이것은 “input” (으)로서 여기에 나타납니다). 패킷을 제어 디바이스에 기입하면(자), 네트워크 인터페이스에는 입력 패킷이 생성됩니다. 이 동작은, (존재하지 않는다) 하드웨어가 패킷을 받았는지와 같이 행해집니다.

터널 디바이스 (통상은 /dev/tunN )(은)는 배타적으로 오픈되는 디바이스 ( 이미 오픈되고 있는 경우에는 오픈할 수 없습니다) (이어)여, 슈퍼 유저 밖에 이용할 수 없게 제한되고 있습니다. 인터페이스가 “ready” 상태 (제어 디바이스가 오픈되고 있어 인터페이스의 주소가 설정 되고 있는 상태)가 아니면, read() 시스템 콜은 에러 (EHOSTDOWN) (을)를 돌려줍니다. 인터페이스가 ready 상태가 되었을 때, 패킷이 읽어들여 가능하면 read() (은)는 패킷을 돌려줍니다. 읽어들여 가능하지 않으면, 패킷을 읽어들일 수 없을지 블록 할까 EWOULDBLOCK (을)를 돌려줍니다. 어느 쪽의 동작이 되는지는, 비블로킹 I/O 모드가 유효 (으)로 되고 있는지 어떤지로 정해집니다. read() 에게 건네지는 버퍼에 용서되고 있는 것보다도 패킷이 긴 경우에는, 초과 분의 데이터는 입다물고 버려집니다.

옵션지정에 의해, 패킷이 네트워크 인터페이스의 출력 routine (‘tunoutput’) 에게 줄 수 있을 때에, 패킷의 전에 종점 주소를 붙이도록(듯이) 하는 것이로 옵니다. 종점 주소의 포맷은, 구조체 ‘sockaddr’ 입니다. 전을 뒤따른 주소의 실제의 길이는, 구조체의 멤버 ‘sa_len’ 에 격납됩니다. 패킷의 데이터는 이 직후에 이어 놓여집니다. write(2) 시스템 콜의 호출에 의해 패킷을 인터페이스에 건네주어, 가상 인터페이스가 패킷을 “수신” 한 상태로 합니다. write() 시스템 콜 1 회의 호출로, 정확히 1 개의 패킷을 줍니다. 패킷장은 write() 에게 줄 수 있었던 데이터의 양으로부터 결정할 수 있습니다. 기입은 블록 되지 않습니다. 패킷이 일시적인 이유 (예: 버퍼에 이용할 수 있는 용량이 없다) 그리고 받아들일 수 없었던 경우에는, 패킷은 입다물고 버려집니다. 이유가 일시적인 것이 아니었던 경우 (예: 패킷이 너무 크다) 에는, 에러가 돌려주어집니다. “링크층 (link-layer) 모드” 하지만 유효 (후술의 TUNSLMODE 를 참조) (이)라면, 실제의 패킷 데이터의 전에는, 구조체 ‘sockaddr’ 하지만 없으면 안됩니다. 현재의 드라이버는 ‘sa_family’ 필드 밖에 조사하지 않습니다. 이하의 ioctl(2) 호출이 서포트되고 있습니다 (정의되고 있는 장소는 <net/if_tun.h>):

TUNSDEBUG
    인수는 int 에의 포인터가 아니면 안됩니다. 이것은 내부적인 디버그용 변수를 그 값으로 설정합니다. 이 변수가 제어하는 것도 의는 (만약 있었다고 해도) 여기에서는 설명하지 않습니다. 원시 코드를 읽어 관 차이.

TUNGDEBUG
    인수는 int 에의 포인터가 아니면 안됩니다. 이것은, 내부적인 디버그용 변수의 값을 인수가 가리키는 장소에 격납합니다.

TUNSIFMODE
    인수는 int 에의 포인터가 아니면 안됩니다. 이 값은 IFF_POINTOPOINT 또는 IFF_BROADCAST (이)가 아니면 안됩니다. 대응한다 tunn 인터페이스의 타입이 주어진 타입으로 설정됩니다. 상기 이외의 값이 지정되었을 경우에는, 에러 EINVAL 하지만 발생합니다. 이 때에는 인터페이스는 정지 (down)하고 있지 않으면 되지 않습니다. 동작하고 있으면, 에러 EBUSY 하지만 일어납니다.

TUNSLMODE
    인수는 int 에의 포인터가 아니면 안됩니다. 0 이 아닌 값을 지정하면(자), “링크층” 모드가 유효하게 됩니다. 이 모드에서는, 터널 디바이스로부터 읽어들였다 패킷의 전에 네트워크 종점 주소가 추가됩니다.

FIONBIO
    읽기시의 비블로킹 I/O 의 유효·무효를 설정합니다. 인수 int 의 값이 0 화도 등에 의해서, 무효인가 유효한가가 정해집니다 (기입은 반드시 비블로킹입니다)

FIOASYNC
    읽기시의 비동기 I/O ( 즉, 데이터가 읽어들여 가능한 때에 SIGIO 하지만 생성되는지 어떤지) 의 유효·무효를 설정합니다. 인수 int 의 값이 0 화도 등에 의해서, 무효인가 유효한가가 정해집니다.

FIONREAD
    패킷이 읽어들여 큐에 들어가 있는 경우, 최초의 패킷의 사이즈를 인수 int 에 격납합니다. 그 이외의 경우에는 0 을 격납합니다.

TIOCSPGRP
    비동기 I/O 가 유효하게 되어 있는 경우에, SIGIO 시그널을 받는 프로세스 그룹으로서 인수 int 의 값을 설정합니다.

TIOCGPGRP
    SIGIO 시그널에 대한 프로세스 그룹의 값을 취득해, 이 값을 인수 int 에 격납합니다.

제어 디바이스는 읽기에 대한다 select(2) 도 서포트하고 있습니다. 기입에 대한 select 는 반드시 성공하므로 의미 (이)가 없습니다. 왜냐하면, 기입은 반드시 비블로킹이기 때문입니다.

마지막 데이터 디바이스를 닫았을 때, 디폴트에서는 인터페이스가 정지 합니다 ( “ifconfig tunn down” 하지만 실행된 것과 같게 됩니다) 큐에 들어가 있는 패킷은 모두 버려집니다 (데이터 디바이스가 오픈되어 있지 않을 때에 인터페이스가 동작하고 있다 경우, 출력 패킷은 축적되지 말고, 항상 버려집니다).

관련 항목
inet(4), intro(4)

버그
현재는 IP 전용입니다.

저자
이 메뉴얼 페이지는 NetBSD (으)로부터 취득했습니다.