【NetDevOps】新一代网工需要了解的那点事儿(一)---网络虚拟化

1. 网络虚拟化

1.1 传统网络虚拟化

  随着云计算、大二层、SDN等等这些名词的出现,传统网络架构面临的挑战变得越来越迫切。业内曾有人说“要想实现真正的软件自定义数据中心,网络虚拟化将是最后一公里”从架构上来看确实没毛病。这时候着急的是传统网络厂商,如果不与时俱进则很有可能被淘汰。就好比人家都在玩触屏,你(NOKIA)却还执意玩按键(当然这不是主要原因)。其实传统的网络在前几年数据中心比较火的时候,也催生出很多虚拟化相关的技术。网络虚拟化其实并不陌生,我们常用的Overlays、VLAN、VPN、VRF、HSRP、MPLS这些都是传统网络不断迭代出的虚拟化技术,迫于数据中心、云计算等的需要相继出现了类似STACK、VSS、VDC、VPC、VEB、VEPA、VN-TAG等技术。这些技术有的能在有限的物理网络架构中支持多个逻辑网络,有的能将不同的物理硬件整合到一起,有的则类似计算虚拟化将有限的物理资源虚拟出多个逻辑资源。
  最近在看一本书《Kubernetes网络权威指南》,看了部分章节后觉得有必要暂停脚步理一理。首先是感谢作者提供这么一本书,让传统网工有机会接触Linux中的网络虚拟化,感谢这本书中的坑给我机会去了解Linux底层IP路由是如何实现的。其次是要吐槽一下对于Linux底层不了解的读者来说,第一章可能就晕了!亲身经历😷😷😷 有些地方理解起来和传统网络还真有差别,下面我将戴着口罩😷以一个传统网工的角度来讲解Linux中的网络虚拟化。

1.2 Linux中网络结构

  Linux 虚拟网络的基石都是由一个个的虚拟设备构成的。虚拟化技术没出现之前,计算机网络系统都只包含物理的网卡设备,通过网卡适配器,线缆介质,连接外部网络,构成庞大的 Internet(如下图所示)。然而,随着虚拟化技术的出现,网络也随之被虚拟化,相较于单一的物理网络,虚拟网络变得非常复杂,在一个主机系统里面,需要实现诸如交换、路由、隧道、隔离、聚合等多种网络功能。而实现这些功能的基本元素就是虚拟的网络设备,比如 bridge、tap、tun 和 veth/veth-pair。

                 Physical NIC
               +--------------+
               |  Socket API  |
               +-------+------+
 User Space            |
+------------------------------------------+
 Kernel Space          |
                 raw ethernet
                       |
               +-------+-------+
               | Network Stack |
               +-------+-------+
                       |
               +-------+-------+
               |      eth0     |
               +-------+-------+
                       |
               +-------+-------+
               |      NIC      |
               +-------+-------+
                       |
                      wire

1.3 Linux network namespace

  传统网络中我们有一个技术叫VRF,一般我们可以将每一个VRF看作是一台专用的PE设备。它有独立的路由表、地址空间,有属于自己的网络接口、路由协议。在Linux中类似VRF的功能被称作是network namespace,当然Linux还有其他很多的namespace这里就不做过多讲解(因为我不专业😴)。每个network namespce都有自己的网络设备(如IP、路由表、端口范围、安全策略、/proc/net目录等)。在Linux中维护network namespace主要使用netns这个工具,下面我们逐一展开来讲解。

注:下文为方便书写特将network namespace用NS代替。

1.3.1 netns各参数意义

[root@F0rGeEk ~]# ip netns help             # 该命令可获取netns相关帮助文档
Usage: ip netns list                        # 查看系统中的ns
       ip netns add NAME                    # 创建一个ns
       ip netns set NAME NETNSID            # 给某个ns分配ID
       ip [-all] netns delete [NAME]        # 删除一个ns
       ip netns identify [PID]              # 查看某个进程的ns
       ip netns pids NAME                   # 查找关于这个ns为主的进程
       ip [-all] netns exec [NAME] cmd ...  # 在某个ns中执行命令
       ip netns monitor                     # 监控对ns的操作
       ip netns list-id                     # 通过list-id显示ns

1.3.2 创建一个ns

  我们创建一个名为forgeek的NS,其过程如下;当我们创建一个NS时,系统会自动在/var/run/netns目录中生成一个挂载点。这个挂载点即方便对ns的管理,也是NS在没有进程运行的情况下依然存在。

[root@F0rGeEk ~]# ip netns add forgeek
[root@F0rGeEk netns]# pwd
/var/run/netns
[root@F0rGeEk netns]# ls -l
total 0
-r--r--r--. 1 root root 0 Mar 17 03:23 forgeek

1.3.3 在NS中执行命令

  在主机中我们可以在NS中执行一些命令,经过实践发现居然可以在NS中执行bash切换到NS的shell,比较好奇这样在安全上有没有风险。这里为了区分两个shell,我特意将新建的NS中的hostname命名为ns-forgeek:

[root@F0rGeEk ~]# ip netns exec forgeek ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@F0rGeEk ~]# ip netns exec forgeek bash
[root@ns-forgeek ~]# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
[root@ns-forgeek ~]# exit
exit
[root@F0rGeEk ~]#

1.3.4 激活ns中的环回接口

  通过1.2.3实验过程,我们可以看到当我们创建一个ns后,系统默认会给该ns分配一个loopback接口,并且默认情况下这个接口处于DOWN的状态。这里我们将其设置为UP,之所以要在这里花费一个小结做这个,是因为如果该接口处于DOWN状态的话,后期会有很多你想不到的坑在等你!真的是经验之谈😂😂😂

#  方法一:
[root@F0rGeEk ~]# ip netns exec forgeek ip link set dev lo up
[root@F0rGeEk ~]# ip netns exec forgeek ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# 方法二:
[root@F0rGeEk ~]# ip netns exec forgeek bash
[root@ns-forgeek ~]# ip link set dev lo up
[root@ns-forgeek ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

1.3.5 查询并删除一个NS

[root@F0rGeEk ~]# ip netns list
forgeek
[root@F0rGeEk ~]# ip netns delete forgeek
[root@F0rGeEk ~]# ip netns list
[root@F0rGeEk ~]#
posted @ 2020-04-01 10:20  为极客而生  阅读(635)  评论(0编辑  收藏  举报