虚拟隔离网络外网访问(SNAT)

来源:互联网 发布:中国少儿编程 logo 编辑:程序博客网 时间:2024/05/21 06:13

首先介绍下iptables

百度百科:iptables介绍
我们熟悉的防火墙过滤数据包规则只是iptables的一个子功能。

iptables能完成的功能有:

1:过滤规则前的NAT转换
2:过滤数据包
3:过滤后的NAT转换

这节我们主要讲解的是,第三条:过滤后的额NAT规则转换

  • 其中的过滤数据包规则是私有网络的ACL规则部分,将在之后讲解机房网络的时候做讲解。

NAT转换分为SNAT转换和DNAT转换。作用原理分别是把所有的包的源IP换为某个IP或者将所有包的目标地址换为某个IP。

目前我们生产环境中的构架图如下图所示:

这里写图片描述

解释:

  • br-int就是我们上节所叙述的用户的虚拟网路的网关,也可以说说是用户的路由器。
  • 我们为为每一个用户创建一个netns用来转换虚拟网络的外网数据。如上图的两个租户的虚拟网络的地址空间均是10.1.0.0/24,域名空间的网关地址均为10.1.0.1地址,我们在对其网络包进行过滤之后对其分别进行SNAT,其中用户A的私有网络空间数据包被SNAT转换为169.254.4.24,B的被转换为169.254.4.25
  • 被转换后的数据包经由br-ex传输物理机空间之后经过第二次的SNAT转换,然后选择合适的路由转换。

公网数据回来的路径也需要经过这条路线。

测试我们再次仍然用一个虚拟的netns代替vm进行测试。

搭建测试环境

我们仍然使用脚本来进行初始化

#!/bin/bash -x# create two switch br-int and br-exovs-vsctl add-br br-int -- add-br br-exovs-vsctl add-port br-int l3_s1_a -- set port l3_s1_a tag=2 -- set interface l3_s1_a type=internalovs-vsctl add-port br-int l3_s1_b -- set port l3_s1_b tag=1 -- set interface l3_s1_b type=internalovs-vsctl add-port br-ex ex_a -- set interface ex_a type=internalovs-vsctl add-port br-ex ex_b -- set interface ex_b type=internalip netns add l3_aip netns add l3_b# 在一个netns里面添加两个网卡,一个是虚拟网络的网关,一个是出口网关ip link set ex_a netns l3_aip link set l3_s1_a netns l3_aip netns exec l3_a ifconfig ex_a upip netns exec l3_a ifconfig lo upip netns exec l3_a ifconfig l3_s1_a upip netns exec l3_a ip a a 10.1.0.1/24 dev l3_s1_aip netns exec l3_a ip a a 169.254.4.24/24 dev ex_a# 添加默认路由,对于不认识的路由都默认都网关出去,此处可以用来进行acl规则限制,后面讲述ip netns exec l3_a ip r a default via 169.254.4.1 dev ex_aip netns exec l3_a sysctl -w net.ipv4.ip_forward=1 # 打开IP转发# 添加SNAT规则,每个虚拟网络的SNAT不一样。ip netns exec l3_a iptables -t nat -A POSTROUTING ! -d 10.1.0.1/24 -j SNAT --to-source 169.254.4.24#  与上面重复,在此不再详细叙述ip link set ex_b netns l3_bip link set l3_s1_b netns l3_bip netns exec l3_b ifconfig ex_b upip netns exec l3_a ifconfig lo upip netns exec l3_b ifconfig l3_s1_b upip netns exec l3_b ip a a 10.1.0.1/24 dev l3_s1_bip netns exec l3_b ip a a 169.254.4.25/24 dev ex_bip netns exec l3_b ip r a default via 169.254.4.1 dev ex_bip netns exec l3_b sysctl -w net.ipv4.ip_forward=1ip netns exec l3_b iptables -t nat -A POSTROUTING ! -d 10.1.0.1/24 -j SNAT --to-source 169.254.4.25# 添加一个本地端口,加上出口的虚拟ip,169.254.4.1ovs-vsctl add-port br-ex p_ex -- set interface p_ex type=internalifconfig p_ex upip a a 169.254.4.1/24 dev p_ex# 添加本地的ip转发,和SANT规则,此处IP我们让系统默认为我们选择。sysctl -w net.ipv4.ip_forward=1iptables -t nat -A POSTROUTING -s 169.254.4.0/24  -j MASQUERADE# create test vm  这段就不解释了ovs-vsctl add-port br-int vm_s1_a1 -- set port vm_s1_a1 tag=2 -- set interface vm_s1_a1 type=internalip netns add vm_s1_a1ip link set vm_s1_a1 netns vm_s1_a1ip netns exec vm_s1_a1 ifconfig vm_s1_a1 upip netns exec vm_s1_a1 ip a a 10.1.0.11/24 dev vm_s1_a1ip netns exec vm_s1_a1 ip r a default via 10.1.0.1 dev vm_s1_a1

接下来我们来做测试:

root@linux /home/abaobo/tmp 2015-08-28 18:36:00 # ip netns exec l3_a ping 10.240.153.143PING 10.240.153.143 (10.240.153.143) 56(84) bytes of data.64 bytes from 10.240.153.143: icmp_seq=1 ttl=64 time=0.566 ms^C--- 10.240.153.143 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.566/0.566/0.566/0.000 msroot@linux /home/abaobo/tmp 2015-08-28 18:36:06 # ip netns exec l3_a ping 8.8.8.8       PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=2 ttl=38 time=116 ms64 bytes from 8.8.8.8: icmp_seq=3 ttl=38 time=115 ms^C--- 8.8.8.8 ping statistics ---3 packets transmitted, 2 received, 33% packet loss, time 2009msrtt min/avg/max/mdev = 115.726/115.909/116.092/0.183 msroot@linux /home/abaobo/tmp 2015-08-28 18:36:15 

从测试结果来看我们已经完成了我们需要的功能

总结

前面的这几节我们已经讲述了除了acl规则控制之外的虚拟私有网络的所有功能,

这里面包括:

  • 1,本地的2层网络。
  • 2,跨物理节点的2层网络。
  • 3,虚拟网络的DHCP服务(静态分配策略)。
  • 4,私有网络的接入服务,vpn。
  • 5,私有网络的外出口,SNAT。

在下面一节我们将讲述分析openstak中的那张非常复杂的网络图。
虚拟网络的ACL规则部分的实现就是L3中做的iptables过滤规则,基本内容也就是iptables的添加,将不再讲述。

关于机房网络(网易云计算特色)我们也将在后面单独讲述。

其实这些只是基本的功能,在实际的生产环境中我们要做到的所有服务的高可用,应该怎么做到高可用呢,敬请期待。

0 0
原创粉丝点击