如果企业边界设备是路由器的话,局域网中有一服务器,并通过端口映射将其发布到公网IP上。外网用户可通过该公网IP访问OA服务器,但内网用户无法通过域名访问、和外网地址访问。通过抓包检查后发现在进行第二次握手时,出现了问题,下面举个简单的例子。
内网一台主机192.168.0.2建了个WEB服务站点端口80,然后在网关(其内网地址是192.168.0.1、公网地址为1.1.1.1)上映射80端口到192.168.0.2的80端口,这样INTERNET上就能以http://1.1.1.1:80的地址访问到192.168.0.2的WEB站点了。
然后出现了个问题,在同网吧的另一台电脑192.168.0.3上,键入http://1.1.1.1:80,却无法访问该WEB站点。
工作过程大概是这样:
192.168.0.3要请求访问1.1.1.1的80端口,根据它掌握的路由表,它本身是不知道电脑1.1.1.1在哪里的,所以把将这个数据包发送给它的默认路由,即电脑192.168.0.1。
注意:这个数据包的源地址是192.168.0.3、源端口假设是1025、目标地址是1.1.1.1、目标端口是80、SYN标志位为1、这是建立TCP连接的第一次握手。
如果“把目标地址为1.1.1.1的数据包发给了192.168.0.1”你听起来觉得有点矛盾,其实这个数据包的目标IP地址是1.1.1.1,目标MAC地址却是192.168.0.1的。
192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑192.168.0.2:80去的,于是它把这个数据包转发给了电脑192.168.0.2:80。
注意:这个数据包的源地址是192.168.0.3、源端口是1025、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。我们要注意这个数据包在转发后发生了变化了,即目标地址变了。
电脑192.168.0.2顺利接到了数据包,它马上作出回应,发送一个数据包给电脑192.168.0.3。
注意:这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.3、目标端口为1025、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。
电脑192.168.0.3顺利接到了数据包,然而它发现这是一个来自192.168.0.2:80的回应,因为ACK标志位值为1摆在那里呢。它想不起来什么时候给192.168.0.2:80这个目标对象发送过SYN请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待1.1.1.1:80的回应,一直等到超时。
而电脑192.168.0.2这边,它等192.168.0.3:1025的第三次握手请求包发送过来,以便建立一个TCP的连接。同样也没有结果,一直等到超时。三次握手在规定的时间内没有完成,访问宣布流产了。
解决方法是:
将常规的ip nat inside source static tcp X.X.X.X 80 X.X.X.X 80更改为ip nat source static tcp X.X.X.X 80 X.X.X.X 80
然后把接口下的ip nat inside、outside 修改为 ip nat enable
就可以达到类似ASA上的DNS刮除的特性,并且可以用外部的IP访问。
至于命令的工作原理还在摸索中,在学习过程中有想法就必须马上付出实践,灵感一没,解决方案可能也会随之消失! 感觉挺艺术家的!哈哈哈!
本文出自 “在物理层的小菜鸟” 博客