专栏首页巫山跬步命名空间介绍之七:网络命名空间

命名空间介绍之七:网络命名空间

自从上次我们研究 Linux 命名空间以来已经有一段时间了。我们的系列缺少了一篇,现在补上:网络命名空间。顾名思义,网络命名空间将网络设备、地址、端口、路由、防火墙规则等的使用划分在不同的盒子,基本上是在一个单独运行的内核实例中虚拟化网络。网络命名空间在 2.6.24 版进入内核,约 5 年前;大概一年后,它们才进入黄金时段。从那以后,它们似乎在很大程度上被开发人员忽略了。

基本的网络命名空间管理

与其他命名空间一样,通过将 CLONE_NEWNET 标志传递给 clone() 系统调用可创建网络命名空间。不过,可从命令行方便地使用 ip 网络配置工具来设置和使用网络命名空间。例如:

# ip netns add netns1

此命令创建了一个名为 netns1 的新网络命名空间。当 ip 工具创建网络命名空间时,它会在 /var/run/netns 下为其创建绑定挂载;这允许命名空间一直存在,即使没有进程在其中运行,还有助于操作命名空间自身。由于网络命名空间在可用之前需要大量配置,因此这些交给了系统管理员。

# ls  /var/run/netns

netns1

“ip netns exec”命令可在命名空间中运行网络管理命令:

# ip netns exec netns1 ip link list

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

此命令列出命名空间中的可见接口。可以使用以下命令删除网络命名空间:

# ip netns delete netns1

此命令将删除引用了给定网络命名空间的绑定挂载。但是,只要有进程在命名空间内运行,该命名空间就一直存在。

# ls  /var/run/netns

#

网络命名空间配置

新的网络命名空间将有一个环回设备,但没有其他网络设备。每个网络设备(物理或虚拟接口、网桥等)只能存在于单个网络命名空间中。此外,不能将物理设备(连接到实际硬件的设备)分配给除 root 外的命名空间。相反,可以创建虚拟网络设备(例如虚拟以太网或 veth)并将其分配给命名空间。这些虚拟设备允许命名空间内的进程通过网络进行通信;配置、路由等决定它们可以与谁通信。

首次创建时,新命名空间中的 lo 环回设备被关闭,因此即使 ping 环回设备也会失败:

# ip netns exec netns1 ping 127.0.0.1

connect: Network is unreachable

打开该接口便可 ping 环回地址:

# ip netns exec netns1 ip link set dev lo up

# ip netns exec netns1 ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

64 bytes from 127.0.0.1: icmp\_seq=1 ttl=64 time=0.051 ms

但 netns1 和根名称空间之间仍然不能通信。为此,需要创建和配置虚拟以太网设备:

# ip link add veth0 type veth peer name veth1

# ip link set veth1 netns netns1

第一个命令设置一对已连接的虚拟以太网设备。发送到 veth0 的数据包将被 veth1 接收,反之亦然。第二个命令将 veth1 分配给 netns1 命名空间。

# ip netns exec netns1 ifconfig veth1 10.1.1.1/24 up

# ifconfig veth0 10.1.1.2/24 up

然后,这两个命令为两个设备设置 IP 地址。

# ping 10.1.1.1

PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.

64 bytes from 10.1.1.1: icmp\_seq=1 ttl=64 time=0.087 ms

...



# ip netns exec netns1 ping 10.1.1.2

PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.

64 bytes from 10.1.1.2: icmp\_seq=1 ttl=64 time=0.054 ms

...

如上面的 ping 命令所示,可以双向通信了。

不过,如前所述,命名空间并不共享路由表或防火墙规则,可通过在 netns1 中运行 route 和 iptables -L 来证明。

# ip netns exec netns1 route

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 veth1



# ip netns exec netns1 iptables -L

Chain INPUT (policy ACCEPT)

target     prot opt source               destination



Chain FORWARD (policy ACCEPT)

target     prot opt source               destination



Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

第一行命令将简单地显示数据包到 10.1.1 子网的路由(使用veth1),而第二行命令显示没有配置防火墙。这些都意味着从 netns1 发送到互联网的数据包将收到“network is unreachable”消息。如果需要的话,有几种方法可以将命名空间连接到互联网。可以在根名称空间和 netns1 的 veth 设备中创建网桥。或者,可以在根命名空间中配置 IP 转发和网络地址转换(NAT)。其中任何一种(还有其他的配置可能性)都允许 netns1 的数据包到达互联网,并在 netns1 中收到回复。

分配给命名空间(通过clone()、unshare() 或 setns())的非 root 进程只能访问在该命名空间的网络设备和配置 --- 当然,root 可以添加并配置新设备。借助 ip netns 子命令,有两种寻址网络命名空间的方法:按名称(如 netns1)或按命名空间中进程的 ID。由于 init 通常位于根命名空间中,因此可以使用如下命令:

# ip link set vethX netns 1

这将把一个(可能是新创建的)veth 设备放入根名称空间,它将为来自任何其他命名空间的 root 用户工作。如果不希望 root 用户执行网络命名空间中的此类操作,可以使用 PID 和挂载命名空间来使得其他网络命名空间无法访问。

网络命名空间的使用

正如我们所看到的,一个命名空间的网络可以完全没有(或只是环回)任何功能,也可以完全访问系统的网络。这使得网络命名空间有许多不同的用例。

通过关闭命名空间内的网络,管理员可以确保其内运行的进程无法与命名空间外建立连接。即使进程由于某种安全漏洞而受到损害,它也无法加入僵尸网络或发送垃圾邮件。

即使是处理网络流量的进程(例如,web 服务器工作进程或 web 浏览器呈现进程)也可被放置到受限制的命名空间中。一旦建立了与远程终端的连接,则该连接的文件描述符便可被 clone() 创建的新网络命名空间中的子进程处理。因为子进程会继承父进程的文件描述符,所以可以访问连接的描述符。另一种可能是,父进程通过 Unix 套接字将连接的文件描述符发送到受限网络命名空间中的进程。不管哪种情况,子进程或工作进程都无法建立其他网络连接,因为命名空间中缺少合适的网络设备。

命名空间还可以用来在一个单独的盒子中测试复杂的网络配置。另外,可以在更为密闭、防火墙更严格的命名空间中运行敏感服务。显然,还可通过网络命名空间为每个容器提供自己的网络视图,而不受容器外部进程的影响。等等。

命名空间通常提供了一种划分系统资源并将进程组与其他资源隔离的方法。网络命名空间大体也如此,但由于网络是安全的敏感区域,因此提供各种类型的网络隔离尤其重要。当然,同时使用多个命名空间类型可以为安全性和其他需求提供更多的隔离。


原文:https://lwn.net/Articles/580893/

公众号:Geek乐园

博客:https://blog.csdn.net/u012319493/article/details/102881935

原文链接:https://lwn.net/Articles/580893/

原文作者:Jake Edge

我来说两句

0 条评论
登录 后参与评论

相关文章

  • windows使用ubuntu启动linux服务

    有些服务只能在linux中策马奔腾,但是公司配置windows电脑,因此在windows中安装ubuntu服务,再在启动的ubuntu中启动linux服务

    用户1558882
  • 如何查看 Linux 服务器性能参数指标?

    这里只是一些简单的工具查看系统的相关参数,当然很多工具也是通过分析加工 /proc、/sys 下的数据来工作的,而那些更加细致、专业的性能监测和调优,可能还需要...

    lyb-geek
  • Linux安装JDK

    如果您有更好的技术与作者分享,或者商业合作; 请访问作者个人网站 http://www.esqabc.com/view/message.html 留言给...

    Mr.Vv
  • 老牌运维教你如何快速分析Linux服务器的性能问题

    该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU的一个负载情况。

    lyb-geek
  • 有了这个开源项目,再也不会忘记 Linux 命令啦

    重磅资讯、干货,第一时间送达今日推荐:什么是ZooKeeper?个人原创博客:点击前往

    好好学java
  • Docker容器实战(七) - 容器中进程视野下的文件系统

    这么一搞,进程就真的被“装”在了一个与世隔绝的房间里,而这些房间就是PaaS项目赖以生存的应用“沙盒”。

    JavaEdge
  • linux Centos系统中添加一个新用户并授权的步骤

    声明: 如果您有更好的技术与作者分享,或者商业合作; 请访问作者个人网站 http://www.esqabc.com/view/message.html ...

    Mr.Vv
  • 名企linux系统工程师面试题总结

    Linux 文件系统使用索引节点来记录文件信息,作用于 Windows 的文件分配表类 似,索引节点是一个数据结构,它包含了一个文件的文件名,位置,大小,建立或...

    胡齐
  • linux安装Mysql数据库

    声明: 如果您有更好的技术与作者分享,或者商业合作;请访问作者个人网站 http://www.esqabc.com/view/message.html 留言...

    Mr.Vv
  • 定时任务实现方式对比

    明白它的延迟原理和Timer一样,可以知道如果我把核心线程数改成1,则效果和Timer类似

    老梁

扫码关注云+社区

领取腾讯云代金券