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就可以解析域名了。

猜你喜欢

转载自blog.csdn.net/dkfajsldfsdfsd/article/details/79485592