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