对于IPSec VPN的网关对网关的实现,通常实现为两个内部子网之间的VPN通道,如两个VPN网关地址分别是1.1.1.1和2.2.2.2,内部子网分别是10.1.1.0/24和10.2.2.0/24,这样形成的VPN通道结构为:
intranet1 gw1 gw2 intranet2 10.1.1.0/24 <---> 1.1.1.1 <=====> 2.2.2.2 <---> 10.2.2.0/24
其中“-”表示正常通信数据,“=”表示是加密数据。 这样,对于10.1.1.0/24网段内的机器,可以直接访问10.2.2.0/24网段的机器,数据包在到达网关1.1.1.1时,网关对数据进行封装加密,然后发送到网关2.2.2.2,网关2解密解封装后将数据发送给内网2中的机器,这样就是一个普通的IPSecVPN基本通信过程。
现在的问题是,如果两个子网是事先建成的,而且都使用了相同的内部地址,结构如下图:
intranet1 gw1 gw2 intranet2 10.1.1.0/24 <---> 1.1.1.1 <==?==> 2.2.2.2 <---> 10.1.1.0/24
如果两边都是不可能修改内部地址的,这种情况下如何使两个子网之间进行VPN通信呢?再按原来处理方式肯定是不行了,因为对于内网1,如果再直接访问内网2的IP地址
的话,会认为是在访问本地内部网络地址而根本不会走网关1。
2. 解决原理
为解决这个问题,我使用的方案称为虚拟子网技术,是将两边子网分别映射到两个虚拟子网上,一端子网访问对方是访问对方的虚拟子网地址而不是实际地址,VPN通道不是在实际子网地址建建立,而是在虚拟子网间建立,如下图: intranet1 gw1 gw2 intranet2 10.1.1.0/24 <--> (192.168.1.0/24)1.1.1.1 <=== ===> 2.2.2.2 (192.168.2.0/24)<--> 10.1.1.0/24
如图所示,网关1将子网10.1.1.0/24地址一一映射到192.168.1.0/24,网关2将子网10.2.2.0/2地址一一映射到192.168.2.0/24,VPN通道在192.168.1.0/24和192.168.2.0/24之间建立,子网1访问子网2是通过访问子网2的虚拟地址192.168.2.0/24来实现,下面具体描述数据包的处理过程:
假如子网1中的10.1.1.1要访问对方子网2中的10.1.1.1,子网1发出的访问数据源、目的地址对为(10.1.1.1, 192.168.2.1),由于192.168.2.1地址不是本地地址,数据包会发送到网关1,在网关1,发现该包目
的地址是要走VPN通道,将数据包源地址修改为192.168.1.1后进入VPN通道,在VPN通道中的封装的数据包地址为(192.168.1.1, 192.168.2.1),数据到达网关2后,解密解封装,网关2看到数据包目的地址是192.168.2.1,将其目的地址修改为10.1.1.1后发出,这样数据包在子网2中的地址对为(192.168.1.1,
10.1.1.1),这样数据包就可以正确到达子网2中的目的机;同理,对于子网2返回子网1的数据包也可以用相同方法分析数据转换过程。
由此可见,虚拟子网技术是一种特殊的NAT技术,在数据进VPN通道前和出VPN通道后对数据进行预处理,本质上和VPN功能无关。 4. 功能实现
该功能可在Linux/netfilter架构基础上实现,实际改动代码量很小,基本不到50行代码修改量即可完成该功能。 5. 结论
同网段VPN是一种特殊的VPN通信模式,需要进行特殊处理才能解决,我提出的虚拟子网技术可以很好地解决此类问题,该技术本质是一种特殊的NAT预处理过程,和VPN处理无关。
先把配置写一下,
Router A
interface Serial0/0 description to Internet
ip address 1.1.1.1 255.255.0.0 ip nat outside
interface Ethernet0/0
ip address 192.168.1.1 255.255.255.0 no ip directed-broadcast ip nat inside
ip nat inside source static network 192.168.1.0 172.10.0.0 /16 (映射到中介IP地址)
ip route 0.0.0.0 0.0.0.0 Serial0/0
access-list 100 permit ip 172.10.0.0 0.0.255.255 172.20.0.0 0.0.255.255 ! ! end
Router B
interface FastEthernet0/0
ip address 192.168.1.1 255.255.255.0 ip nat inside !
interface Serial0/0 description to Internet
ip address 2.2.2.2 255.255.0.0 ip nat outside
ip nat inside source static network 192.168.1.0 172.20.0.0 /16 ip route 0.0.0.0 0.0.0.0 Serial0/0
access-list 100 permit ip 172.20.0.0 0.0.255.255 172.10.0.0 0.0.255.255 ! end
因篇幅问题不能全部显示,请点此查看更多更全内容