新增一个namspace:
在这里插入代码片
sudo ip netns add netns1
查看是否创建成功
ip netns list
sudo ls /var/run/netns/netns1
查看namespace中的网络设备
sudo ip netns exec netns1 ip link list
删除namespace
sudo ip netns delete netns1
增加一个自定义的namspace并测试回环网卡网络:
在这里插入代码片
sudo ip netns add netns1
ip netns list
ip netns exec ip link list
ip netns exec netns1 ip link list
sudo ip netns exec netns1 ip link list
sudo ip netns exec netns1 ping 127.0.0.1
sudo ip netns exec netns1 ip link set dev lo up
sudo ip netns exec netns1 ping 127.0.0.1
sudo ip netns exec netns1 ip link list
创建veth设备对,并把设备对的一端放置到自定义的namspace中,执行和测试步骤如下:
在这里插入代码片
sudo ip link add veth0 type veth peer name veth1/*创建设备对veth0/veth1*/
ip link /*查看创建的设备对*/
sudo ip link set veth1 netns netns1/*将设备对的veth1放到自己定义的namespace中*/
ip link /*查看创建的设备对*/
sudo ip netns exec netns1 ip link/*查看netns1的设备信息,可以看到veth1已经放置到了对应的namespace中*/
sudo ip netns exec netns1 ifconfig veth1 10.1.1.1/24 up/*为netns1设备添加ip并设置状态为up*/
sudo ip netns exec netns1 ip link/*查看是否配置成功*/
sudo ifconfig veth0 10.1.1.2/24 up /*为设备添加ip并设置状态为up*/
ifconfig
ping 10.1.1.1
sudo ip netns exec netns1 ifconfig
通过C代码实现namespace隔离
在这里插入代码片
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mount.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#define STACK_SIZE (1024*1024)
int checkpoint[2];
static char child_stack[STACK_SIZE];
char* const child_args[]= {
"/bin/bash",
NULL
};
int child_main(void* arg) {
char c;
close(checkpoint[1]);
printf("--[%5d] World !\n", getpid());
sethostname("hw", sizeof("haoweizhang#"));
mount("proc", "/proc", "proc", 0, NULL);
read(checkpoint[0], &c, 1);
system("ip link set lo up");
system("ip link set veth1 up");
system("ip addr add 192.168.1.1/24 dev veth1");
execv(child_args[0], child_args);
printf("Doops\n");
return 1;
}
int main() {
pipe(checkpoint);
printf("--[%5d]Hello?\n", getpid());
int child_pid = clone(child_main, child_stack+STACK_SIZE, CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWIPC | CLONE_NEWNET | SIGCHLD, NULL);
char *cmd;
asprintf(&cmd, "ip link set veth1 netns %d", child_pid);
system("ip link add veth0 type veth peer name veth1");
system(cmd);
system("ip link set veth0 up");
system("ip addr add 192.168.1.2/24 dev veth0");
free(cmd);
close(checkpoint[1]);
waitpid(child_pid, NULL, 0);
return 0;
}