一、杂项

1、VLAN划分

1.1 查看linux上支持vlan的8021q模块

[root@master1 ~]# modinfo 8021q
filename:       /lib/modules/3.10.0-693.21.1.el7.x86_64/kernel/net/8021q/8021q.ko.xz
version:        1.8
……

加载模块:
[root@master1 ~]# modprobe 8021q

[root@master1 ~]# ls /proc/net/vlan/
config

1.2 使用vconfig完成VLAN配置

[root@master1 ~]# yum install vconfig

[root@master1 ~]# vconfig --help

二、netns(CentOS7,网络名称空间)

1、杂项

1.1 使用帮助

[root@master1 ~]# ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
……

1.2 添加网络名称空间

[root@master1 ~]# ip netns add r1
[root@master1 ~]# ip netns add r2
[root@master1 ~]# ip netns list
r2
r1

1.3 netns里面运行的程序,在其它地方是看不见的(隔离)

[root@master1 ~]# ip netns exec r1 ifconfig -a
lo: flags=8<LOOPBACK>  mtu 65536
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@master1 ~]# 


[root@master1 ~]# ip netns exec r1 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Ifac

[root@master1 ~]# ip netns exec r1 ifconfig lo 127.0.0.1/8 up
[root@master1 ~]# ip netns exec r1 ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0


在名称空间加iptables规则,其他空间包括宿主机也看不见(隔离)

清空R1规则:
[root@master1 ~]# ip netns exec r1 iptables -F

二、网络虚拟化

1、网络配置

1.1 创建外部桥并配置IP

创建外部网桥:
[root@master1 ~]# brctl addbr br-ex
激活桥:
[root@master1 ~]# ip link set br-ex up

拆除物理网卡IP地址,并将原IP配置到桥br-ex上。然后把物理网卡加入桥里面
[root@master1 ~]# ip addr del 10.201.106.131/24 dev eth0;ip addr add 10.201.106.131/24 dev br-ex;brctl addif br-ex eth0

1.2 创建配置内部桥

[root@master1 ~]# brctl addbr br-in
[root@master1 ~]# ip link set br-in up

1.3 网络名称空间添加网卡

打开路由转发功能:
[root@master1 ~]# vim /etc/sysctl.conf 

net.ipv4.ip_forward = 1
立即生效:
[root@master1 ~]# sysctl -p
net.ipv4.ip_forward = 1


添加一对网卡:
[root@master1 ~]# ip link add veth1.1 type veth peer name veth1.2

将veth1.1网卡加入名称空间r1上:
[root@master1 ~]# ip link set veth1.1 netns r1

将veth1.2网卡加入名称空间r2上:
[root@master1 ~]# ip link set veth1.2 netns r2


宿主机已经看不到veth1.1和veth1.2

给两个名称空间里的网卡改名:
[root@master1 ~]# ip netns exec r1 ip link set veth1.1 name eth0
[root@master1 ~]# ip netns exec r2 ip link set veth1.2 name eth0

给网络名称空间的网卡添加IP:
[root@master1 ~]# ip netns exec r1 ifconfig eth0 10.0.1.1/24 up
[root@master1 ~]# ip netns exec r2 ifconfig eth0 10.0.1.2/24 up

测试联通性:

2、创建配置虚拟机

2.1 创建两个KVM虚拟机

[root@master1 ~]# ls /images/cirros/
cirros-no_cloud-0.3.0-i386-disk.img 

准备映像文件
[root@master1 cirros]# cp cirros-no_cloud-0.3.0-i386-disk.img test1.qcow2
[root@master1 cirros]# cp cirros-no_cloud-0.3.0-i386-disk.img test2.qcow2

创建管理网桥脚本:
[root@master1 ~]# vim /etc/qemu-ifup 

#!/bin/bash
#
bridge=br-in

if [ -n "$1"  ]; then
    ip link set $1 up
    brctl addif $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo "Error,no interface specified"
    exit 1
fi
[root@master1 ~]# chmod +x /etc/qemu-ifup


[root@master1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/


启动第一个虚拟机:
[root@master1 ~]# qemu-kvm -m 128 -smp 1 -name vm1 -drive file=/images/cirros/test1.qcow2,if=virtio,media=disk -net nic,macaddr=52:54:00:aa:bb:cc -net tap,ifname=vif1.0,script=/etc/qemu-ifup --nographic

启动第二个虚拟机:
[root@master1 ~]# qemu-kvm -m 128 -smp 1 -name vm2 -drive file=/images/cirros/test2.qcow2,if=virtio,media=disk -net nic,macaddr=52:54:00:aa:bb:dd -net tap,ifname=vif2.0,script=/etc/qemu-ifup --nographic

查看桥:
[root@master1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-ex		8000.000c29a77aec	no		eth0
br-in		8000.1ad54dd0c92d	no		vif1.0
							vif2.0

2.2 重新配置路由器(网络名称空间)

[root@master1 ~]# ip netns delete r1
[root@master1 ~]# ip netns delete r2
[root@master1 ~]# ip netns list


创建路由器(网络名称空间)
[root@master1 ~]# ip netns add r1
[root@master1 ~]# ip netns list
r1

启动r1,并在宿主机创建一对网卡,其中一块网卡关联到内部桥上面
[root@master1 ~]# ip link add rinr type veth peer name rins
[root@master1 ~]# ip link set rinr up
[root@master1 ~]# ip link set rins up

将rins添加到内部桥:
[root@master1 ~]# brctl addif br-in rins

将rinr添加到r1(网络名称空间,路由器)
[root@master1 ~]# ip link set rinr netns r1

rinr改名激活,配置IP
[root@master1 ~]# ip netns exec r1 ip link set eth0 up
[root@master1 ~]# ip netns exec r1 ifconfig eth0 10.0.1.254/24 up

2.3 虚拟机配置IP,网关指向rinr的IP地址

# ifconfig eth0 10.0.1.1/24 up
# route add default gw 10.0.1.254
因为我做实验的两个网段都是10段,如果不做外网网段的详细路由,会导致走默认直连路由,导致无法联通10.201.106段。现象是路由走到r1(网络名称空间后)走不下去
# route add -net 10.201.106.0/24 gw 10.0.1.254

因为我做实验的两个网段都是10段,如果不做外网网段的详细路由,会导致走默认直连路由,导致无法联通10.201.106段。
# ifconfig eth0 10.0.1.2/24 up
# route add default gw 10.0.1.254
# route add -net 10.201.106.0/24 gw 10.0.1.254

2.4 增加另一对网卡,外网配置

rexr放在路由器,rexs放在外网网桥
[root@master1 ~]# ip link add rexr type veth peer name rexs

将rexs放入外部网桥
[root@master1 ~]# ip link set rexs up
[root@master1 ~]# brctl addif br-ex rexs

将rexr加入路由器(网络名称空间),并配置IP激活
[root@master1 ~]# ip link set rexr netns r1
[root@master1 ~]# ip netns exec r1 ip link set rexr name eth1
[root@master1 ~]# ip netns exec r1 ifconfig eth1 10.201.106.31/24 up

2.5 测试

虚拟机可以ping通10.201.106.31,但是ping不通其他10.201.106段,比如10.201.106.131。因为宿主机不知道虚拟机网段路由,无法回包。

网络名称空间添加nat规则:
[root@master1 ~]# ip netns exec r1 iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! -d 10.0.1.0/24 -j SNAT --to-source 10.201.106.31

3、名称空间配置DHCP服务器

3.1 安装dnsmasq

[root@master1 ~]# yum install dnsmasq

3.2 在名称空间配置DHCP

设置分配地址范围和网关:
[root@master1 ~]# ip netns exec r1 dnsmasq -F 10.0.1.151,10.0.1.160 --dhcp-option=option:router,10.0.1.254



虚拟机测试获取IP:
# udhcpc -R
udhcpc (v1.18.5) started
Sending discover...
Sending select for 10.0.1.159...
Lease of 10.0.1.159 obtained, lease time 3600
deleting routers
route: SIOCDELRT: No such process
adding dns 10.0.1.254