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



目录
打赏
0
0
0
0
4
分享
相关文章
|
6天前
|
Linux系统管理:服务器时间与网络时间同步技巧。
以上就是在Linux服务器上设置时间同步的方式。然而,要正确运用这些知识,需要理解其背后的工作原理:服务器根据网络中的其他机器的时间进行校对,逐步地精确自己的系统时间,就像一只犹豫不决的啮齿动物,通过观察其他啮齿动物的行为,逐渐确定自己的行为逻辑,既简单,又有趣。最后希望这个过程既能给你带来乐趣,也能提高你作为系统管理员的专业素养。
46 20
Linux 手动安装快速部署 LNMP 环境实战
本文详细记录了在阿里云ECS上手动搭建LNMP环境的过程,系统选用Ubuntu 24.04。主要内容包括:1) 使用`apt`安装Nginx和MySQL,并更新软件源;2) 编译安装PHP 8.4.5,配置PHP-FPM及环境路径;3) 配置MySQL root用户密码;4) 调整Nginx支持PHP解析并测试整体环境。通过此过程,重现手动配置服务器的细节,帮助熟悉各组件的安装与协同工作。
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
105 19
|
14天前
|
Linux下如何使用Curl进行网络请求
希望这篇文章能帮助您在Linux下更好地使用Curl进行网络请求。如有疑问,请随时提问!
62 10
HarmonyOS NEXT 实战系列10-网络通信
本文介绍了网络通信相关知识,包括HTTP协议的工作原理、鸿蒙系统中HTTP模块的使用方法、Promise异步操作处理机制及async/await语法糖的应用,以及JSON数据格式的语法规则与转换方法。重点讲解了HTTP请求响应流程、鸿蒙开发中的网络权限申请与代码实现、Promise三种状态及创建方式,并通过示例说明异步编程技巧和JSON在数据传递中的应用。
52 10
Hyper V上网实战:多虚拟机网络环境配置
在Hyper-V环境中配置多虚拟机网络以实现上网功能,需完成以下步骤:1. 确认Hyper-V安装与物理网络连接正常;2. 配置虚拟交换机(外部、内部或专用)以支持不同网络需求;3. 设置虚拟机网络适配器并关联对应虚拟交换机;4. 验证虚拟机网络连接状态;5. 根据场景需求优化多虚拟机网络环境。此外,还需注意网络隔离、性能监控及数据备份等事项,确保网络安全稳定运行。
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
259 28
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
79 11

热门文章

最新文章