背景
之前在《Linux系统的网络命名空间那些事》一文中分享了关于网络命名空间的名称的介绍,了解了系统的网络命名空间名称和网络命名空间标识符以及容器的网络命令空间标识符的事情。本文分享一下Linux网络命名空间的实际操作。
分析
Linux的网络命名空间提供了隔离的网络环境,实际上就是提供了隔离的网络栈。
网络栈
Linux 的网络栈是一个复杂的系统,由多个组件和层次构成,用于处理网络通信。
下面是 Linux 网络栈的主要组成部分:
1.硬件设备驱动程序(Device Drivers):
这是网络栈的最底层,用于与硬件设备(如网卡)进行通信。Linux 提供了各种设备驱动程序,以支持不同类型和厂商的网络设备。
2.网络接口层(Network Interface Layer):
这一层负责管理网络接口(如网卡)以及接收和发送数据帧。它提供了一个抽象层,使上层的网络协议能够与各种类型的网络接口进行交互。
3.数据链路层(Data Link Layer):
数据链路层负责处理帧(Frame)的传输,通常以太网是主要的数据链路层协议。它包括了以太网、Wi-Fi 等协议。
4.网络层(Network Layer):
网络层负责处理 IP 数据包的路由和转发。主要协议包括 IPv4 和 IPv6。在这一层,还包括了 ARP(地址解析协议)用于 IP 地址到 MAC 地址的映射。
5.传输层(Transport Layer):
传输层负责端到端的通信,主要包括 TCP(传输控制协议)和 UDP(用户数据报协议)。它负责可靠的数据传输(TCP)和无连接的数据传输(UDP)。
6.套接字接口(Socket Interface):
套接字接口是应用程序与网络协议栈之间的接口,通过套接字接口,应用程序可以使用各种网络协议进行通信。
7.网络协议栈(Networking Stack):
这是网络栈的核心部分,包括了各种网络协议的实现,如 TCP/IP 协议族、ICMP(Internet 控制消息协议)、IGMP(Internet 组管理协议)等。
8.路由和转发(Routing and Forwarding):
Linux 提供了强大的路由和转发功能,用于决定数据包的下一跳路由以及数据包的转发路径。
9.网络工具和配置(Networking Tools and Configuration):
Linux 提供了各种网络工具和配置命令,用于管理网络接口、配置网络参数、诊断网络问题等,如 ifconfig、ip、route、iptables 等。
一个独立的网络栈可以简单理解为一个独立的通信设备,多个网络栈是多个通信设备,再直白点理解,一个独立网络栈类似于一台个人电脑。在没有外部无线网卡或者网线的条件下,独立的网络栈之间是无法相互通信的。
而这个隔离的网络栈是在Linux系统虚拟出来的一套软件程序集合,并可以指定一个网络通信标识符,取名后在逻辑上形成一个封闭的空间,所以叫做网络命名空间。而系统默认的程序也会使用网络通信标识符,但是没有命令,也就是匿名的。而使用ip netns工具可以给网络通信标识符绑定一个名称,便于管理。最终起作用的还是网络通信标识符。
我们可以对网络命名空间进行增删改查,以及启停网卡、设置IP等种种和网络相关的操作。网络命名空间也是docker容器的网络的基础。
网络操作命令
下面就对网络命名空间进行实际操作,以加深对网络命名空间的理解。我们要使用的命令在centos7中是由iproute包提供的,如果iproute安装不了,尝试iproute2。
如果在终端输入ip addr命令提示 command not found ,则说明系统没有安装此命令,可以使用:
yum install iproute -y
ip命令能操作网络命令空间的所有东西,因为网络栈很复杂,涉及到的地方特别多,所以ip命令也分为好多个子命令。
子命令
link:用于管理网络设备的状态和属性,如启用/禁用设备、配置设备的 MTU 等。
address:用于管理设备的 IP 地址,包括添加、删除、显示设备的 IP 地址。
addrlabel:用于管理地址标签,可以为不同的地址范围分配不同的标签,用于路由策略。
route:用于管理路由表,包括添加、删除、显示路由信息,以及配置路由策略。
rule:用于管理路由策略规则,可以根据匹配条件选择不同的路由策略。
neigh:用于管理 ARP(地址解析协议)缓存表,包括显示、添加、删除邻居信息。
ntable:用于管理网络表,主要用于多路径路由(Multipath Routing)的配置。
tunnel:用于管理网络隧道,包括添加、删除、配置隧道接口。
tuntap:用于管理 TUN/TAP 设备,主要用于虚拟网络设备的管理。
maddress:用于管理组播地址,包括添加、删除、显示组播地址信息。
mroute:用于管理组播路由表,包括添加、删除、显示组播路由信息。
mrule:用于管理组播路由策略规则。
monitor:用于监视网络设备和路由信息的变化。
xfrm:用于管理 IPsec(Internet Protocol Security)协议,包括配置安全策略、安全关联等。
netns:用于管理网络命名空间,可以创建、删除、切换网络命名空间。
l2tp:用于配置和管理 L2TP(Layer 2 Tunneling Protocol)隧道。
fou:用于配置和管理 FOU(Generic UDP Encapsulation)隧道。
macsec:用于配置和管理 MACsec(Media Access Control Security)安全。
tcp_metrics:用于管理 TCP 指标,包括显示和修改 TCP 相关的指标。
token:用于管理网络令牌桶(Token Bucket),主要用于流量控制。
netconf:用于配置和管理网络设备的参数,如网络接口的速率、全双工/半双工模式等。
ila:用于配置和管理 Identifier-Locator Addressing(ILA)协议。
vrf:用于配置和管理虚拟路由转发表(VRF),用于实现网络隔离和多租户环境。
而用于管理网络命令空间的子命令就是netns了。ns就是namespace的缩写。上面加粗部分是比较常用的管理子命令。
ip netns命令
ip netns list 列出ip netns命令管理的网络命名空间列表
ip netns add NAME 创建一个名为NAME的网络命名空间
ip netns set NAME NETNSID 给名为NANE的网络命名空间 指定 ID为NETNSID
ip [-all] netns delete [NAME] 删除所有-all的网络命名空间或者指定删除名为NAME的网络命名空间
ip netns monitor 监视网络命名空间变化,实时显示网络命名空间的创建、删除和切换等操作
ip netns list-id 显示当前系统中的网络命名空间列表及其ID
ip [-all] netns exec [NAME] cmd ... 在名为NAME的网络命名空间中执行网络命令cmd
ip netns identify [PID] 确定进程ID为PID的进程的网络命名空间
ip netns pids NAME 查看名为NAME的网络命名空间的所有进程PID
实际操作
1.创建一个网络命名空间ns1并查看
2.删除ns1并创建ns2
3.创建ns3并删除所有的网络命名空间
4.创建ns4并指定ID为104
5.查看所有的网络命名空间的ID列表
6.监控网络命名空间的增删等
7.查看ns5的IP地址
可以看到,ns5的IP地址只能看到一个lo,即本地回环地址。不过却却没有发现127.0.0.1这个IP。状态是DOWN,说明没有被启动。
8.启动ns5的本地回环地址
启动网络设备要使用ip link子命令,前面在子命令部分已经说明了ip link的用途。更多ip link用法可以使用ip link help来查看。
9.查看ns5的所有进程pid
直接查看pids是没有内容返回的,因为ns5网络命名空间中没有运行任何程序。左边运行了一个ping命令且循环执行着。所以此时ns5内有一个进程了,就能够查询到ns5内的进程pids了。
再次运行一次,此时看到进程ID变为了11497。然后我们此时在Linux系统而不是ns5中使用ps查看11497的进程,也能看到一个ping命令在执行。虽然ping命令运行的网络命名空间在ns5,但是进程还是在系统中的,此时ns5中的进程是没有和系统进程隔离的。以后再讲到进程隔离还会讲到进程隔离,那时候看到的效果和现在看到的是不一样的。
10.再运行一次ping,且查询ping进程对应的网络命名空间名称
我们可以通过命名空间名称列出来所有的进程PID,也可以通过进程PID来查询对应的网络命名空间。
但是对于系统的进程,如1号进程,是查不到网络命名空间名称的,因为系统进程是匿名的网络命名空间,即系统的网络命名空间。
11.如果要在网络命名空间连续执行多次命令,可以先进入网络命名空间,即打开终端
可以看到,进入终端后,查看的ip还是ns5的。这样可以和在系统一样尽情玩耍了。
不过因为提示符和系统的一样,很容易混淆。
12.退出ns5的终端,并指定特殊提示符
通过对网络命名空间的命令的全部操作,可以很好的了解命令的使用,以及网络命名空间的一些特性。不过只对一个网络命名空间操作还不能完全了解网络命名空间。网络命名空间要实现通信才能体现真正的作用。这个后续再分享。
总结
本文说明了基础的网络栈概念,再详细全面讲解网络操作命令,借此实战了解熟悉网络命名空间的操作,为今后进一步深入学习网络命名空间打下基础。虽然命令看着简单,还是需要动手操作一下哦。边操作边思考,可以促进理解。
标签:命令,ip,网络,空间,用于,实操,Linux,命名 From: https://blog.csdn.net/m0_61230499/article/details/137596881