当前位置: 首页 > Linux

LinuxNetworkNamespace(netns)详解

时间:2023-04-06 06:20:59 Linux

LinuxNetworkNamespace(netns)详解NetworkNamespace(以下简称netns)是Linux内核提供的一种网络隔离功能,可以隔离多个不同的网络空间,并且各有各的独立的网络协议栈,包括网络接口(网卡)、路由表、iptables规则等。比如著名的docker基于netns实现网络隔离。今天我们就手动体验一下netns的隔离特性。UsageUseipnetnshelp查看使用帮助Usage:ipnetnslistipnetnsaddNAMEipnetnssetNAMENETNSIDip[-all]netnsdelete[NAME]ipnetnsidentify[PID]ipnetnspidsNAMEip[-all]netnsexec[NAME]cmd...ipnetnsmonitoripnetnslist-id开始实验我们将如下图搭建网络首先我们添加两个tap设备并配置IP信息,然后添加两个netns,最后将tap设备移动到netnsMiddle#添加并启动虚拟网卡tapdeviceiptuntapadddevtap0modetapiptuntapadddevtap1modetapiplinksettap0upiplinksettap1up#configureIPipaddradd10.0.0.1/24devtap0ipaddradd10.0.0.2/24devtap1#addnetnsipnetnsaddns0ipnetnsaddns1#将虚拟网卡tap0和tap1分别移动到ns0和ns1。iplinksettap0netnsns0iplinksettap1netnsns1在主机上使用ping10.0.0.1测试与tap0的连接网络连接PING10.0.0.1(10.0.0.1)56(84)字节数据。^C---10.0.0.1pingstatistics---2个数据包发送,0个接收,100%丢包,主机上时间58ms使用ping10.0.0.2测试tap1的网络连通性ping10.0.0.2PING10.0.0.2(10.0.0.2)56(84)字节数据。^C---10.0.0.2ping统计数据---发送了2个包,收到了0个,100%丢包,时间36ms由于长时间没有收到ICMP回复报文,我用Ctrl+C退出。使用ipnetnsexecns0ping10.0.0.2测试namespacens0中的tap1连接:网络不可达使用ipnetnsexecns1ping10.0.0.1测试与命名空间ns1中的tap0连接:网络不可达有在netns中执行命令有两种方式,一种是先在本机执行ipnetnsexecbash进入netns,然后就可以像在本机一样执行命令了。另一种是每次都在主机上使用完整的命令。为了区分清楚,我们这里使用完整的命令。例如ipnetnsexecns0ping10.0.0.2的意思是在命名空间ns0中执行ping10.0.0.2命令可以看出在宿主机上访问netns是丢包,在netns中互相访问是无法访问的网络。为什么?让我们检查一下netns。使用ipnetnsexecns0ipa查看ns0中的网卡1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:0016:tap0:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000link/ether42:ad:98:a2:cc:81brdff:ff:ff:ff:ff:ff使用ipnetnsexecns1ipa查看NIC1inns1:lo:mtu65536qdiscnoopstateDOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:0017:tap1:mtu1500qdiscnoopstateDOWNgroupdefaultqlen1000link/ether12:06:1d:06:41:57brdff:ff:ff:ff:ff:ff可以查看不仅本地loopbacklo和tap设备的状态是DOWN,连tap设备的IP信息都没有了。这是因为当虚拟网络接口在不同的网络命名空间中移动时,虚拟网络接口的状态将被重置。我们重启并配置ns0和ns1中的相关设备。IPipnetnsexecns0ip链接设置loupipnetnsexecns0ip链接设置tap0upipnetnsexecns0ipaddradd10.0.0.1/24devtap0ipnetnsexecns1ip链接设置loupipnetnsexecns1ip链接设置tap1upipnetnsexecns1ipaddradd10.0.0.2/24devtap1首先我们在netns中测试本地网络是否正常。使用ipnetnsexecns0ping10.0.0.1测试本地innamespacens0网卡是否启动PING10.0.0.1(10.0.0.1)56(84)bytesofdata.64bytesfrom10.0.0.1:icmp_seq=1ttl=64time=0.036ms64bytesfrom10.0.0.1:icmp_seq=2ttl=64time=0.033ms64bytesfrom10.0.0.1:icmp_seq=3ttl=64time=0.084ms64bytesfrom10.0.0.1:icmp_seq=4ttl=64time=0.044ms^C---10.0.0.1pingstatistics---4包传输,4包接收,0%丢包,时间65msrttmin/avg/max/mdev=0.033/0.049/0.084/0.021ms使用ipnetnsexecns1ping10.0.0.2测试本地网卡是否在namespacens1中开始PING10.0。0.2(10.0.0.2)56(84)字节数据。来自10.0.0.2的64字节:icmp_seq=1ttl=64time=0.033ms64来自10.0.0.2的字节:icmp_seq=2ttl=64time=0.034来自10.0.0.2的ms64字节:icmp_seq=3ttl=64time=0.065来自10.0.0.2的ms64字节:icmp_seq=4ttl=64time=0.035ms^C---10.0.0.1ping统计数据---4个数据包传输,4received,0%packetloss,time65msrttmin/avg/max/mdev=0.033/0.049/0.084/0.021ms可以看出本地网络没有问题,接下来我们测试下网络之间的连通性两个网络使用ipnetnsexecns0ping10.0.0.2测试与命名空间ns0中的tap1的网络连接PING10.0.0.2(10.0.0.2)56(84)字节的数据。^C---10.0.0.2ping统计数据---3数据包传输,0接收,100%数据包丢失,时间84ms使用ipnetnsexecns1ping10.0.0.1测试与命名空间ns1中的tap0的网络连接PING10.0.0.1(10.0.0.1)56(84)字节数据.^C---10.0.0.1ping统计---2个包发送,0个接收,100%丢包,时间30ms可以看出没有ICMP回复包,netns确实把两个虚拟网卡放在同一个主机上隔离这里我们简单的使用ping命令来测试网络的连通性。其实我们可以做的更多,比如修改某个netns的路由表或者防火墙规则,当然完全不会影响其他netns。它不会影响主机。由于篇幅原因,这里就不展开实验了。有兴趣的同学可以实验一下。在下一节中,我们将学习另一种网络设备vethpair,并用它来连接两个netn,使两个孤立的netn可以相互通信。