Linux中网络命名空间实战各种坑

简介: 实战笔记

network namespace

我有一个程序,监听某个端口,在一台Linux机器上,运行多个这样的程序,端口监听一样,冲突怎么办?

可以更改监听端口,这样即使端口不一样,但是程序还是一样的。

如果你硬要监听一样的端口,那么端口肯定是冲突的,除非你另外创建一个网络命名空间,把程序运行在这个命名空间中

可以实战操作一把

root@ubuntu:/home/ubuntu# ip netns --helpCommand "--help" is unknown, try "ip netns help".
root@ubuntu:/home/ubuntu# ip netns helpUsage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id


创建网络命名空间 demo

root@ubuntu:/home/ubuntu# ip netns add demoroot@ubuntu:/home/ubuntu# ip netns lsdemo

添加虚拟网络设备

下面命令添加了两个端对端的网络veth1veth2

ip link add veth1 type veth peer name veth2

将虚拟网络一端添加到命名空间中, 这里把veth1添加到网络命名空间

ip link set veth1 netns demo

配置网络设备,这里把veth2留在本机并配置IP

ip addr add 172.17.0.1/24 dev veth2

启动设备

ip link set dev veth2 up

查看网络

root@ubuntu:/home/ubuntu# ifconfig -v veth2veth2: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500        inet 172.17.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 8e:7e:64:ff:30:8a  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

给网络命名空间虚拟设备配置IP,并启用网络设备

root@ubuntu:/home/ubuntu# ip netns exec demo ip addr add 172.17.0.2/24 dev veth1root@ubuntu:/home/ubuntu# ip netns exec demo ip link set dev veth1 uproot@ubuntu:/home/ubuntu# ip netns exec demo ifconfigveth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.17.0.2  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::38d1:35ff:fe2a:757b  prefixlen 64  scopeid 0x20<link>
        ether 3a:d1:35:2a:75:7b  txqueuelen 1000  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在默认网络与demo命名空间网络,互相ping,都是可以ping通的

但是,最后在demo命名空间中,ping 172.17.0.2 却是没有响应

root@ubuntu:/home/ubuntu# ping 172.17.0.1PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1ttl=64time=0.107 ms
64 bytes from 172.17.0.1: icmp_seq=2ttl=64time=0.159 ms
64 bytes from 172.17.0.1: icmp_seq=3ttl=64time=0.158 ms
^C
---172.17.0.1 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2025ms
rtt min/avg/max/mdev =0.107/0.141/0.159/0.026 ms
root@ubuntu:/home/ubuntu# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1ttl=64time=0.162 ms
64 bytes from 172.17.0.2: icmp_seq=2ttl=64time=0.096 ms
64 bytes from 172.17.0.2: icmp_seq=3ttl=64time=0.092 ms
^C
---172.17.0.2 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2148ms
rtt min/avg/max/mdev =0.092/0.116/0.162/0.034 ms
root@ubuntu:/home/ubuntu# ip netns exec demo ping 172.17.0.1PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1ttl=64time=0.217 ms
64 bytes from 172.17.0.1: icmp_seq=2ttl=64time=0.090 ms
64 bytes from 172.17.0.1: icmp_seq=3ttl=64time=0.096 ms
^C
---172.17.0.1 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2115ms
rtt min/avg/max/mdev =0.090/0.134/0.217/0.059 ms
root@ubuntu:/home/ubuntu# ip netns exec demo ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.


进入demo命名空间排查,发现回环设备也无法ping通,通过启用lo设备,问题就解决了

root@ubuntu:/home/ubuntu# ping 127.0.0.1connect: Network is unreachable
root@ubuntu:/home/ubuntu# ping 0.0.0.0connect: Network is unreachable
root@ubuntu:/home/ubuntu# ip link set dev lo uproot@ubuntu:/home/ubuntu# ping 0.0.0.0PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1ttl=64time=0.070 ms
64 bytes from 127.0.0.1: icmp_seq=2ttl=64time=0.086 ms
^C
---0.0.0.0 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1013ms
rtt min/avg/max/mdev =0.070/0.078/0.086/0.008 ms
root@ubuntu:/home/ubuntu# ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1ttl=64time=0.077 ms
64 bytes from 172.17.0.2: icmp_seq=2ttl=64time=0.087 ms
^C
---172.17.0.2 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1022ms
rtt min/avg/max/mdev =0.077/0.082/0.087/0.005 ms

发现demo网络命名空间,无法ping通外网

root@ubuntu:/home/ubuntu# ip netns exec demo ping 114.114.114.114connect: Network is unreachable

查看路由,发现并没有匹配的路由

root@ubuntu:/home/ubuntu# ip netns exec demo routeKernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.17.0.0      0.0.0.0         255.255.255.0   U     000 veth1

添加一条路由试试,enp0s2为默认网络空间的网络设备名

ip netns exec demo route add default gw 172.17.0.1
echo1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s172.17.0.0/24 -o enp0s2 -j MASQUERADE



验证

root@ubuntu:/home/ubuntu# ip netns exec demo ping 114.114.114.114PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1ttl=58time=13.4 ms
64 bytes from 114.114.114.114: icmp_seq=2ttl=58time=7.34 ms
64 bytes from 114.114.114.114: icmp_seq=3ttl=58time=10.7 ms

发现demo网络命名空间无法ping通百度

root@ubuntu:/home/ubuntu# ip netns exec demo ping www.baidu.comping: www.baidu.com: Temporary failure in name resolution

进入命名空间创建dns解析

root@ubuntu:/home/ubuntu# ip netns exec demo bashroot@ubuntu:/home/ubuntu# mkdir -p /etc/netns/demoroot@ubuntu:/home/ubuntu# vim /etc/netns/demo/resolv.confroot@ubuntu:/home/ubuntu# cat /etc/netns/demo/resolv.confnameserver 114.114.114.114

在默认命名空间,执行如下命令

root@ubuntu:/home/ubuntu# strace  -f ip netns exec demo sleep 1 2>&1|egrep '/etc/|clone|mount|unshare'|egrep -vw '/etc/ld.so|access'unshare(CLONE_NEWNS)                    =0mount("", "/", 0x55ebf359d725, MS_REC|MS_SLAVE, NULL) =0umount2("/sys", MNT_DETACH)             =0mount("demo", "/sys", "sysfs", 0, NULL) =0openat(AT_FDCWD, "/etc/netns/demo", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) =5mount("/etc/netns/demo/resolv.conf", "/etc/resolv.conf", 0x55ebf359d725, MS_BIND, NULL) =0

发现已经可以ping通百度了

root@ubuntu:/home/ubuntu# ip netns exec demo bashroot@ubuntu:/home/ubuntu# ping www.baidu.comPING www.a.shifen.com (36.152.44.95) 56(84) bytes of data.
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=1ttl=49time=12.8 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2ttl=49time=11.0 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3ttl=49time=13.2 ms



相关文章
|
16天前
|
安全 Linux 虚拟化
网络名称空间在Linux虚拟化技术中的位置
网络名称空间(Network Namespaces)是Linux内核特性之一,提供了隔离网络环境的能力,使得每个网络名称空间都拥有独立的网络设备、IP地址、路由表、端口号范围以及iptables规则等。这一特性在Linux虚拟化技术中占据了核心位置🌟,它不仅为构建轻量级虚拟化解决方案(如容器📦)提供了基础支持,也在传统的虚拟机技术中发挥作用,实现资源隔离和网络虚拟化。
网络名称空间在Linux虚拟化技术中的位置
|
14天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
38 6
|
5天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
2天前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型
|
3天前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
16 0
Linux 网络操作命令Telnet
|
3天前
|
Ubuntu Linux
Linux(22) Linux设置网络优先级顺序
Linux(22) Linux设置网络优先级顺序
6 0
|
4天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
27 0
|
9天前
|
数据采集 机器学习/深度学习 数据挖掘
网络数据处理中的NumPy应用实战
【4月更文挑战第17天】本文介绍了NumPy在网络数据处理中的应用,包括数据预处理、流量分析和模式识别。通过使用NumPy进行数据清洗、格式化和聚合,以及处理时间序列数据和计算统计指标,可以有效进行流量分析和异常检测。此外,NumPy还支持相关性分析、周期性检测和聚类分析,助力模式识别。作为强大的科学计算库,NumPy在处理日益增长的网络数据中发挥着不可或缺的作用。
|
1天前
|
监控 Linux Windows
50个必知的Linux命令技巧,你都掌握了吗?(下)
50个必知的Linux命令技巧,你都掌握了吗?(下)