tun/tap 장치를 생성할 때 네임스페이스를 어떻게 지정합니까?

tun/tap 장치를 생성할 때 네임스페이스를 어떻게 지정합니까?

Linux에서는 C 언어를 사용하여 새로운 조정/탭 장치를 만들 수 있습니다. 예를 들면 다음과 같습니다.

int fd = open("/dev/net/tun", O_RDWR);
ioctl(fd, TUNSETIFF, (void *)&ifr);

그러면 현재 네트워크 네임스페이스에 새 네트워크 인터페이스가 생성됩니다. 그런 다음 비슷한 방법을 사용하여 ip link set tap0 netns foo이를 셸에서 다른 네임스페이스로 이동할 수 있습니다.

처음에 올바른 네임스페이스에 생성하거나 적어도 내 C 코드에서 해당 네임스페이스로 이동하는 올바른 방법은 무엇입니까?

답변1

tun생성 하려는 경우기존의setns()네임스페이스를 사용하려면 tun 장치를 생성하기 전에 시스템 호출을 사용하여 프로세스의 네트워크 네임스페이스를 설정할 수 있어야 합니다 . 예를 들어 "blue"라는 네임스페이스가 있다고 가정합니다.

# ip netns
blue

다음 코드는 이 네임스페이스에서 tun 장치를 엽니다.

#define _GNU_SOURCE

#include <fcntl.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#include <linux/if.h>
#include <linux/if_tun.h>

int main() {
    int nsfd;
    int tunfd;
    struct ifreq ifr;

    nsfd = open("/run/netns/blue", O_RDONLY);
    if (setns(nsfd, CLONE_NEWNET) == -1) {
        perror("setns");
        exit(1);
    }

    memset(&ifr, 0, sizeof(ifr));
    ifr.ifr_flags = IFF_TUN;
    tunfd = open("/dev/net/tun", O_RDWR);
    if (ioctl(tunfd, TUNSETIFF, (void *)&ifr) < 0) {
        perror("ioctl");
        exit(1);
    }

    // this is just here to prevent the code from exiting, which
    sleep(300);
}

tun위 코드가 실행되면 장치가 적절한 네임스페이스에 생성되었는지 확인할 수 있습니다 .

# ip netns exec blue ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 500
    link/none 

관련 정보