一、杂项
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