Linux路由机制打通网络

 

主机名:node2.smoke.com

操作系统:centos 7.5

内核版本:3.10.0-862.el7.x86_64

网卡1:vmnet0 172.16.100.68

网卡2:vmnet8 dhcp client

 

node2:

[root@node2 ~]# cd /etc/yum.repos.d/
[root@node2 yum.repos.d]# mkdir OldMirrorFile
[root@node2 yum.repos.d]# mv CentOS-* OldMirrorFile/
[root@node2 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@node2 yum.repos.d]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@node2 yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2

下载docker-ce的yum源报错如下:

[root@node2 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
Could not fetch/save url https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14]
 curl#60 - "Peer's Certificate has expired."

由于系统时间问题导致:

[root@node2 yum.repos.d]# hwclock -s
[root@node2 yum.repos.d]# date
Wed Feb 26 21:57:39 EST 2020
[root@node2 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@node2 yum.repos.d]# yum makecache fast
[root@node2 yum.repos.d]# yum -y install docker-ce
[root@node2 yum.repos.d]# systemctl enable docker

# 注意:

# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。

# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
# 

# 安装指定版本的Docker-CE:

# Step 1: 查找Docker-CE的版本:

# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages

# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)

# sudo yum -y install docker-ce-[VERSION]

#安装校验

root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 
Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: false

注册阿里云账号密码https://cr.console.aliyun.com,登录后点击镜像加速器,复制加速器地址(https://bhzjdbej.mirror.aliyuncs.com)

[root@node2 ~]# mkdir -p /etc/docker
[root@node2 ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
>   "registry-mirrors": ["https://bhzjdbej.mirror.aliyuncs.com"]
> }
> EOF
{
  "registry-mirrors": ["https://bhzjdbej.mirror.aliyuncs.com"]
}
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker
[root@node2 ~]# systemctl | grep docker
[root@node2 ~]# docker info

关闭默认的frewalld防火墙,安装iptables-services

[root@node2 ~]# systemctl disable firewalld
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# yum -y install iptables-services
[root@node2 ~]# systemctl enable iptables
[root@node2 ~]# systemctl start iptables

设置内核参数

[root@node2 ~]# vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@node2 ~]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

node2上修改Docker0的网络地址,与docker130不冲突

[root@node2 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=172.18.0.1/16
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl restart docker
[root@node2 ~]# ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:85:a4:9a:25 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
       valid_lft forever preferred_lft forever

node1:

[root@node1 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl restart docker
[root@node1 ~]# ip route add 172.18.0.0/16 via 172.16.100.68
[root@node1 ~]# ip route show
default via 192.168.204.2 dev ens37 proto dhcp metric 101
172.16.100.0/24 dev ens33 proto kernel scope link src 172.16.100.67 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 via 172.16.100.68 dev ens33
192.168.204.0/24 dev ens37 proto kernel scope link src 192.168.204.135 metric 101

node2:

[root@node2 ~]# ip route add 172.17.0.0/16 via 172.16.100.67
[root@node2 ~]# ip route show
default via 192.168.204.2 dev ens37 proto dhcp metric 101
172.16.100.0/24 dev ens33 proto kernel scope link src 172.16.100.68 metric 100
172.17.0.0/16 via 172.16.100.67 dev ens33
172.18.0.0/16 dev docker0 proto kernel scope link src 172.18.0.1
192.168.204.0/24 dev ens37 proto kernel scope link src 192.168.204.136 metric 101

node1:

[root@node1 ~]# docker run --rm=true -it java /bin/bash
root@c02064e68741:/# ip addr show
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
211: eth0@if212: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

node2:

[root@node2 ~]# docker run --rm=true -it java /bin/bash
root@f8f3cd2ef86b:/# ip addr show
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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@f8f3cd2ef86b:/# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=0 ttl=63 time=1.402 ms
64 bytes from 172.17.0.1: icmp_seq=1 ttl=63 time=1.053 ms
^C--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.053/1.228/1.402/0.175 ms
root@f8f3cd2ef86b:/# ping 172.17.0.2    #ping对端node1上的容器不通是防火墙问题
PING 172.17.0.2 (172.17.0.2): 56 data bytes
92 bytes from 172.16.100.67: Dest Unreachable, Unknown Code: 10
92 bytes from 172.16.100.67: Dest Unreachable, Unknown Code: 10
92 bytes from 172.16.100.67: Dest Unreachable, Unknown Code: 10
^C--- 172.17.0.2 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
[root@node2 ~]# iptables -L FORWARD -n --line-number
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
2    DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
[root@node2 ~]# iptables -D FORWARD 7
[root@node2 ~]# iptables -L FORWARD -n --line-number
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
2    DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

 node1:

[root@node1 ~]# iptables -L FORWARD -n --line-number
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
2    DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
6    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
7    DROP       all  --  0.0.0.0/0            0.0.0.0/0
[root@node1 ~]# iptables -D FORWARD 6
[root@node1 ~]# iptables -L FORWARD -n --line-number
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
2    DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
4    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
6    DROP       all  --  0.0.0.0/0            0.0.0.0/0

node2:

root@f8f3cd2ef86b:/# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=62 time=2.085 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=62 time=0.955 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=62 time=1.060 ms
^C--- 172.17.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.955/1.367/2.085/0.510 ms

node1:

root@c02064e68741:/# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=62 time=3.560 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=62 time=0.684 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=62 time=1.008 ms
^C--- 172.18.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.684/1.751/3.560/1.286 ms
[root@node1 ~]# yum -y install wireshark
[root@node1 ~]# tshark -i docker0 -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'docker0'
  1 0.000000000   172.17.0.2 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=16/4096, ttl=64
  2 0.000674937   172.18.0.2 -> 172.17.0.2   ICMP 98 Echo (ping) reply    id=0x0009, seq=16/4096, ttl=62 (request in 1)
  3 1.002050708   172.17.0.2 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=17/4352, ttl=64
  4 1.003267228   172.18.0.2 -> 172.17.0.2   ICMP 98 Echo (ping) reply    id=0x0009, seq=17/4352, ttl=62 (request in 3)
4 packets captured
[root@node1 ~]# tshark -i docker0 -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'docker0'
  1 0.000000000   172.17.0.2 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=139/35584, ttl=64
  2 0.000629531   172.18.0.2 -> 172.17.0.2   ICMP 98 Echo (ping) reply    id=0x0009, seq=139/35584, ttl=62 (request in 1)
  3 1.002125513   172.17.0.2 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=140/35840, ttl=64
  4 1.003037417   172.18.0.2 -> 172.17.0.2   ICMP 98 Echo (ping) reply    id=0x0009, seq=140/35840, ttl=62 (request in 3)
4 packets captured

node2:

[root@node2 ~]# yum -y install wireshark
[root@node2 ~]# tshark -i ens33 -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
  1 0.000000000 172.16.100.67 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=334/19969, ttl=63
  2 0.000112091   172.18.0.2 -> 172.16.100.67 ICMP 98 Echo (ping) reply    id=0x0009, seq=334/19969, ttl=63 (request in 1)
  3 0.918191754 172.16.100.67 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=335/20225, ttl=63
  4 0.918338370   172.18.0.2 -> 172.16.100.67 ICMP 98 Echo (ping) reply    id=0x0009, seq=335/20225, ttl=63 (request in 3)
4 packets captured
[root@node2 ~]# tshark -i docker0 -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'docker0'
  1 0.000000000 172.16.100.67 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=352/24577, ttl=62
  2 0.000067745   172.18.0.2 -> 172.16.100.67 ICMP 98 Echo (ping) reply    id=0x0009, seq=352/24577, ttl=64 (request in 1)
  3 0.919349700 172.16.100.67 -> 172.18.0.2   ICMP 98 Echo (ping) request  id=0x0009, seq=353/24833, ttl=62
  4 0.919480456   172.18.0.2 -> 172.16.100.67 ICMP 98 Echo (ping) reply    id=0x0009, seq=353/24833, ttl=64 (request in 3)
4 packets captured

数据包流程:

ping request: c1 --> node1 docker0 --> node1 ens33 --> node2 ens33 --> node2 docker0 --> c2

ping reply: c2 --> node2 docker0 --> node2 ens33 --> node1 ens33 --> node1 docker0 --> c1

node1:

[root@node1 ~]# tshark -i docker0 -N m -e ip.src -e ip.dst -e eth.src -e eth.dst -T fields -E separator=, -f "net 172.18.0.0/16" -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'docker0'
172.17.0.2,172.18.0.2,02:42:ac:11:00:02,02:42:1c:bd:fc:1e
172.18.0.2,172.17.0.2,02:42:1c:bd:fc:1e,02:42:ac:11:00:02
172.17.0.2,172.18.0.2,02:42:ac:11:00:02,02:42:1c:bd:fc:1e
172.18.0.2,172.17.0.2,02:42:1c:bd:fc:1e,02:42:ac:11:00:02
4 packets captured
[root@node1 ~]# tshark -i ens33 -N m -e ip.src -e ip.dst -e eth.src -e eth.dst -T fields -E separator=, -f "net 172.18.0.0/16" -f icmp    
#mac地址发生改变
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
172.16.100.67,172.18.0.2,00:0c:29:67:e5:70,00:0c:29:70:86:6c
172.18.0.2,172.16.100.67,00:0c:29:70:86:6c,00:0c:29:67:e5:70
172.16.100.67,172.18.0.2,00:0c:29:67:e5:70,00:0c:29:70:86:6c
172.18.0.2,172.16.100.67,00:0c:29:70:86:6c,00:0c:29:67:e5:70
4 packets captured

node2:

[root@node2 ~]# tshark -i ens33 -N m -e ip.src -e ip.dst -e eth.src -e eth.dst -T fields -E separator=, -f "net 172.17.0.0/16" -f icmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'ens33'
172.16.100.67,172.18.0.2,00:0c:29:67:e5:70,00:0c:29:70:86:6c
172.18.0.2,172.16.100.67,00:0c:29:70:86:6c,00:0c:29:67:e5:70
172.16.100.67,172.18.0.2,00:0c:29:67:e5:70,00:0c:29:70:86:6c
172.18.0.2,172.16.100.67,00:0c:29:70:86:6c,00:0c:29:67:e5:70
4 packets captured
[root@node2 ~]# tshark -i docker0 -N m -e ip.src -e ip.dst -e eth.src -e eth.dst -T fields -E separator=, -f "net 172.17.0.0/16" -f icmp    
#mac地址发生改变
Running as user "root" and group "root". This could be dangerous.
Capturing on 'docker0'
172.16.100.67,172.18.0.2,02:42:85:a4:9a:25,02:42:ac:12:00:02
172.18.0.2,172.16.100.67,02:42:ac:12:00:02,02:42:85:a4:9a:25
172.16.100.67,172.18.0.2,02:42:85:a4:9a:25,02:42:ac:12:00:02
172.18.0.2,172.16.100.67,02:42:ac:12:00:02,02:42:85:a4:9a:25
4 packets captured

Docker网络方案

双网卡独立大二层交换(linux bridge)

Overlay网络

基于ovs的Overlay网络

neutron网络

 

官方的Libnetwork

Socketplane被docker公司收购,成为其官方网络的起源

开发者不想操作是否是 VLANs, VXLANs, Tunnels 或者是 TEPs. 对于架构人们最关心的是性能和可靠性。而SocketPlane 在 socket 层面提供了一个网络的抽象层,通过可管理的方式去解决各种网络问题。

主要特性:

•Open vSwitch 集成

•用于 Docker 的零配置多主机网络

•Docker/SocketPlane 集群的优雅增长

•支持多网络

•分布式 IP 地址管理 (IPAM)

1.将libnetwork集成到Docker Engine

2.在Docker CLI中使用新的network命令

3.撰写『-net』 参数的文档,以告知用户如何使用它来为容器指定网络

4.在network和endpoint中支持添加『label』

5.研发新的『bridge』 插件,以替换Docker目前的实现

6.研发『分布式bridge』 插件,以支持跨容器网络

目前看到有一些计划是打算将OVS项目关联到Docker上来,从Linux Kernel 3.3开始, OVS项目就是内核的一部分。当我听到这个的时候我觉得是不是脑袋让驴踢了。首先声明我并不是反对使用OVS,实际上,它是一个非常不错的网络工具套件。它的设置比较复杂,对于新手来说有一个陡峭的学习曲线,但是一旦学会, OVS就可以帮你事半功倍。关于这个话题我听到的一个讨论是:“如果OVS工作在Docker上,那么工作一切都变得很美好”。让我告诉你,亲们:如果让我花费大量时间学习它,最后的结果只能是:“还好,可以用”。我并不想说的那么愤世嫉俗,实际情况是在某些常用环境下OVS会崩溃。因此,使用OVS只是一种疯狂的想法罢了。

http://containertutorials.com/network/ovs_docker.html

https://github.com/openvswitch/ovs/blob/master/utilities/ovs-docker

Currently libnetwork is nothing more than an attempt to modularize the Docker platform's networking subsystem by moving it into libnetwork as a library.