Linux网络
一,网络概述
Docker 本身的技术依赖于 Linux 内核虚拟化技术的发展。所以 Docker 对 Linux 内核的特性有很强的依赖。
其中 Docker 使用到的与 Linux 网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由
二,网络名称空间概述
为了支持网络协议栈的多个实例,Linux 在网络协议栈中引入了网络名称空间(Network Namespace),这些
独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行
网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环
境,而 Docker 正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在 Linux 的网络命名空间
内可以有自己独立的 Iptables 来转发、NAT 及 IP 包过滤等功能。
Linux 的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。
最好的办法就是让这些全局变量成为一个 Net Namespace 变量的成员,然后为了协议栈的函数调用加入一个
Namespace 参数。这就是 Linux 网络名称空间的核心。所有的网络设备都只能属于一个网络名称空间。当然,
通常的物理网络设备只能关联到 root 这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空
间中,而且可以在这些名称空间之间移动。
不同的网络名称空间内,是一个相对独立的、封闭的网络名称空间。如果想实现不同的网络名称空间之间相互访问,需要借助第三方设备来实现:Veth设备对、网桥
三,创建一个网络命令空间
[root@docker ~]# ip netns add test01
[root@docker ~]# ip netns add test02
[root@docker ~]# ip netns list
test02
test01
四,Veth设备对概述
引入Veth设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间链接起来。由于要连接的两个网络命名空间,所以Veth设备是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
veth设备对:相当于用一个网线连接两个不同的网络名称空间中,从而实现网络互通。
veth设备对的缺陷:一对veth设备对只能够连接两个命名空间,假设有101个命名空间需要网络互通,需要5050对veth设备对。所以,veth设备对在面对对个网络命名空间之间的访问,就显得非常冗余。
4.1,veth设备对操作配置
# 创建veth设备对
[root@docker ~]# ip link add veth type veth peer name veth001
# 查看创建的veth设备对(生成了两个veth设备, 互为对方的peer。)
[root@docker ~]# ip link show
83: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 5a:c5:df:72:63:35 brd ff:ff:ff:ff:ff:ff
84: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 3e:85:7d:21:c2:d4 brd ff:ff:ff:ff:ff:ff
# veth设备对绑定网络命令空间
[root@docker ~]# ip link set veth001 netns test01
[root@docker ~]# ip link set veth netns test02
# 查看veth设备对绑定信息
[root@docker ~]# ip netns exec test01 ip a
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
83: veth001@if84: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 5a:c5:df:72:63:35 brd ff:ff:ff:ff:ff:ff link-netnsid 1
[root@docker ~]# ip netns exec test02 ip a
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
84: veth@if83: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 3e:85:7d:21:c2:d4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 将veth设备对配置ip
[root@docker ~]# ip netns exec test01 ip addr add 172.16.1.111/24 dev veth001
[root@docker ~]# ip netns exec test02 ip addr add 172.16.1.222/24 dev veth
# 启动配置好的ip网卡
[root@docker ~]# ip netns exec test01 ip link set dev veth001 up
[root@docker ~]# ip netns exec test02 ip link set dev veth up
# 查看对端veth设备对索引
[root@docker ~]# ip netns exec test01 ethtool -S veth001
NIC statistics:
peer_ifindex: 84
[root@docker ~]# ip netns exec test02 ethtool -S veth
NIC statistics:
peer_ifindex: 83
# 互相ping看网络是否能互通(同一个网段才能互通)
[root@docker ~]# ip netns exec test01 ping 172.16.1.222
PING 172.16.1.222 (172.16.1.222) 56(84) bytes of data.
64 bytes from 172.16.1.222: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from 172.16.1.222: icmp_seq=2 ttl=64 time=0.038 ms
[root@docker ~]# ip netns exec test02 ping 172.16.1.111
PING 172.16.1.111 (172.16.1.111) 56(84) bytes of data.
64 bytes from 172.16.1.111: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 172.16.1.111: icmp_seq=2 ttl=64 time=0.061 ms
五,网桥概述
Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。 网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。
网桥设备 brO 绑定了 eth0、 eth1 。对于网络协议械的上层来说,只看得到 brO 。因为桥接是在数据链路层实现的 ,上层不需要关心桥接的细节,于是协议枝上层需要发送的报文被送到 brO ,网桥设备的处理代码判断报文该被转发到 ethO 还是 ethl ,或者两者皆转发。反过来,从 ethO 或从 ethl 接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。 而有时 ethl 也可能会作为报文的源地址或目的地址 直接参与报文的发送与接收,从而绕过网桥。
网桥:在不同的网络名称空间之外建立一个公用的交换机,用来转发不同命名空间内的网络请求。
六,veth对与网桥比较
网桥与veth设备对相比:veth设备对性能更好。
1、linux中存在不同的命名空间,不同的命名空间之间互相不影响,每一个命名空间中都有自己的独立网络名称空间,每一个独立的网络名称空间之间也是相互隔离(网络是不互通)
2、要实现容器与容器、容器与宿主主机之间网络互通,需要借助第三方网络传输介质
2.1、veth设备对:容器与宿主主机之间的网络互通
缺陷:只能够一对一,如果大量容器之间需要互联互通,需要维护大量的veth设备对
1、大量的veth设备对会占用大量的系统资源
2、大量veth设备对不易维护
3、只能一对一
优点:
1、veth设备对性能很好
2.2、网桥:
网桥是基于二层网络转发实现容器间互联互通的网络互联解决方案。
网络互通的基本条件:必须在同一个网络空间内,才能够实现网络互通
优点:
1、可以为多个容器提供统一的网络
缺点:
1、二层网络转发性能没有veth设备对好
七,iptables
我们知道, Linux 络协议樵非常高效,同时比较复杂 如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢? Linux 提供了一套机制来为用户实现自定义的数据包处理过程。
在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux 网络棋处理数据包的过程中对数据包进行 些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables
Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux网络协议战中灵活的数据包处理机制。
八,网络总结
设备 | 作用总结 |
---|---|
network namespace | 主要提供了关于网络资源的隔离,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙、/proc/net目录、/sys/class/net目录、端口(socket)等。 |
linux Bridge | 功能相当于物理交换机,为连在其上的设备(容器)转发数据帧。如docker0网桥 |
iptables | 主要为容器提供NAT以及容器网络安全。 |
veth pair | 两个虚拟网卡组成的数据通道。在Docker中,用于连接Docker容器和Linux Bridge。一端在容器中作为eth0网卡,另一端在Linux Bridge中作为网桥的一个端口。 |