• 建立基于Open vSwitch的GRE隧道


    建立基于Open vSwitch的GRE隧道

    1. 环境的准备

    图6-1 连接拓扑图

    如图6-1所示为两台虚拟机连接拓扑图,两台虚拟机ens33网卡,通过虚拟交换机连接在一起,地址网段为30.0.0.0/24。在Docker主机ens33,IP地址为30.0.0.10/24,创建br-int网桥,IP地址为30.1.0.1/24。创建br0网卡,Docker容器使用br0网卡,绑定到br-int网桥上。KVM主机中创建br-ex网桥,配置IP地址为30.0.0.20/24,创建br-int网卡,KVM虚拟机使用br-int网卡,绑定到br-ex网桥上。KVM主机br-int网卡和Docker主机br-int建立GRE隧道,为GRE隧道指定静态路由。

    (1)Docker主机

    配置1核CPU,2 GB内存,系统为CentOS 7.5,使用NAT模式,ens33地址为30.0.0.10。

    (2)KVM主机

    配置1核CPU,1 GB内存,系统为CentOS 7.5,使用NAT模式,ens33地址为30.0.0.20。KVM需要打开虚拟化,如下图所示

    (3)所需要准备的软件和镜像包

    需要的软件和镜像包有VMware Workstation Pro、CentOS-7-x86_64-DVD-1804.iso镜像包、YUM安装包。

    2. Docker主机

    (1)升级内核版本

    1 查看当前系统版本。

    # uname -r

    3.10.0-862.el7.x86_64

    2 更新内核。

    # yum install kernel

    3 修改grup引导,重新启动。

    # vi /etc/grub.conf

    #boot=/dev/sda

    default=0

    timeout=5

    splashimage=(hd0,0)/grub/splash.xpm.gz

    hiddenmenu

    title CentOS (3.10.5-3.el6.x86_64)

            root (hd0,0)

            kernel /vmlinuz-3.10.5-3.el6.x86_64 ro root=UUID=285d26b4-1a82-4f6d-be2b-21924be294ac rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=

    us rd_NO_DM rhgb quiet

            initrd /initramfs-3.10.5-3.el6.x86_64.img

    title CentOS (2.6.32-431.el6.x86_64)

            root (hd0,0)

            kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=285d26b4-1a82-4f6d-be2b-21924be294ac rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABL

    E=us rd_NO_DM rhgb quiet

            initrd /initramfs-2.6.32-431.el6.x86_64.img

    内核版本由上至下进行选择,将default改为0,即选择第一个内核版本。

    重新启动系统。

    # reboot

    4 查看升级后系统版本。

    # uname -r

    3.10.0-862.el7.x86_64

    (2)配置网络

    1 修改主机名称。

    # hostnamectl set-hostname docker

    或# vi /etc/sysconfig/network

    NETWORKING=yes

    HOSTNAME=docker

    2 配置Docker主机ens33的网络。

    # vi /etc/sysconfig/network-scripts/ifcfg-ens33

    修改是否连接网络(ONBOOT)。

    ONBOOT=yes

    修改关闭网络实时生效(NM_CONTROLLED)。

    NM_CONTROLLER=no

    添加静态网络模式(BOOTPROTO)。

    BOOTPROTO=static (也可用DHCP)

    添加IP地址掩码和网关。

    IPADDR=30.0.0.10 (根据实际要求配置IP地址)

    NETMASK=255.255.255.0

    GATEWAY=30.0.0.1

    3 重启网络。

    # systemctl restart network

    (3)基础配置

    1 上传Packages.tar.gz和docker.tar.tz文件。

    # tar -zxvf Packages.tar.gz -C /opt/

    #tar -zxvf  docker.tar.gz  -C /opt/

    2 配置本地YUM。

    # vi /etc/yum.repos.d/local.repo

    [docker]

    name=docker

    baseurl=file:///opt/docker

    gpgcheck=0

    enabled=1

    3 清除防火墙规制。

    #yum -y install iptables

    # iptables -F

    # iptables -X

    # iptables -Z

    # iptables-save

    # systemctl stop iptables

    4 开启核内转发。

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    # echo 'net.ipv4.ip_forward=1' >/etc/sysctl.conf

    # echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf

    # echo 'net.ipv4.conf.all.rp_filter=0' >> /etc/sysctl.conf

    生效核内转发。

    # /sbin/sysctl –p

    5 修改SELinux规则。

    # vi /etc/selinux/config

    SELINUX=permissive

    # setenforce 0

    (4)安装服务

    1 安装Open vSwitch、Docker和Bridge服务。

    # yum install openvswitch bridge-utils tunctl docker-io –y

    2 更新路由。

    # yum update iproute

    3 启动Open vSwitch。

    # systemctl start openvswitch

    查看ovs-vsctl的配置。

    # ovs-vsctl show

    9ea07837-4f42-413b-bdc8-56829647874a

    ovs_version: "2.1.3"

    (5)创建网桥

    1 创建br-int网桥。

    #ovs-vsctl add-br br-int

    创建br0网桥。

    #brctl addbr br0

    2 重启网络。

    # systemctl restart network

    3 给br0网桥添加地址。

    #ifconfig  br0 30.1.0.1/24

    4 绑定br0网桥到br-int上面。

    #brctl addif br0 br-int

    (6)创建GRE隧道

    1 创建gre0接口。

    #ovs-vsctl add-port  br-int gre0 -- set interface gre0 type=gre options:remote_ip=30.0.0.20(对端ens33IP地址)

    2 启动br0、br-int网桥。

    #ip link set br0 up

    #ip link set br-int up

    #ifconfig br-int up

    # ifconfig br0 up

    3 配置静态路由。

    #ip route add 30.2.0.0/24 via 30.0.0.20(对端ens33IP地址) dev ens33

    4 配置Docker容器使用的网桥。

    #vi /etc/sysconfig/docker

    other_args=’--bridge=br0’ (文件最后)

    (7)启动Docker服务

    1 启动Docker。

    #systemctl  start docker

    2 上传CentOS 6.5的镜像包。(上传xd-centos6.5-ssh-tar)

    # docker  load < xd-centos6.5-ssh-tar   //将镜像包重新导入

    #docker  images (查看ID号)

    # docker  tag d0d663863c34 (ID为上一步上传镜像的IMAGE ID) centos:6.5

    3 运行容器。

    # docker run -itd  --name=centos6.5 centos:6.5 /bin/bash

    #docker ps -a

    4 查看容器IP。

    # docker exec -it centos6.5  /bin/bash

    进入dock查看IP地址

    则获取的IP地址段为30.1.0.0/24 (与br0在同一个网段)

    3. KVM主机

    (1)基本配置

    检查系统是否支持虚拟化

    看看CPU是否支持虚拟化。

    # grep -E -o 'vmx|svm' /proc/cpuinfo

    注意:返回vmx代表支持因特尔(Intel)系列CPU的虚拟化,返回svm代表支持AMD系列CPU的虚拟化。

    1 配置主机名。

    # hostnamectl set-hostname kvm

    # vi /etc/sysconfig/network

    NETWORKING=yes

    HOSTNAME=kvm

    2 配置KVM主机ens33的网络。

    # vi /etc/sysconfig/network-scripts/ifcfg-ens33

    修改是否连接网络(ONBOOT)。

    ONBOOT=yes

    修改关闭网络实时生效(NM_CONTROLLED)。

    NM_CONTROLLED=no

    添加静态网络模式(BOOTPROTO)。

    BOOTPROTO=static (也可以用DHCP)

    添加IP地址掩码和网关。

    IPADDR=30.0.0.20

    NETMASK=255.255.255.0

    GATEWAY=30.0.0.1

    3 重启网络。

    # systemctl restart network

    4 配置br-ex网桥。

    # cd /etc/sysconfig/network-scripts/

    #cp -p ifcfg-ens33 ifcfg-br-ex

    #vi ifcfg-br-ex

    DEVICE=br-ex

    TYPE=Enternet

    ONBOOT=yes

    NM_CONTROLLED=no

    BOOTPROTO=static

    IPADDR=30.0.0.20 (用当前宿主机的IP地址)

    NETMASK=255.255.255.0

    GATEWAY=30.0.0.1

    #vi ifcfg-ens33 

    DEVICE=ens33

    TYPE=Enternet

    ONBOOT=yes

    NM_CONTROLLED=no

    BOOTPROTO=none

    5 配置YUM。

    上传Packages.tar.gz文件。

    # tar -zxvf Packages.tar.gz -C /opt/

    配置本地YUM文件。

    # vi /etc/yum.repos.d/local.repo

    [centos]

    name=centos

    baseurl=file:///opt/docker

    gpgcheck=0

    enabled=1

    [Packages]

    name=Packages

    baseurl=file:///opt/Packages

    gpgcheck=0

    enabled=1

    6 清空防火墙配置。

    # iptables –Z

    # iptables –X

    # iptables –F

    # iptables-save

    # systemctl stop iptables

    7 开启核内转发。

    #echo 1 > /proc/sys/net/ipv4/ip_forward

    # echo 'net.ipv4.ip_forward=1' > /etc/sysctl.conf

    # echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf

    # echo 'net.ipv4.conf.all.rp_filter=0' >> /etc/sysctl.conf

    生效核内转发。

    [root@kvm ~]# sysctl -p

    修改SELinux规则。

    # vi /etc/selinux/config

    SELINUX=permissive

    # setenforce 0

    (2)安装服务软件包

    1 安装所需安装包。

    # yum update iproute

    #yum install openvswitch qemu-kvm libvirt dnsmasq -y

    2 启动Open vSwitch。

    # systemctl start openvswitch

    3 配置网桥。

    # ovs-vsctl add-br br-int

    # ifconfig  br-int 30.2.0.1/24

    #ifconfig br-int up

    # ovs-vsctl add-br br-ex

    #ovs-vsctl add-port br-ex ens33 && systemctl  restart network

    (3)配置GRE隧道

    1 配置GRE隧道。

    #ovs-vsctl add-port  br-int gre0 -- set interface gre0 type=gre options:remote_ip=30.0.0.10(对端ens33IP地址)

    2 配置路由。

    #ip route add 30.1.0.0/24 via 30.0.0.10(对方的IP地址) dev br-ex

    3 配置DNS。

    # /usr/sbin/dnsmasq --strict-order --bind-interfaces --interface=br-int --except-interface=lo --pid-file=/var/run/qdhcp.pid --leasefile-ro --dhcp-range=30.2.0.3,30.2.0.254,255.255.255.0,12h --conf-file=

    #ps -ef  |grep dnsmasq

    4 创建安装网卡脚本。(up,down脚本文件都保存/root)

    # vi ovs-ifup

    #!/bin/sh

    switch='br-int'

    /sbin/ifconfig $1 up

    ovs-vsctl add-port ${switch} $1

    5 创建卸载网卡脚本。

    # vi ovs-ifdown

    #!/bin/sh

    switch='br-int'

    /sbin/ifconfig $1 down

    ovs-vsctl del-port ${switch} $1

    6 修改创建的脚本的权限。

    # chmod 777 ovs-if* 

    7 开启虚拟机。

    # ovs-vsctl del-port tap0

    #/usr/libexec/qemu-kvm -m 1024 -drive file=/root/cirros-0.3.3-x86_64-disk.img,if=virtio -net nic,model=virtio -net tap,script=ovs-ifup -nographic -vnc :1

    进入主机查看IP地址,其获取的地址为:30.2.0.0/24(br-int网段地址)

    4. 主机测试

    1 查看开启的Docker容器进程。

    # docker ps –a

    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

    a76c2fc817d1        d0d663863c34        "/bin/bash"         6 hours ago         Up 6 hours                                      mad_poincare    

    进入Docker容器内部

    #docker exec -it 9adae010e4a3 /bin/bash

    # ip a

    6: ens33: mtu 1500 qdisc noqueue state UP

        link/ether 02:42:1e:01:00:02 brd ff:ff:ff:ff:ff:ff

        inet 30.1.0.2/24 scope global ens33

        inet6 fe80::42:1eff:fe01:2/64 scope link

           valid_lft forever preferred_lft forever

    2 测试网络连通性。

    测试Docker主机和KVM主机与br0和br-int网桥之间的连通性。

    # ping 30.1.0.1 -c 4

    PING 30.1.0.1 (30.1.0.1) 56(84) bytes of data.

    64 bytes from 30.1.0.1: icmp_seq=1 ttl=64 time=0.041 ms

    64 bytes from 30.1.0.1: icmp_seq=2 ttl=64 time=0.062 ms

    64 bytes from 30.1.0.1: icmp_seq=3 ttl=64 time=0.041 ms

    64 bytes from 30.1.0.1: icmp_seq=4 ttl=64 time=0.040 ms

    --- 30.1.0.1 ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3000ms

    rtt min/avg/max/mdev = 0.040/0.046/0.062/0.009 ms

    [root@a76c2fc817d1 /]# ping 30.0.0.10 -c 4

    PING 30.0.0.10 (30.0.0.10) 56(84) bytes of data.

    64 bytes from 30.0.0.10: icmp_seq=1 ttl=64 time=0.040 ms

    64 bytes from 30.0.0.10: icmp_seq=2 ttl=64 time=0.048 ms

    64 bytes from 30.0.0.10: icmp_seq=3 ttl=64 time=0.045 ms

    64 bytes from 30.0.0.10: icmp_seq=4 ttl=64 time=0.047 ms

    --- 30.0.0.10 ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3000ms

    rtt min/avg/max/mdev = 0.040/0.045/0.048/0.003 ms

    [root@a76c2fc817d1 /]# ping 30.0.0.20 -c 4

    PING 30.0.0.20 (30.0.0.20) 56(84) bytes of data.

    64 bytes from 30.0.0.20: icmp_seq=1 ttl=63 time=0.614 ms

    64 bytes from 30.0.0.20: icmp_seq=2 ttl=63 time=0.295 ms

    64 bytes from 30.0.0.20: icmp_seq=3 ttl=63 time=2.38 ms

    64 bytes from 30.0.0.20: icmp_seq=4 ttl=63 time=0.533 ms

    --- 30.0.0.20 ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3003ms

    rtt min/avg/max/mdev = 0.295/0.957/2.387/0.834 ms

    [root@a76c2fc817d1 /]# ping 30.2.0.1 -c 4   

    PING 30.2.0.1 (30.2.0.1) 56(84) bytes of data.

    64 bytes from 30.2.0.1: icmp_seq=1 ttl=63 time=0.864 ms

    64 bytes from 30.2.0.1: icmp_seq=2 ttl=63 time=0.545 ms

    64 bytes from 30.2.0.1: icmp_seq=3 ttl=63 time=0.321 ms

    64 bytes from 30.2.0.1: icmp_seq=4 ttl=63 time=0.637 ms

    --- 30.2.0.1 ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3002ms

    rtt min/avg/max/mdev = 0.321/0.591/0.864/0.196 ms

    [root@a76c2fc817d1 /]# ping 30.2.0.140 -c 4

    PING 30.2.0.140 (30.2.0.140) 56(84) bytes of data.

    64 bytes from 30.2.0.140: icmp_seq=1 ttl=62 time=3.20 ms

    64 bytes from 30.2.0.140: icmp_seq=2 ttl=62 time=0.800 ms

    64 bytes from 30.2.0.140: icmp_seq=3 ttl=62 time=1.24 ms

    64 bytes from 30.2.0.140: icmp_seq=4 ttl=62 time=0.766 ms

    --- 30.2.0.140 ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3005ms

    rtt min/avg/max/mdev = 0.766/1.504/3.203/0.999 ms

  • 相关阅读:
    springmvc-ssm整合
    2023.9.19 关于 数据链路层 和 DNS 协议 基本知识
    【React】配置别名路径@
    vue3 区别于 vue2 的“与众不同”
    java中的io流
    oracle 解锁表
    微信H5页面点击直接跳转app-微信开放标签
    具有 Levy 变异和精英自适应竞争机制的蚁狮优化算法-附代码
    Seata 源码篇之AT模式启动流程 - 下 - 04
    【软件工程与实践】(第四版)第6章习题答案详解
  • 原文地址:https://blog.csdn.net/m0_63624418/article/details/130912267