关于两台处于防火墙内部的客户机的通讯问题  情景:有两台计算机Client1和Client2,分别
位于防火墙NAT1和NAT2内部。
  要求:Client1和Client2能够通讯。
  基本办法:增加一台服务器SERVER,服务器位置位于
NAT1和NAT2外部且Client1和Client2都能过访问,
Client1和Client2之间的通讯通过SERVER转发。这么做
的缺点是每次Client1和Client2的通讯都必须通过SERVER,
如果该SERVER承担很多这样的客户端的信息中转工作,负荷
将越来越重。
  
   希望的实现办法:
   1、因为Client1和Client2分别位于NAT1和NAT2后面,
      所以彼此不能看到对方,所以SERVER是必须的。
   2、Client1和Client2首先和SERVER通讯,通过SERVER找到
      对方。从SERVER端取得对方的一些连接信息。
   3、Client1和Client2之间的数据交换在二者之间进行,不
      再需要通过SERVER转发。
   4、退出步骤:Client1和Client2分别通知SERVER,注销自己
      的在线信息。
现在我也不知道“希望的实现办法”有没有可能实现,如能,怎么实现?

解决方案 »

  1.   

    我的建议如下:
    1采用udp传输发送数据到server,那么你的server就知道nat给client分配的什么端口
    2server将两个client通过nat的端口告诉对方
    3这样两个client就可以互通了
    4在udp协议上构架自己的可靠性传输协议比如:Client1的5555端口发送数据client1_IP:5555,通过nat1变成了那NAT1_IP:13456(server知道)
    Client2的4444端口发送数据client2_IP:10022,通过nat2变成了那NAT2_IP:10022(server知道)
    然后server通知client1:client2的地址为NAT2_IP:10022
    server通知client2:client1的地址为NAT1_IP:13456
    ok了!!!哈哈哈
      

  2.   

    如果nat可以控制,那就不用我说了:)
      

  3.   

    chenjiming:
      谢谢,你的方法听起来可以,不知道实际运作如何?待我试一试。
      还有,自己重新在udp协议上构架自己的可靠性传输协议。这看来
    比较麻烦。
      

  4.   

    似乎不可以,例如NAT地址池只有2个IP,有三个客户端要通讯,那么其中一个客户端的端口也要映射,而且只是相对于那个服务器的映射,也就是这个映射随着目标机变化而变化。
      

  5.   

    还有一点要说明的,就是端口虽然是不断变化的,但是他有一个时间,时间长短看nat设置。应用程序需要不断的协调,所以这的确需要构造一个复杂的协议,命中注定!!!!
      

  6.   

    一般來說﹐ 在LAN中公用一個public ip address﹐ 所以只有一個local ip address 不足以通訊。 有兩種方法實現 你所需的通訊。1。 ip 加 端口。
    正如 chenjiming(还不够聪明) 所說。2。 用兩對ip. physical ip addres 和 logical ip address(MAC).
    原理如下﹕ 每一個LAN下有一個固定的logical ip address. 每一個LAN與另一個LAN相連﹐需要一個設備。(switch, bridge, or router. 通常是router.) 這個設備有一個physical ip address. 而這個設備“擁有”LAN 的 physical ip address列表。 這樣通訊得以實現。
    (details to see "Computer Networks" and "Data Communication" and "tcp/ip protocol".)所以你可以作一個軟件﹐模擬router的功能(一個frame/packet的捕捉器﹐ 小數據庫)。