究竟为什么内网不能用外网地址访问内部服务器。通俗详细的解释

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

hi大家好,今天我们来讨论一个很多人都找不到答案得问题:究竟为什么内网不能用公网地址访问内网服务器。不是任何设备都存在此问题,拿cisco的设备来说,不同版本的ios,有的就没有这个问题,而有的版本就有问题,netscreen的防火墙也没有这个问题,关键是开发者有没有意识到这个问题,通过修改ios,完全可以避免。对于这个问题,解决方法是有,比如内网dns欺骗、pix上得alias等等,但是究竟为什么有些设备不支持呢?今天我斗胆发个贴,因为有些结论纯粹靠想,也没有设备进行试验,所以希望大家跟贴讨论,达到抛砖引玉的目的,谢谢了先!


以下所有内容均针对出口是以太网的情况,对于串口接入,不会出现这种问题。


如图,这个图是本贴的初始图,大圈是本地路由器,和他相连的是isp路由器,和isp相连的是internet上随便一个路由器。
[IMG]http://bbs.net130.com/attachment.php?attachmentid=28693[/IMG]
本地出口地址是5。5。5。1,isp对端是5。5。5。2(掩码没写,稍后会分别讨论)。 1。1。1。1和1。1。1。2是内网两台服务器的内网地址,被静态映射到公网上的5。5。5。4和5。5。5。5。 内网的pc全部被pat到出口上。本地路由器一条缺省路由到isp对端。

我想这个拓扑应该是非常普遍的了,我认为就是因为这个非常普遍的拓扑,造成了很多人所反应的“内网不能通过公网地址访问内网服务器”这个问题。我认为这个问题的关键原因就在于掩码,就是在3层上做文章。


第一节

先来看看一般情况下,这个环境的掩码的规划。假设isp分配一段8地址子网给本地,这样isp路由器接口和本地路由器接口共占用2个,网络地址、广播地址共占用2个,可用的一共4个,掩码是248。对于图示的拓扑,假设本地路由器出口掩码是248(内网pc的pat地址相应的也就是掩码为248),被映射的两个地址掩码也是248,这个最普遍的掩码规划,结果是:服务器、内网pc的pat地址、本地出口地址全部处于同一个网段。我们分析一个包的来龙去脉,来看看到底内网pc通过公网地址可否访问到内网服务器。

假设内网一台pc1。1。1。111发出ping 5。5。5。4(服务器的公网地址)请求,包源地址1。1。1。111,目的地址5。5。5。4,路由器收到这个包后,检查路由表,发现5。5。5。4就位于自己的出口网段(假设出口为以太口),所以直接通过arp广播请求5。5。5。4的mac地址,问题出现了,谁会应答这个请求呢?没有人,所以,这种情况下(所有公网地址在同网段)当然不会通。不但内网访问服务器不行,服务器之间通过公网地址访问也不会通。

结论一:只要出口地址和服务器映射的公网地址在同网段,就有问题。

第二节


基于上面的讨论,我们知道了只要出口地址和服务器映射的公网地址在同网段,就会发生“无人应答”的必然结果,所以我们这次改变掩码规划,将出口掩码变长,变为252(isp掩码也要相应改变)。在这里首先声明一个要点,就是nat池的地址可以和出口不在同网段,以前有帖子也讨论过,我自己一开始也迷惑,后来想明白了,只要isp路由器上有这些地址的路由就可以,下一条是本地路由器,这样本地路由器便可以接受到这些包。

我们再次分析一个包的流程。内网pc1。1。1。111发出ping 5。5。5。4请求,包源地址1。1。1。111,目的地址5。5。5。4,路由器收到这个包后,检查路由表,这一次,发现5。5。5。4不在本地的任何接口,所以走了缺省路由,将包发给了isp对端口,并在本地nat表中生成一条项目,记录内网地址1。1。1。111被转换成公网地址5。5。5。1加上端口号(假设端口号是8888),isp接受到的包,目的地址是5。5。5。4,源地址变成了5。5。5。1,它检查它的路由表,发现5。5。5。4路由下一条是5。5。5。1,也就是本地路由器,所以又将此包发给本地路由器,经过了一次往返后,本地收到这个包,首先接受nat引擎的过虑,发现5。5。5。4正在被静态映射到内网的1。1。1。1的主机,所以改变目的地址为1。1。1。1,源地址还是5。5。5。1,这样就交给了路由引擎,查看路由表,1。1。1。1的路由当然有了,通过2层直接发给1。1。1。1,至此,去程的包分析完毕。

我们再分析回程的包。服务器1。1。1。1收到包后,准备回应给5。5。5。1(加端口号),发出reply包,源地址1。1。1。1,目的地址5。5。5。1:8888,本地路由器收到后,先给路由引擎,发现5。5。5。1就是出口地址,问题又来了,包的目的就是出口,而不是经过出口,这时候路由器该怎么办呢?假如是从外向内来的包访问5。5。5。1:8888,这时候会先提交个nat引擎,做nat转换。但是这是从内向外发出的包,要先提交给路由引擎,我认为此时,由于收到的包是从内向外的,目的直接就是针对出口来的,而出口并没有开启什么端口,除非为了web管理,或者telnet管理开启80或23端口,所以路由器会丢弃,因为没有得到应答。

结论二:只要出口地址和内网pc的pat地址同网段,同样会有问题

第三节


我们再变更掩码方案,使得内网pc的pat地址和服务器映射地址同网段,但和出口不同网段。假设内网pc的pat地址为5。5。5。6(和服务器地址同网段)

我们再次分析一个包,内网pc1。1。1。111发出ping 5。5。5。4请求,包源地址1。1。1。111,目的地址5。5。5。4,路由器收到这个包后,检查路由表,发现5。5。5。4不在本地的任何接口,所以走了缺省路由,将包发给了isp对端口,并在本地nat表中生成一条项目,记录内网地址1。1。1。111被转换成公网地址5。5。5。6加上端口号,isp接受到的包,目的地址是5。5。5。4,源地址变成了5。5。5。6,它检查它的路由表,发现5。5。5。4路由下一条是5。5。5。1,也就是本地路由器,所以又将此包发给本地路由器,经过了一次往返后,本地收到这个包,首先接受nat引擎的过虑,发现5。5。5。4正在被静态映射到内网的1。1。1。1的主机,所以改变目的地址为1。1。1。1,源地址还是5。5。5。6,这样就交给了路由引擎,查看路由表,1。1。1。1的路由当然有了,通过2层直接发给1。1。1。1,至此,去程的包分析完毕。

我们再分析回程的包。服务器1。1。1。1收到包后,准备回应给5。5。5。6(加端口号),发出reply包,源地址1。1。1。1,目的地址5。5。5。6,本地路由器收到后,先给路由引擎,发现5。5。5。6不在本地任何端口下,所以走了缺省路由,发给isp,并在nat表中生成一条记录,将1。1。1。1转换为5。5。5。4,isp接受到包源地址变为5。5。5。4,目的地址是5。5。5。6,通过检查路由表,发现5。5。5。6这个地址的路由下一条应该是5。5。5。1,也就是本地路由器,所以包又被发回来了,经过一次往返,本地收到了这个包,首先提交给nat引擎,发现目的地址5。5。5。6在nat表中对应着内网pc1。1。1。111,所以将5。5。5。6替换成1。1。1。111,源地址不变,还是5。5。5。4,然后提交给路由引擎,路由器在2层将包发给1。1。1。111,这时,1。1。1。111这台主机收到了从5。5。5。4返回的包,而他一开始ping请求包,就是发给5。5。5。4这个公网地址
的,所以ping通了!!!!


结论三:内网pc的pat地址和服务器公网地址同网段,同时和出口地址不同网段,这样没有问题。

第四节


本贴的高潮部分已经达到,至此,只剩下一种情况,就是内网pat地址、服务器公网地址、出口地址全部不在同网段。假设出口掩码252,服务器公网地址段掩码248,内网pc的pat地址改为5。5。5。254,这样三种地址都不在同网段。而且isp也必须有服务器公网地址和内网pc的pat地址的路由,下一条是5。5。5。1我们再次分析一个包,内网pc1。1。1。111发出ping 5。5。5。4请求,包源地址1。1。1。111,目的地址5。5。5。4,路由器收到这个包后,检查路由表,发现5。5。5。4不在本地的任何接口,所以走了缺省路由,将包发给了isp对端口,并在本地nat表中生成一条项目,记录内网地址1。1。1。111被转换成公网地址5。5。5。254加上端口号,isp接受到的包,目的地址是5。5。5。4,源地址变成了5。5。5。254,它检查它的路由表,发现5。5。5。4路由下一条是5。5。5。1,也就是本地路由器,所以又将此包发给本地路由器,经过了一次往返后,本地收到这个包,首先接受nat引擎的过虑,发现5。5。5。4正在被静态映射到内网的1。1。1。1的主机,所以改变目的地址为1。1。1。1,源地址还是5。5。5。254,这样就交给了路由引擎,查看路由表,1。1。1。1的路由当然有了,通过2层直接发给1。1。1。1,至此,去程的包分析完毕。

我们再分析回程的包。服务器1。1。1。1收到包后,准备回应给5。5。5。254(加端口号),发出reply包,源地址1。1。1。1,目的地址5。5。5。254,本地路由器收到后,先给路由引擎,发现5。5。5。254不在本地任何端口下,所以走了缺省路由,发给isp,并在nat表中生成一条记录,将1。1。1。1转换为5。5。5。4,isp接受到包源地址变为5。5。5。4,目的地址是5。5。5。254,通过检查路由表,发现5。5。5。254这个地址的路
由下一条应该是5。5。5。1,也就是本地路由器,所以包又被发回来了,经过一次往返,本地收到了这个包,首先提交给nat引擎,发现目的地址5。5。5。254:某个端口,在nat表中对应着内网pc1。1。1。111,所以将5。5。5。254替换成1。1。1。111,源地址不变,还是5。5。5。4,然后提交给路由引擎,路由器在2层将包发给1。1。1。111,这时,1。1。1。111这台主机收到了从5。5。5。4返回的包,而他一开始ping请求包,就是发给5。5。5。4这个公网地址的,所以ping通了!!!!

结论四:三种地址全部不在同网段,没有问题。


综上所述,得到了4个结论:

结论一:只要出口地址和服务器映射的公网地址在同网段,就有问题。
结论二:只要出口地址和内网pc的pat地址同网段,同样会有问题。
结论三:内网pc的pat地址和服务器公网地址同网段,同时和出口地址不同网段,这样没有问题。
结论四:三种地址全部不在同网段,没有问题。

可以简单的发现,前两个是充分条件,只要满足了其中一个,就会出现问题,而现在大多数的接入都符合前两个情况,而几乎没有人“多此一举”的去改变掩码规划,所以造成如此多的普遍现象:内网不能用公网地址访问内网服务器!!!!!

出口地址只要不和其他两种地址同网段,就可以保证不出问题。

至此,已经探讨了问题的原因。此过程中我还得到了一个推论和一个待验证的问题。

推论:如果nat池中的公网地址和出口地址不同网段,不管在内网还是公网ping nat池中未参与转换的公网地址,会出现环路,包在本地和isp之间来回往返。


待验证的问题:
对于第三节和第四节,如果只在本地出口变长掩码,isp端不作任何改变,会怎么样?以第三节的环境来说:我们再次分析一个包,内网pc1。1。1。111发出ping 5。5。5。4请求,包源地址1。1。1。111,目的地址5。5。5。4,路由器收到这个包后,检查路由表,发现5。5。5。4不在本地的任何接口,所以走了缺省路由,将包发给了isp对端口,并在本地nat表中生成一条项目,记录内网地址1。1。1。111被转换成公网地址5。5。5。6加上端口号,isp接受到的包,目的地址是5。5。5。4,源地址变成了5。5。5。6,它检查它的路由表,由于此时isp的接口掩码没有变长,还是248,所以,它发现5。5。5。4路由就在它自己的接口上,所以直接在接口发arp请求5。5。5。4的mac地址,此时,按理说,没人会应答(除非本地开了代理arp),但是有一次偶尔发现在路由器上show arp,会发现有些奇怪的条目,ip地址都是nat池中的地址,mac地址不管ip多少,都是本地出口的mac地址,这样的话,即使arp请求的地址不和出口同段,一样会得到应答,不知道这个对不对。


对这个问题的解决方法,在ios层面,一般是利用修改dns回包中的payload实现的,将dns返回的公网地址,修改成内网地址,这样直接通过内网通信,就不会有问题了。对于直接用公网ip访问的包,会在路由器内部先nat,然后调头,不走出口,直接再回到内网,以支持用公网地址访问。

写了这么多,不知道各位有没有耐心看完,不管怎么样,请大家多发表评论,谢谢!


本文转自游来游去岛博客51CTO博客,原文链接http://blog.51cto.com/ylyqd/1848如需转载请自行联系原作者


wingking84

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
存储 数据挖掘 Windows
服务器数据恢复—V7000存储raid5故障导致LUN无法访问的数据恢复案例
服务器数据恢复环境: 三台V7000存储,共有64块SAS硬盘(其中有三块热备盘,其中一块已启用)组建了数组raid5阵列。分配若干LUN,上层安装Windows server操作系统,数据分区格式化为NTFS文件系统。 服务器故障: V7000存储中有多块硬盘出现故障离线,阵列失效,LUN无法访问。需要恢复卷中所有数据(主要为dcm文件)。
|
2月前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
2月前
|
域名解析 缓存 网络协议
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?
|
2月前
|
网络安全 Docker 容器
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
29 0
|
16天前
|
存储 人工智能 弹性计算
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理。通过合理优化资源分配、利用自动伸缩及高效数据管理,ECS能显著提升AI系统的性能与效率,降低运营成本,助力科研与企业用户在AI领域取得突破。
34 6
|
21天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。
|
26天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。
|
28天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
26天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
175 2
|
1月前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
67 9