Linux网络虚拟化之nat
利用Linux的虚拟化网络设备bridge实现nat网络。
1.环境准备
实现环境为ubuntu-16.04服务器版本,在安装操作系统时,选装了支持虚拟化相关的包,能创建KVM虚拟机,能启动dnsmasq服务。另外手动安装了桌面软件包及管理KVM虚拟机的可视化界面virt-manager。
2.IP地址规划
如下图:
名称 | 网段 | 掩码 | 网关 | DHCP地址 |
test-br-01 |
172.16.0.3~172.16.1.50 | 255.255.255.0 | 172.16.0.1 | 172.16.1.2 |
3.创建内部网络
在Linux网络虚拟化之bridge-实现内部网络有内部网络的整个创建过程,直接使用里面提到的命令创建内部网络。
创建/etc/test-dnsmasq.conf,加入如下内容并保存,其它项不用配置。
interface=test-veth-02 # DNS监听接口
bind-interfaces # 绑定
dhcp-range=172.16.0.2,172.16.0.50,255.255.255.0,12h # 网段
dhcp-leasefile=/var/lib/misc/test-dnsmasq.leases # 管理IP地址数据文件
dhcp-option=option:router,172.16.0.1 # 网关
依次运行如下命令,创建内部网络并启动dnsmasq:
# 创建名称空间test-ns-01
ip netns add test-ns-01
# 创建VETH PAIR
ip link add test-veth-01 type veth peer name test-veth-02
# 将VETH PAIR的一端加入网络命名空间
ip link set test-veth-02 netns test-ns-01
# 在网络命名空间中为VETH设备设备IP
ip netns exec test-ns-01 ip addr add 172.16.0.2/24 dev test-veth-02
# 在网络命名空间中启动设备
ip netns exec test-ns-01 ip link set test-veth-02 up
# 在网络命名空间中启动dnsmasq
ip netns exec test-ns-01 /usr/sbin/dnsmasq --conf-file=/etc/test-dnsmasq.conf
# 创建网桥
brctl addbr test-br-01
# 为网桥增加接口
brctl addif test-br-01 test-veth-01
# 启动设备
ip link set test-br-01 up
ip link set test-veth-01 up
运行完以上命令后,内部网络创建完成,假设现在就创建两台虚拟机test01与test02,并连接到test-br-01这个网络上,则网络连接示意图如下:
图1
上图中,内部网络中的数据不会上交到宿主机的网络栈,主要原因是目前为止test-br-01这个虚拟网络设备还没有设置IP地址,没有IP地址就不能接收IP数据报,只能转发MAC桢。
4.设置网桥地址及iptables转发、nat
首先为test-br-01设置IP地址,如下:
ip addr add 172.16.0.1/24 dev test-br-01
这个时候因为test-br-01设置了172.16.0.1这个IP,那么现在宿主机ubuntu-01已经能直接与test01与test02互通了,相当于是实现了宿主机(Host-Only)网络。
172.16.0.1被dnsmasq设置成了整个内部网络的网关,此时流经test-br-01的外网数据就会上交到宿主机的IP层。
运行如下命令,设置iptables转发、nat:
# 转发规则
iptables -A FORWARD -d 172.16.0.0/24 -o test-br-01 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 172.16.0.0/24 -i test-br-01 -j ACCEPT
iptables -A FORWARD -i test-br-01 -o test-br-01 -j ACCEPT
iptables -A FORWARD -o test-br-01 -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -i test-br-01 -j REJECT --reject-with icmp-port-unreachable
# nat规则
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 224.0.0.0/24 -j RETURN
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 255.255.255.255/32 -j RETURN
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -j MASQUERADE
至此一个nat网络就创建完成了,连接其上的虚拟机可以通过这个网络访问外网,这个时候网络连接示意图变成如下图2所示:
图2
图2中的绿色字体及绿色实线,是在图1的基础上新加的。为虚拟网桥设备test-br-01设置IP地址作为网关,用iptables实现三层转发与nat,一个内部网络就变成nat网络能够连接外网了。需要注意的一点是虽然能够访问外网,但是不能解析域名。原因就是为网络提供DNS服务的dnsmasq被隔离在了test-ns-01网络名称空间中,它无法向上游的DNS服务器请求服务。需要手动为所创建的虚拟机修改/etc/resolv.conf文件,加入一个可用的DNS服务器如8.8.8.8就可以解析域名了。