网络 namespace

声明:所有文章只作为学习笔记用,转载非原创

---- 概念
overlay underlay
https://blog.csdn.net/fy_long/article/details/85317981 

https://blog.csdn.net/chenleiking/article/details/88142580
二层网络通常是指能直接使用Mac地址进程通讯的网络
三层网络更简单:由几个二层网络和路由器组成的网络就是三层网络。
#怎么理解
生成树一般指生成树协议。生成树协议(英语:Spanning Tree Protocol,STP
https://www.zhihu.com/question/21327750 
网络科学家发现了这个规律,有一个大胆设想,既然二层网络里有物理环路,那用一种逻辑的方法将物理的环路斩断,斩成一个发散的树状架构,是不是Frame就不会无限循环下去了?答案是肯定的,也是这么做的。

https://blog.csdn.net/u012503639/article/details/85018730
BPDU代价STP利用BPDU(Bridge Protocol Data Unit,网桥协议数据单元)中三个字段:路径开销、网桥ID、端口优先级/端口ID来确定到根桥的最佳路径顺序,从而决定一个生成树实例。
Unicast 单播

#堆叠
https://www.cnblogs.com/oo_o/p/7256774.html 
http://www.360doc.com/content/16/0916/13/35248368_591240893.shtml 

#大二层
https://www.cnblogs.com/bakari/p/11131268.html
https://www.zhihu.com/question/24393680/answer/132219127 
简单点说:VXLAN就是使用UDP连接多个二层网络,使之成为一个更大的二层网络的技术。
Trill ( Transparent Interconnect Lots of Link)
SPB(Short Path Bridge)
Stack & Port Channel


#VXLAN(Virtual eXtential LAN)意为虚拟可拓展局域网
核心概念如下:

VTEP:VXLAN Tunnel Endpoints,VXLAN的边缘设备。负责将MAC打包为UDP,或者将UDP拆包为MAC。左边VM在一个真实的二层网络中,MAC协议报文传递给VTEP之后,VTEP将其作为原始报文打包到UDP报文里面,通过三层网络传递到右侧VTEP,右侧VTEP收到UDP报文之后,将其拆包,获得原始MAC报文,传递给右侧VM。
VXLAN隧道:隧道是一个逻辑概念。对于两边的VM来说,中间的三层网络是透明的,好像有一条隧道将两个二层网络打通一样,可以直接通讯。隧道两端的VTEP需要知道彼此的IP地址,UDP报文会根据这个IP地址发送出去。
VNI:VNI配置在VTEP上,类似VLAN ID,用来划分VXLAN的广播域,不同VNI的VXLAN不能直接进行二层通讯。且相比VLAN ID的12字节空间(4096),VNI支持海量区域的隔离。VNI所代表的广播域称之为Bridge-Domain。

VXLAN Header:增加VXLAN头(8字节),其中包含24比特的VNI字段,用来定义VXLAN网络中不同的租户。此外,还包含VXLAN Flags(8比特,取值为00001000)和两个保留字段(分别为24比特和8比特)。
UDP Header:VXLAN头和原始以太帧一起作为UDP的数据。UDP头中,目的端口号(VXLAN Port)固定为4789,源端口号(UDP Src. Port)是原始以太帧通过哈希算法计算后的值。
Outer IP Header:封装外层IP头。其中,源IP地址(Outer Src. IP)为源VM所属VTEP的IP地址,目的IP地址(Outer Dst. IP)为目的VM所属VTEP的IP地址。
Outer MAC Header:封装外层以太头。其中,源MAC地址(Src. MAC Addr.)为源VM所属VTEP的MAC地址,目的MAC地址(Dst. MAC Addr.)为到达目的VTEP的路径上下一跳设备的MAC地址。

前面说过,VXLAN是在二层外面包三层,从报文内容也可以看出来:首先,是二层网络的实际报文,经过VTEP之后,现在前面增加VXLAN头;然后,VTEP使用UDP协议在外面的三层网络上传输,将VXLAN报文当作UDP报文的原始数据;最后,UDP就像正常的三层网络报文一样传递到目的地;


示例
[https://www.cnblogs.com/xinghen1216/p/11813422.html](https://www.cnblogs.com/xinghen1216/p/11813422.html)



---- 练习

#添加 ns
sudo ip netns add docker0
sudo ip netns add docker1

 ls -l /var/run/netns
-r--r--r-- 1 root root 0 7月  30 17:09 docker0
-r--r--r-- 1 root root 0 7月  30 17:10 docker1

#创建Veth pairs
sudo ip link add veth0 type veth peer name veth1
sudo ip link add veth2 type veth peer name veth3
#创建 bridge  br0
brctl addbr br0

将Veth的另一端接入bridge
sudo brctl addif br0 veth1
sudo brctl addif br0 veth3

为"容器“内的网卡分配IP地址,并激活上线
docker0容器:
sudo ip netns exec docker0 ip addr add 172.18.0.2/24 dev veth0
sudo ip netns exec docker0 ip link set veth0 up

docker1容器:
sudo ip netns exec docker1 ip addr add 172.18.0.13/24 dev veth2
sudo ip netns exec docker1 ip link set veth2 up


Veth另一端的网卡激活上线
sudo ip link set veth1 up
sudo ip link set veth3 up

为bridge分配IP地址,激活上线
sudo ip addr add 172.18.0.1/24 dev br0
sudo ip link set br0 up


[root@zabbix3 ~]# ip netns exec docker0 ip addr show 

1: lo:  mtu 65536 qdisc noop state DOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth0@if3:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 72:28:81:3d:7d:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/24 scope global veth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7028:81ff:fe3d:7d06/64 scope link 
       valid_lft forever preferred_lft forever

[root@zabbix3 ~]# ip netns exec docker1 ip addr show 
1: lo:  mtu 65536 qdisc noop state DOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth2@if5:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether fe:7e:70:87:7c:18 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.13/24 scope global veth2
       valid_lft forever preferred_lft forever
    inet6 fe80::fc7e:70ff:fe87:7c18/64 scope link 
       valid_lft forever preferred_lft forever
#抓包
tcpdump -i br0 -n
从容器docker0 ping 容器docker1:
sudo ip netns exec docker0 ping -c 3 172.18.0.3

场景二:从宿主机访问“容器”内网络
在“容器”docker0内启动服务,监听80端口:
sudo ip netns exec docker0 nc -lp 80
在宿主机上执行telnet,可以连接到docker0的80端口:
telnet 172.18.0.2 80

场景三:从“容器”内访问外网
配置内核参数,允许IP forwarding
sudo sysctl net.ipv4.conf.all.forwarding=1
配置iptables FORWARD规则
首先确认iptables FORWARD的缺省策略:

sudo iptables -L
[https://www.linuxidc.com/Linux/2016-09/134832.htm](https://www.linuxidc.com/Linux/2016-09/134832.htm)

#route -n
https://blog.csdn.net/Miss_Audrey/article/details/78771326 
192.168.0.0   10.77.238.254  255.255.0.0     UG    0     0    0  eth0
表示去往192.168.0.0网段的数据包由网关10.77.238.254通过网卡eth0来转发


#overlay实验
[https://blog.csdn.net/a363344923/article/details/98033856?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param](https://blog.csdn.net/a363344923/article/details/98033856?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param)

https://github.com/mz1999/blog/blob/master/docs/docker-overlay-networks.md
VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,它将链路层的以太网包封装到UDP包中进行传输。VXLAN最初是由VMware、Cisco开发,主要解决云环境下多租户的二层网络隔离。我们常听到公有云厂商宣称支持VPC(virtual private cloud),实际底层就是使用VXLAN实现的。

我们可以看到,最内部是原始的二层网络包,外面加上一个VXLAN header,其中最重要的是VNI(VXLAN network identifier)字段,它用来唯一标识一个VXLAN。也就是说,使用不同的VNI来区分不同的虚拟二层网络。VNI有24位,基本够公用云厂商使用了。要知道原先用来网络隔离的虚拟局域网VLAN只支持4096个虚拟网络。

VTEP 叫做 VxLAN 隧道端点(VxLAN Tunnel Endpoint),是 VxLAN 协议中将对原始数据包进行封装和解封装的设备,它可以由硬件设备实现,也可以由软件实现。



分别在Node-1、Node-2上执行:
sudo sysctl net.ipv4.conf.all.forwarding=1

在Node-1上执行:

sudo ip netns add docker1
在Node-2上执行:

sudo ip netns add docker2

创建Veth pairs
分别在Node-1、Node-2上执行:

sudo ip link add veth0 type veth peer name veth1
将Veth的一端放入“容器”
在Node-1上执行:
sudo ip link set veth0 netns docker1
在Node-2上执行:
sudo ip link set veth0 netns docker2

创建bridge
分别在Node-1、Node-2上创建bridge br0:
sudo brctl addbr br0


将Veth的另一端接入bridge
分别在Node-1、Node-2上执行:
sudo brctl addif br0 veth1

为"容器“内的网卡分配IP地址,并激活上线
在Node-1上执行:
sudo ip netns exec docker1 ip addr add 172.18.10.2/24 dev veth0
sudo ip netns exec docker1 ip link set veth0 up

在Node-2上执行:
[root@zabbix keepalived]# ip netns exec docker3 ip addr add 172.18.10.2/24 dev veth0
[root@zabbix keepalived]# ip netns exec docker3 ip link set veth0 up


为bridge分配IP地址,激活上线
在Node-1上执行:
ip addr add 172.18.10.1/24 dev br0
 ip link set br0 up
在Node-2上执行:
 ip addr add 172.18.20.1/24 dev br0
 ip link set br0 up
 ip addr add 172.18.10.1/24 dev br0

将bridge设置为“容器”的缺省网关
在Node-1上执行:
 ip netns exec docker1 route add default gw 172.18.10.1 veth0
在Node-2上执行:
 ip netns exec docker3 route add default gw 172.18.20.1 veth0
ip netns exec docker3 route add default gw 172.18.10.1 veth0

在Node-1创建vxlan100:

ip link add vxlan100 type vxlan \
    id 100 \
    local 192.168.31.183 \
    dev eth0 \
    dstport 4789 \
    nolearning

 ip addr add 172.18.0.0/32 dev vxlan100
 ip link set vxlan100 up
#添加路由
ip route add 172.18.10.0/24 dev vxlan100


在Node-2上执行相应的命令:

 ip link add vxlan100 type vxlan \
    id 100 \
    local 192.168.31.192 \
    dev eth0 \
    dstport 4789 \
    nolearning
 ip addr add 172.18.10.0/32 dev vxlan100
 ip link set vxlan100 up
 ip route add 172.18.10.0/24 dev vxlan100 scope global


首先在两个节点上查询到设备vxlan100的MAC地址,例如在我当前的环境:

Node-1上vxlan100的MAC地址是3a:8d:b8:69:10:3e Node-2上vxlan100的MAC地址是0e:e6:e6:5d:c2:da

然后在Node-1上增加ARP和FDB的记录:

 ip neighbor add 172.18.10.2 lladdr 02:8e:53:f1:a3:9e dev vxlan100
 bridge fdb append 02:8e:53:f1:a3:9e dev vxlan100 dst 192.168.31.192


e2:ea:8a:51:25:1f
 ip neighbor add 172.18.0.2 lladdr e2:ea:8a:51:25:1f dev vxlan100
 bridge fdb appende2:ea:8a:51:25:1f dev vxlan100 dst 192.168.31.183

你可能感兴趣的:(网络 namespace)