测试网站 我们一直在努力
当前位置:首页 > 随笔杂记 >

不在内网自建DNS怎样让内网主机通过公网IP访问内部服务器

日期: 来源:收集编辑:
后台-插件-广告管理-首页/栏目/内容广告位一(PC)
后台-插件-广告管理-首页/栏目/内容广告位一(手机)

问题:   公司有一台web服务器,内网IP为192.168.3.5,路由器的内网接口为:192.168.3.1,外网接口为211.140.120.1,已经把外网80端口映射到内网的192.168.3.5的web服务器上,外网通过域名找到211.140.120.1 IP地址能够访问内网web服务器,但是内网的其他192.168.3.段的电脑通过百度域名找到 211.140.120.1 IP地址不能访问这台web服务器。请问应当在路由器上怎么设置才能让内网电脑通过211.140.120.1外网地址来访问web服务器?(除了在内网设一台dns,让公司域名指向内网192.168.3.5。但我不想用这种方法。) 

 

思路:

  在H3C文档上有 该需求为典型的C-S模式的NAT hairpin应用。

 

下面贴下博主ustcgy文章的相关段落

   5.3.2 处于相同NAT之后的客户端通信

我们假设 Client A和Client B都拥有自己的私有IP地址,并且都处在相同的NAT之后,端对端的程序运行于 CLIENT A,CLIENT B,S之间,

CLIENT A和CLIENT B分别与S建立通信会话,经过NAT转换后,A的公网端口被映射为62000,B的公网端口映射为62001.如下图所示:

 

                               Server S

                            18.181.0.31:1234

                                   |

                                   |

                                  NAT

                         A-S 155.99.25.11:62000

                         B-S 155.99.25.11:62001

                                   |

            +----------------------+----------------------+

            |                                                           |

         Client A                                              Client B

      10.0.0.1:1234                                 10.1.1.3:1234

      

根据前面介绍的"打洞"技术,CLIENT A将发送一个UDP信息到CLIENT B的公网地址上,数据包源端为(10.0.0.1:124),目的端为(155.99.25.11:62001).该数据包能否被B收到,取决于当前的NAT是否支持"发夹"转换(hairpin转换,也就是同一台设备不同端口之间的UDP数据包能否到达).

首先,支持"发夹"转换的NAT设备还远没有支持"打洞"技术的NAT设备多,其次,即使NAT设备支持"发夹"转换,在这种情况下也应该通过网内端到端实现,而不是将数据包无谓 地经过NAT设备,这是一种对资源的浪费.

 

5.3.3 一般"打洞"过程

综合上面介绍的客户端处于不同NAT之后和处于同一NAT之后,我们说下一般的"打洞"过程.

1. 打洞技术假定客户端A和B可以与公网内的已知的集中服务器建立UDP连接(可以互发UDP数据包).当一个客户端在S上登陆的时候,服务器记录下该客户端的两个endpoints(IP地址,UDP端口),一个是该客户端确信自己是通过该ip和端口与服务器S进行通信的,另一个是服务器S记录下的由服务器"观察"到的该客户端实际与自己通信所使用的ip和端口.我们可以把前一个endpoint看作是客户端的内网ip和端口,把后一个endpoint看作是客户端的内网ip和端口经过NAT转换后的公网ip和端口.服务器可以从客户端的登陆消息的消息体中得到该客户端的内网endpoint相关信息,可以通过对登陆消息的IP或UDP头得到该客户端的公网endpoint.

2.假设Client A想向B发起连接,于是A向服务器S发送消息,请求S帮助建立与B的UDP连接.这时,S将B的公网和内网的endpoint发给A.可知,A与B通过与S的一次通信就可以知道对方的公网和内网的endpoint.     

3.Client A通过B的内网endpoint发送UDP数据包.针对5.3.2节问题的解决方案.如果B和A在同一NAT后,则很快收到响应.如果B和A不在同一NAT后,则超时.

4.Client A通过B的外网endpoint发送UDP数据包.

回到5.3.1节介绍的具体方法.CLIENT A发出UDP包(10.0.0.1:1234,138.76.29.7:31000),经NAT A转换为(155.99.25.11:62000,138.76.29.7:31000),经NAT B转换为(155.99.25.11:62000,10.1.1.3:1234).如果在此数据包到达NAT B前,B发送过UDP包到A的公网endpoint,则NAT B允许此包到达B机.在5.3.2节下,A发出UDP包(10.0.0.1:1234,155.99.25.11:62001),NAT 先转换为(155.99.25.11:62000,155.99.25.11:62001),再转换为(155.99.25.11:62000,10.1.1.3:1234).

5.步骤3,4发送的数据包是为了"打洞",打洞成功后,就进入真正的P2P传输了.

还有一种情况,B和A不在同一NAT后,C和A在同一NAT后,且B和C的内网endpoint一致,这个时候A从S拿到的目的端应该有2个.所以针对3,4步骤取先有回应的目的端不可取,应该先做步骤3,有回应直接到步骤5,没有回应到步骤4.

 

5.3.4 客户端分别处于多层NAT之后

在有些网络拓扑中就存在多层NAT设备,让我们来看看下图这种情况:

假如 NAT X 是由 Internet服务供应商(ISP)配置的一个大型NAT,它使用少量的公网IP地址来为一些客户群提供服务,NAT A和NAT B则是

为ISP的两个客户群所配置的小一点的独立NAT网关,它们为各自客户群的私人家庭网络提供IP地址.只有Server S和NAT X拥有公网固定IP地址,而NAT A 和 NAT B所拥有的"公网"IP地址对于ISP的寻址域来说则实际上"私有"的.

 

                                Server S

                            18.181.0.31:1234

                                   |

                                   |

                                 NAT X

                         A-S 155.99.25.11:62000

                         B-S 155.99.25.11:62001

                                   |

                                   |

            +----------------------+----------------------+

            |                                                           |

          NAT A                                                 NAT B

    192.168.1.1:30000                             192.168.1.2:31000

            |                                                           |

            |                                                           |

         Client A                                              Client B

      10.0.0.1:1234                                 10.1.1.3:1234

现在让我们假设Client A和Client B想要建立一条端对端 的UDP直连.Client A和 Client B只知道Server S记录的他们真正的公网地址

155.99.25.11:62000和155.99.25.11:62001,而且他们只能通过这个公网地址建立连接,即NAT X必须得支持"loopback translation"(也称hairpin转换)才行.

 

Client A和 Client B也知道对方内网地址10.0.0.1:1234和10.1.1.3:1234,毫无疑问,通过内网地址是建立不了连接的.Client A和 Client B并不知道对方NAT B和NAT A的地址192.168.1.2:31000和192.168.1.1:30000,即便假设我们通过某种途径得知了这些地址,还是不能够保证这样就能进行通话了,因为这些地址是由ISP的私有寻址域分配的,可能会与私有域所分配的其他无关客户端地址相冲突.

 

   参考资料:http://blog.csdn.net/ustcgy/article/details/5655050

后台-插件-广告管理-首页/栏目/内容广告位二(PC)
后台-插件-广告管理-首页/栏目/内容广告位二(手机)
后台-插件-广告管理-内容广告位三(PC)
后台-插件-广告管理-内容广告位三(手机)

相关阅读

后台-插件-广告管理-内容广告位四(PC)
后台-插件-广告管理-内容广告位四(手机)

热门文章

后台-插件-广告管理-侧边广告位一(PC)
后台-插件-广告管理-侧边广告位一(手机)
  • 分享一点个人的网站备案经验

  • 您是否怕收到管局的备案退回通知?尊敬的用户XXX您的备案信息经XX通信管理局审核,不能完全符合要求现已被退回,详情请咨询您的接入服务提供商?或者尊敬的用户XXX您的备案X备XXXX
后台-插件-广告管理-侧边广告位二(PC)
后台-插件-广告管理-侧边广告位二(手机)

最新文章

  • 分享一点个人的网站备案经验

  • 您是否怕收到管局的备案退回通知?尊敬的用户XXX您的备案信息经XX通信管理局审核,不能完全符合要求现已被退回,详情请咨询您的接入服务提供商?或者尊敬的用户XXX您的备案X备XXXX
后台-插件-广告管理-侧边广告位三(PC)
后台-插件-广告管理-侧边广告位三(手机)