建立基于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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

猜你喜欢

转载自blog.csdn.net/m0_63624418/article/details/130912267