ip netns 常用的namespace的命令

本文详细介绍了Linux中netns网络空间虚拟化的原理与实践,通过创建虚拟网络空间、添加网络设备、配置IP地址及网络连接,实现网络通信。从创建虚拟网络空间到与物理网络的联通,逐步演示了如何在本地虚拟环境中建立独立的网络环境,并提供了关键命令与步骤说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。

使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。

netns虚拟网络空间的网络通信依赖于物理接口,光讲听上去很虚,我们来操练点实际的看看:

1.创建虚拟网络空间:

ip netns add ns1

这样我们就得到了一个名为ns1的网络空间,虚拟网络空间除了网络是虚的以外,文件系统完全和当前系统共享,也就是说所有本地可以使用的命令都可以在虚拟网络中使用,我们进入ns1看看情况:

ip netns exec ns1 bash

ifconfig -a

~# ifconfig -a
lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到ns1中默认添加了一个本地回路设备,其他神马也没有,下面我们退出ns1,给他添加点网卡,之所以要在外部添加网卡是因为我们要为后面联通网络做准备,

exit

ip link add name ns1-nic type veth peer name ns1-vnic

这里我们添加了一对veth设备,veth设备是成对出现的,两个设备之间的数据是相互贯通的,我们把ns1-vnic加入到ns1网络空间中:

ip link set ns1-vnic netns ns1

这样ns1-vnic就进入到ns1空间了,在本地网络中已经无法查看到,我们重新进入ns1看看现在的情况:

ip netns exec ns1 bash

# ifconfig -a
lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ns1-vnic Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

可以看到多出来了一块网卡,虽然网卡名字有点丑,不过网卡名字可以随意修改的,我们改一改:

ip link set ns1-vnic name eth0
# ifconfig -a
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback
LOOPBACK MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

刚才把默认的名字修改为了eth0,下面我们给他分配一个private ip address:

ip addr add 10.0.0.100/24 dev eth0

然后把它启动起来:

ip link set eth0 up
# ifconfig
eth0 Link encap:Ethernet HWaddr 92:69:39:f3:b3:be
inet addr:10.0.0.100 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

然后我们再把回环起起来,ping一下自己感受一下:

# ip link set lo up
root@ubuntu:~# ping 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.072 ms
64 bytes from 10.0.0.100: icmp_req=2 ttl=64 time=0.040 ms

嗷嗷!ping自己通了!那么我们怎么样让ns1中的eth0和真实server中的网络进行通信呢?首先让他能和本地物理机通信,我们在物理机网络中采用桥接的方式,把刚才添加veth虚拟网卡的时候被拆开的一对的剩下一只添加的网桥里面,利用成对veth相互之间数据贯通的特性来实现网络互通:

先退出ns1,本地添加网桥:

exit

brctl addbr testbr

brctl addif testbr ns1-nic

ip link set ns1-nic up

然后给网桥设置一个ip地址:

ip addr add 10.0.0.1/24 dev testbr

 ip link set testbr up

~# ifconfig testbr
testbr Link encap:Ethernet HWaddr 6a:d1:34:5b:3c:99
inet addr:10.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::68d1:34ff:fe5b:3c99/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)

 

下面来ping一下ns1中的eth0网卡ip10.0.0.100感受一下:

~# ping 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_req=1 ttl=64 time=0.200 ms
64 bytes from 10.0.0.100: icmp_req=2 ttl=64 time=0.042 ms

嗷嗷!又通了!

我们进入ns1往10.0.0.1来ping一下:

~# ip netns exec ns1 ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=0.057 ms
64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=0.063 ms

嗷嗷!是通的!

但是现在ns1中的网络还访问不到外网,那么如何才能让ns1中的网络可以访问到外面的世界呢?

有点晚了,请听下回分解!感兴趣的同学可以这里评论留言给我,或者看博客左上方的微博地址给我at一下。:-)


常用的namespace的命令:


1. 添加一个namespace

sudo ip netns add [name]



2. 在namespace中启用一个设备

sudo ip netns exec   [name]  ip link set lo up



3. 在namespace中新加一个设备

sudo ip link set  [dev-name]   netns  [name]

启用:

sudo ip netns exec   [name]  ip link set [dev-name] up



4. 查看指定namespace中指定设备的参数信息

sudo ip netns exec  [name] ip addr show   [dev-name]   permanent scope global



5. 为namespace中指定设备设置ip

sudo ip netns exec   [name]  ip -4 addr add 192.168.1.2/24 brd 192.168.1.255 scope global dev   [dev-name]  



6.查看所有network namespace

ip netns list



7.ping虚拟机实例

ip netns exec [name] ping 192.168.1.3

``` #!/bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward lan1=enp8s0f0 lan2=enp8s0f1 lan3=enp4s0 lan4=enp5s0 lan5=enp6s0 lan6=enp7s0 lan7=enp10s0 lan8=enp11s0 lan9=enp5s0f2 lan10=enp5s0f3 lan11=enp7s0f2 lan12=enp7s0f3 lan13=enp8s0f0 lan14=enp8s0f1 lan15=enp8s0f2 lan16=enp8s0f3 ip netns add ns1 ip link set $lan1 netns ns1 ip netns exec ns1 ifconfig $lan1 1.1.1.1/24 ip netns add ns2 ip link set $lan2 netns ns2 ip netns exec ns2 ifconfig $lan2 1.1.1.2/24 :<<! ip netns add ns3 ip link set $lan3 netns ns3 ip netns exec ns3 ifconfig $lan3 2.2.2.1/24 ip netns add ns4 ip link set $lan4 netns ns4 ip netns exec ns4 ifconfig $lan4 2.2.2.2/24 ip netns add ns5 ip link set $lan5 netns ns5 ip netns exec ns5 ifconfig $lan5 3.3.3.1/24 ip netns add ns6 ip link set $lan6 netns ns6 ip netns exec ns6 ifconfig $lan6 3.3.3.2/24 :<<! ip netns add ns7 ip link set $lan7 netns ns7 ip netns exec ns7 ifconfig $lan7 4.4.4.1/24 ip netns add ns8 ip link set $lan8 netns ns8 ip netns exec ns8 ifconfig $lan8 4.4.4.2/24 ip netns add ns9 ip link set $lan9 netns ns9 ip netns exec ns9 ifconfig $lan9 5.5.5.1/24 ip netns add ns10 ip link set $lan10 netns ns10 ip netns exec ns10 ifconfig $lan10 5.5.5.2/24 ip netns add ns11 ip link set $lan11 netns ns11 ip netns exec ns11 ifconfig $lan11 6.6.6.1/24 ip netns add ns12 ip link set $lan12 netns ns12 ip netns exec ns12 ifconfig $lan12 6.6.6.2/24 ip netns add ns13 ip link set $lan13 netns ns13 ip netns exec ns13 ifconfig $lan13 7.7.7.1/24 ip netns add ns14 ip link set $lan14 netns ns14 ip netns exec ns14 ifconfig $lan14 7.7.7.2/24 ip netns add ns15 ip link set $lan15 netns ns15 ip netns exec ns15 ifconfig $lan15 8.8.8.1/24 ip netns add ns16 ip link set $lan16 netns ns16 ip netns exec ns16 ifconfig $lan16 8.8.8.2/24 ! echo -e "\033[1;33;40m Test network interface function \033[0m" sleep 5 ip netns exec ns1 iperf3 -s -D -p 1111 & sleep 1 ip netns exec ns2 iperf3 -c 1.1.1.1 -p 1111 -i 1 -t 5 -A 1,7 :<<! ip netns exec ns3 iperf3 -s -D -p 2222 & sleep 1 ip netns exec ns4 iperf3 -c 2.2.2.1 -p 2222 -i 1 -t 5 -R > br2.log & ip netns exec ns5 iperf3 -s -D -p 3333 & sleep 1 ip netns exec ns6 iperf3 -c 3.3.3.1 -p 3333 -i 1 -t 5 -R > br3.log & :<<! ip netns exec ns7 iperf3 -s -D -p 4444 & sleep 1 ip netns exec ns8 iperf3 -c 4.4.4.1 -p 4444 -i 1 -t 5 -R > br4.log & ip netns exec ns9 iperf3 -s -D -p 5555 & sleep 1 ip netns exec ns10 iperf3 -c 5.5.5.1 -p 5555 -i 1 -t 5 -R > br5.log & ip netns exec ns11 iperf3 -s -D -p 6666 & sleep 1 ip netns exec ns12 iperf3 -c 6.6.6.1 -p 6666 -i 1 -t 5 -R > br6.log & ip netns exec ns13 iperf3 -s -D -p 7777 sleep 1 ip netns exec ns14 iperf3 -c 7.7.7.1 -p 7777 -i 1 -t 5 -R > br7.log & ip netns exec ns15 iperf3 -s -D -p 8888 sleep 1 ip netns exec ns16 iperf3 -c 8.8.8.1 -p 8888 -i 1 -t 5 -R > br8.log & ! :<<! sleep 10 echo -e "\033[1;33;40m Number 1 network port \033[0m" cat br1.log |grep 0.00-5.00 -B 1 :<<! echo -e "\033[1;33;40m Number 2 network port \033[0m" cat br2.log |grep 0.00-5.00 -B 1 echo -e "\033[1;33;40m Number 3 network port \033[0m" cat br3.log |grep 0.00-5.00 -B 1 :<<! echo -e "\033[1;33;40m Number 4 network port \033[0m" cat br4.log |grep 0.00-5.00 -B 1 echo -e "\033[1;33;40m Number 5 network port \033[0m" cat br5.log |grep 0.00-5.00 -B 1 echo -e "\033[1;33;40m Number 6 network port \033[0m" cat br6.log |grep 0.00-5.00 -B 1 echo -e "\033[1;33;40m Number 7 network port \033[0m" cat br7.log |grep 0.00-5.00 -B 1 echo -e "\033[1;33;40m Number 8 network port \033[0m" cat br8.log |grep 0.00-5.00 -B 1 ! read -n1 -p "Press any key to continue........."```分析
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值