为什么IPsec两端内网的网段能不能重复?分明可以实现!

上一个IPsec实验,我们测试了两端不同子网的隧道打通,那能不能打通两端相同的子网呢?

原则上是不行的,因为不同站点的网段在设计时就要求不能冲突,这样会影响报文的正常转发。当分支数量大于2个时,也会导致不同隧道的保护流量源目地址段重复,进而导致数据转发异常。

但是,大二层网络技术都已经实现了,为什么IPsec不能用呢?我们来一步一步地分析一下具体原因和解决办法。

组网需求和组网图

和上个实验相同。在RT1和RT2之间建立一条IPsec隧道,对PCA(192.168.1.101/24)与PCB(192.168.1.102/24)互访的数据流进行安全保护。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

发现问题并解决问题

问题1

正常来讲,PCA和PCB在同一网段但是不在同一网络应该是不能通信的。举个例子,PCA(192.168.1.101)请求PCB(192.168.1.102)时,会发现在同一个广播域内,那么他就会直接发送ARP广播请求。当网关设备RT1收到ARP解析请求时,因为本身没有对应的ARP表项,也就不会响应该请求流量。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

最终导致的结果就是,这一请求流量最终终结在了PCA的LAN侧。

解决方案

解决该问题就是要让请求流量上到网关设备上,常用的解决方案就是代理ARP。

如果ARP请求是从一个网络的主机发往同一网段却不在同一物理网络上的另一台主机,那么连接它们的具有代理ARP功能的设备就可以回答该请求,这个过程称作代理ARP(Proxy ARP)。

代理ARP功能屏蔽了分离的物理网络这一事实,使用户使用起来,好像在同一个物理网络上。

代理ARP分为普通代理ARP和本地代理ARP,二者的应用场景有所区别:

普通代理ARP的应用场景为:想要互通的主机分别连接到设备的不同三层接口上,且这些主机不在同一个广播域中。

本地代理ARP的应用场景为:想要互通的主机连接到设备的同一个三层接口上,且这些主机不在同一个广播域中。

所以我们此处要用的就是普通代理ARP,开启方法很简单,就是在接口下配置如下命令:

proxy-arp enable

问题2

解决了问题1,流量就可以上送到网关设备了,这个时候RT1会进行查表,不过查表的时候会发现192.168.1.0/24这个网段是直连路由,还会丢回到上来的接口。

解决方案

这个问题也很简单,大家都知道路由查表的最长匹配原则,只要有掩码长度更短的明细路由就可以了。如果用到这种场景,一般还是要规划一下,毕竟地址冲突就不好了。这个环境中我们将PCA地址配置为192.168.1.101/24,网关为192.168.1.1/24;PCB地址配置为192.168.1.102/24,网关配置为192.168.1.2/24。这样的话,我们把明细路由配置完整即可。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

问题3

问题3其实也不是问题,就是前两个问题解决之后的正常配置调整,就是把保护的数据流量和NAT排除的地址段进行调整即可。

验证配置

此时两台主机就已经通了。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

查看ARP信息,发现192.168.1.102的MAC地址和网关的MAC地址相同。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

抓包看一下,没有问题。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

问题4

两端的网关地址能不能设置成相同的IP地址192.168.1.1呢?

答案是可以。但是有一个问题,就是你没有办法判断你到对端的网关是否能通了。像下面这样,ping测网关只能是自己当前的网关,有TTL值为证。

PCA测试网关。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

PCB测试网关。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

而如果两端网关不同,就能看到效果了。

从PCA发起测试。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

从PCB发起测试。

为什么IPsec两端内网的网段能不能重复?分明可以实现!

 

设备配置

RT1

#

interface GigabitEthernet0/0

ip address 192.168.1.1 255.255.255.0

 proxy-arp enable

#

interface GigabitEthernet0/1

ip address 12.1.1.1 255.255.255.0

 nat outbound 3403

 ipsec apply policy ipsec

#

 ip route-static 23.1.1.0 24 12.1.1.2

 ip route-static 192.168.1.2 32 12.1.1.2

 ip route-static 192.168.1.102 32 12.1.1.2

#

acl advanced 3402

 rule 0 permit ip source 192.168.1.0 0.0.0.255 destination 192.168.1.0 0.0.0.255

#

acl advanced 3403

 rule 0 deny ip source 192.168.1.0 0.0.0.255 destination 192.168.1.0 0.0.0.255

 rule 5 permit ip

#

ipsec transform-set tran1

 esp encryption-algorithm aes-cbc-128

 esp authentication-algorithm sha1

#

ipsec policy ipsec 10 manual

 transform-set tran1

 security acl 3402

 remote-address 23.1.1.3

 sa spi inbound esp 123456

sa string-key inbound esp simple qwer

 sa spi outbound esp 654321

 sa string-key outbound esp  simple asdf

RT2

#

interface GigabitEthernet0/0

ip address 192.168.1.2 255.255.255.0

 proxy-arp enable

#

interface GigabitEthernet0/1

ip address 23.1.1.3 255.255.255.0

 nat outbound 3403

 ipsec apply policy ipsec

#

 ip route-static 12.1.1.0 24 23.1.1.2

ip route-static 192.168.1.1 32 23.1.1.2

 ip route-static 192.168.1.101 32 23.1.1.2

#

acl advanced 3402

 rule 0 permit ip source 192.168.1.0 0.0.0.255 destination 192.168.1.0 0.0.0.255

#

acl advanced 3403

 rule 0 deny ip source 192.168.1.0 0.0.0.255 destination 192.168.1.0 0.0.0.255

 rule 5 permit ip

#

ipsec transform-set tran1

 esp encryption-algorithm aes-cbc-128

 esp authentication-algorithm sha1

#

ipsec policy ipsec 10 manual

 transform-set tran1

 security acl 3402

 remote-address 12.1.1.1

sa spi inbound esp 654321

 sa string-key inbound esp simple asdf

 sa spi outbound esp 123456

 sa string-key outbound esp simple qwer

RT-ISP

#

interface GigabitEthernet0/0

ip address 12.1.1.2 255.255.255.0

#

interface GigabitEthernet0/1

ip address 23.1.1.2 255.255.255.0

总结

其实我测试的顺序是问题4-3-2-1。先修改了两端的IP地址,再调整了配置,再增加了路由,这个时候在网关上带源地址ping,两端的网关已经能通了。最后发现没有流量上到网关,才开启的网关ARP普通代理。

1、二层流量可以通过网关的ARP代理,将流量引入到网关设备。

2、改变流量转发路径可以通过添加明细路由的方式解决,当然,这个也可以作为一个网络攻击手法,之前我也遇到过这种问题,此处就不展开了。

3、可以发现,两个区域网段相同的场景比正常场景要求的规划更多,配置更复杂,不太推荐使用啊。

上一篇:# esp32使用esp-idf驱动SSD1351(中景园OLED)(一、驱动移植)


下一篇:ESP32-IDF开发实例-网络编程-HTTP表单提交(POST请求)