ThinkPad物理机安装Linux系统实战之Linux网络虚拟化技术


前言

随着Docker技术的不断发展,容器化技术也越来越重要,很多人都开启了学习容器,容器云,这篇为Docker技术网络虚拟化技术铺垫一下。


计算机网络模型回顾

在这里插入图片描述
在互联网世界,两台主机要进行通信,是通过两个网卡/网络接口连接起来,接收和发送数据包都经过网卡,两个网卡之间相当于建立了一条通信管道
在这里插入图片描述

Linux中的网卡

显示系统所有的网卡:ls /sys/class/net

[root@localhost ~]# ls /sys/class/net
br-d8caad41bc0e  docker0  enp0s25  lo  veth3f47302  veth424b96c  veth449ee65  veth7d155ad  vethec7a7e6  vethf03003e  wlp3s0

查看链路层网卡信息:ip link show

[root@localhost ~]# ip link show
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
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:21:cc:c2:c7:9b brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 8c:70:5a:de:9e:f4 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:30:26:d1:e9 brd ff:ff:ff:ff:ff:ff
8: veth3f47302@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 7a:6c:a2:82:e1:79 brd ff:ff:ff:ff:ff:ff link-netnsid 0
74: veth449ee65@if73: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default 
    link/ether 1e:b8:b6:c8:0b:54 brd ff:ff:ff:ff:ff:ff link-netnsid 2
82: vethf03003e@if81: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-d8caad41bc0e state UP mode DEFAULT group default 
    link/ether 06:bc:a5:5a:8c:1b brd ff:ff:ff:ff:ff:ff link-netnsid 3

显示应用层网卡信息:ip a

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:21:cc:c2:c7:9b brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 8c:70:5a:de:9e:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.103/24 brd 192.168.0.255 scope global dynamic wlp3s0
       valid_lft 5784sec preferred_lft 5784sec
    inet6 fe80::8e70:5aff:fede:9ef4/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:30:26:d1:e9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:30ff:fe26:d1e9/64 scope link 
       valid_lft forever preferred_lft forever
8: veth3f47302@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 7a:6c:a2:82:e1:79 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::786c:a2ff:fe82:e179/64 scope link 
       valid_lft forever preferred_lft forever
74: veth449ee65@if73: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 1e:b8:b6:c8:0b:54 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::1cb8:b6ff:fec8:b54/64 scope link 
       valid_lft forever preferred_lft forever
82: vethf03003e@if81: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-d8caad41bc0e state UP group default 
    link/ether 06:bc:a5:5a:8c:1b brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::4bc:a5ff:fe5a:8c1b/64 scope link 
       valid_lft forever preferred_lft forever

信息详解

BROADCAST 该接口支持广播
MULTICAST 该接口支持多播
UP 网络接口已启用
LOWER_UP 网络电缆已插入,设备已连接至网络
---------------
mtu 1500 最大传输单位(数据包大小)为1,500字节
qdisc pfifo_fast 用于数据包排队
state UP 网络接口已启用
group default 接口组
qlen 1000 传输队列长度
link/ether 08:00:27:ba:0a:28 接口的 MAC(硬件)地址
brd ff:ff:ff:ff:ff:ff 广播地址
inet 192.168.100.12/24 绑定的IPv4 地址
brd 192.168.0.255 广播地址
scope global 全局有效
dynamic eth1 地址是动态分配的
valid_lft 143401sec IPv4 地址的有效使用期限
preferred_lft 143401sec IPv4 地址的首选生存期
inet6 fe80::a00:27ff:feba:a28/64 IPv6 地址
scope link 仅在此设备上有效
valid_lft forever IPv6 地址的有效使用期限
preferred_lft forever IPv6 地址的首选生存期

Linux网络虚拟化技术

两个主机通信是通过两个网卡连接起来,那在同一个Linux系统,怎么模拟多个网络环境,两个容器是怎么做到网络隔离
在这里插入图片描述
在Linux系统中,是通过network namespace来进行网络隔离,Docker也是利用该技术,创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等。总之,与网络有关的组件都是独立的。

ip命令提供了ip netns exec子命令可以在对应的network namesapce进行操作,要执行的可以是任何命令,不只是和网络相关的,创建network namesapce后可以通过ip ntns exec+namespace名+shell指令进行操作

常用的一些network namespace指令

ip netns list #查看network namespace 
ip netns add netspace1 #添加network namespace 
ip netns delete netspace1 #删除network namespace

创建虚拟网络环境

通过Veth Pair实现两个network namesapce之间的通信

创建namespace one

[root@localhost ~]# ip netns add  netspace1

创建namespace two

[root@localhost ~]# ip netns add  netspace2

在这里插入图片描述
此时两个Network Namespace只有lo设备,互相之间是没有关联,无法通信,只能同一Network Namesapce内的应用访问

连通两个Network Namespace
Linux提供Virtual Ethernet Pair技术,分别在两个namespace建立一对网络接口,类似在两个namespace之间建立一条pipe,好像拉一条网线一样,让彼此之间可以通信,简称veth pair。

veth pair是成对出现,删除其中一个,另一个也会自动消失。
在这里插入图片描述

  • 创建连一对veth虚拟网卡:
    ip link add veth-one type veth peer name veth-two
    类似pipe,发给veth-one的数据包veth-two那边会收到,发给veth-two的数据包veth-one会收到。就相当于给机器安装了两个网卡,并且之间用网线连接起来了,两个虚拟网卡分别为veth-one、veth-two
  • 把两个虚拟网卡分别加到两个netspace1、netspace2中
    ip link set veth-one netns netsapce1
    ip link set veth-two netns netsapce2
  • 分别启动这两个虚拟网卡
    ip netns exec netsapce1 ip link set veth-one up
    ip netns exec netsapce2 ip link set veth-two up
    此时两个虚拟网卡状态为UP,都已经启动,但还没有IP地址,因此还不能通信
  • 给虚拟网卡配置IP地址
    ip netns exec netsapce1 ip addr add 192.168.0.101/24 dev veth-one
    ip netns exec netsapce2 ip addr add 192.168.0.102/24 dev veth-two
  • 两个network namespace已经成功连通
    ip netns exec netsapce1 ping 192.168.0.102
    ip netns exec netsapce2 ping 192.168.0.101
    在这里插入图片描述

通过Bridege建立多个namesapce通信

多个namesapce是不能直接互相通信,因为处于不同的网络,在日常生活中,我们会用到交换机去连接不同的网络,而在Linux,我们可以通过bridege去实现

  • 创建namesapce
[root@localhost ~]# ip netns add ns3
[root@localhost ~]# ip netns add ns4
[root@localhost ~]# ip netns add bridge
  • 创建veth pair网卡
[root@localhost ~]# ip link add type veth
[root@localhost ~]# ip link add type veth

执行一次生成一对,需要执行两次,默认名称:veth0、veth1、veth2、veth3
也可指定名称如:ip link add veth-one type veth peer name veth-two

  • 查看生成的虚拟网卡
[root@localhost ~]# ip link
  • 加入namesapce并改名虚拟网卡
[root@localhost ~]# ip link set dev veth0 name ns3-bridge netns ns3
[root@localhost ~]# ip link set dev veth1 name bridge-ns3 netns bridge
[root@localhost ~]# ip link set dev veth2 name ns4-bridge netns ns4
[root@localhost ~]# ip link set dev veth3 name bridge-ns4 netns bridge
  • 分别进入各个namespace查看网卡信息
[root@localhost ~]# ip netns exec ns3 ip a
[root@localhost ~]# ip netns exec ns4 ip a
[root@localhost ~]# ip netns exec bridge ip a

可以看到ns3与bridge、ns4与bridge的网卡序号是连续的,证明是同一对veth pair

  • 在bridge namespace中创建br设备(网桥)
-- 安装bridge-utils工具:`yum install bridge-utils`
-- 创建br设备:`ip netns exec bridge brctl addbr br`
-- 启动br设备:`ip netns exec bridge ip link set dev br up`
-- 启动bridge中的两个虚拟网卡:
   `ip netns exec bridge ip link set dev bridge-ns3 up`
   `ip netns exec bridge ip link set dev bridge-ns4 up`
-- 把bridge中两个虚拟网卡加入到br设备中:
   `ip netns exec bridge brctl addif br bridge-ns3`
   `ip netns exec bridge brctl addif br bridge-ns4`
-- 启动ns3、ns4中的虚拟网卡,并加入ip:
   `ip netns exec ns3 ip link set dev ns3-bridge up`
   `ip netns exec ns3 ip address add 192.168.0.13/24 dev ns3-bridge`
   `ip netns exec ns4 ip link set dev ns4-bridge up`
   `ip netns exec ns4 ip address add 192.168.0.14/24 dev ns4-bridge`
  • 实现结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值