比如说,我的机器在内网中,IP是:192.168.0.11,网关是:192.168.0.1 ,目标IP是211.90.83.66,能不能写出程序让211.90.83.66与192.168.0.11通讯?
我知道内网机器可以直接通过WINSOCK连接到外网机器,但不知外网机器如何穿越网关连接内网机器~

解决方案 »

  1.   

    可以利用端口反弹技术的吧?
    或者,在GATEWAY上配置端口映向。
    直接访问是不可能的。不是VB的问题,是OSI安全标准。
      

  2.   

    使用TCP方式除了有第三方否则不可能。
    用UDP方式,有可能。因为是无状态连接。UDP通过网关出去的时候会在网关上留下一个资源,
    当有程序向这个资源写数据时都会传到内部的机器中去。所以第一步,你要让内部的机子先出去让网关建一个对应的资源,然后,想办法得到这个资源,就可以通讯。思路是这样的,但我没有试验过,不知道可不可以。
      

  3.   

    最终双方传输文件不可能用UDP方式吧?还是会用到TCP协议吧?
      

  4.   

    那是UDP不是可靠的连接,传文件是不行的,要用TCP,我想除了端口映射,代理,不知道还有什么。学习中.....
      

  5.   

    N多N多N多的人问过这个问题了,外网访问内网就是这张图啦
    http://bbs.xatv2.com/uploadImages/2003103113572536612.jpg又是传说中的端口映射,N多N多人都说过,可是又谁实现过?我连源代码都下了,可是根本就映射不起来!!!!
    非常非常关注!!!!
      

  6.   

    谁有源码实现第三方转发的?上次,有位同志卖浩方平台实现第三方转发的源码卖4、5000块钱呢!!!其实也不想像浩方那么麻烦,还要抓进程ID什么的我只想知道QQ是怎么实现第三方转发的?服务器怎么把数据发到局域网里的客户端?如果全部靠客户端读服务器端数据库的话,倒是可能,但是太吃力了吧有源码的话,不说4、5000块钱4、500分我想还是有人愿意出的
      

  7.   

    20NT系列VB源代码光盘中有2个源码:
    示例如何将内部网UDP端口映射到公共网上
    示例如何将内部网TCP端口映射到公共网上或许这应该能实现我的功能,不过找不到下载的地址....
      

  8.   

    新版QQ传输文件都是采用UDP协议,不知TENCENT是怎么做到的?
    UDP协议本身是不安全的连接,如何确保包不被丢失?或包顺序不被打乱?VB里能在IP包内标记么?如果可以的话就可以保证顺序了,但怎么保证包不丢失?重传?外网与NAT内的机子通讯可以借助第三方服务器获取网关内机子在网关上对应的IP与PORT进行UDP通讯,问题是怎么保证UDP传输可靠性呢?
      

  9.   

    见http://expert.csdn.net/Expert/topic/2414/2414371.xml?temp=.9598352
    休息一下,不明白再说
      

  10.   

    代码不难,但是步骤在那里摆着(难度不大,但只要接触到网络,都很麻烦)
    真正想完美的发送文本,技术难度不大,但是要自己在做一个协议
    要想附带文件传送功能要做一个完美的基于TCP/IP以上的的协议(例如MSN)
      

  11.   

    UDP本身是无顺序不可靠的,但是你可以在通过UDP发送的数据中加一个数据头,来做顺序标记和检验数据包啊~。
      

  12.   

    不知道对你有没有帮助:
    利用网络防火墙可以将组织内部的网络结构从外部网络如INTERNET中有效地隔离,这种方法
    在许多网络系统中正变得流行起来。这种防火墙系统通常以应用层网关的形式工作在两个网络之间,提供TELNET、FTP、SMTP等的接入。随着越来越多的使全球信息查找更容易的复杂的应用层协议的出现,有必要提供一个通用框架来使这些协议安全透明地穿过防火墙。而且在实际应用中还需要一种安全的认证方式用以穿越防火墙。这个要求起源于两个组织的网络中客户/服务器关系的出现,这个关系需要得到控制并要求有安全的认证。
    在这儿所描述的协议框架是为了让使用TCP和UDP的客户/服务器应用程序更方便安全地使用
    网络防火墙所提供的服务所设计的。这个协议从概念上来讲是介于应用层和传输层之间的“中介层(shim-layer)”,因而不提供如传递ICMP信息之类由网络层网关的所提供的服务。
    2.现有的协议
    当前存在一个协议SOCKS 4,它为TELNET、FTP、HTTP、WAIS和GOPHER等基于TCP协议的客
    户/服务器程序提供了一个不安全的防火墙。而这个新的协议扩展了SOCKS V4,以使其支持UDP、框架规定的安全认证方案、地址解析方案(addressing scheme)中所规定的域名和IPV6。为了实现这个SOCKS协议,通常需要重新编译或者重新链接基于TCP的客户端应用程序以使用SOCKS库中相应的加密函数。
    注意:
    除非特别注明,所有出现在数据包格式图中的十进制数字均以字节表示相应域的长度。如
    果某域需要给定一个字节的值,用X'hh'来表示这个字节中的值。如果某域中用到单词'Variable',这表示该域的长度是可变的,且该长度定义在一个和这个域相关联(1 – 2
    个字节)的域中,或一个数据类型域中。
    3.基于TCP协议的客户
    当一个基于TCP协议的客户端希望与一个只能通过防火墙可以到达的目标(这是由实现所决定
    的)建立连接,它必须先建立一个与SOCKS服务器上SOCKS端口的TCP连接。通常这个TCP端口是
    1080。当连接建立后,客户端进入协议的“握手(negotiation)”过程:认证方式的选择,根据选中的方式进行认证,然后发送转发的要求。SOCKS服务器检查这个要求,根据结果,或建立合适的连接,或拒绝。除非特别注明,所有出现在数据包格式图中的十进制数字均以字节表示相应域的长度。如果某域需要给定一个字节的值,用X'hh'来表示这个字节中的值。如果某域中用到单词'Variable',这表示该域的长度是可变的,且该长度定义在一个和这个域相关联(1 – 2个字节)的域中,或一个数据类型域中。客户端连到服务器后,然后就发送请求来商版本和认证方法:
    VER
    NMETHODS
    METHODS
    1
    1
    1 to 255
    这个版本的SOCKS协议中,VER字段被设置成X'05'。NMETHODS字段包含了在METHODS字段中
    出现的方法标示的数目(以字节为单位)。
    服务器从这些给定的方法中选择一个并发送一个方法选中的消息回客户端:
    VER
    METHOD
    1
    1
    如果选中的消息是X'FF',这表示客户端所列出的方法列表中没有一个方法被选中,客户端
    必须关闭连接。
    当前定义的方法有:
    ? X'00' 不需要认证
    ? X'01'    GSSAPI
    ? X'02'    用户名/密码
    ? X'03' -- X'7F'   由IANA分配
    ? X'80' -- X'FE'  为私人方法所保留的
    ? X'FF'      没有可以接受的方法
    然后客户和服务器进入由选定认证方法所决定的子协商过程(sub-negotiation)。各种不同的
    方法的子协商过程的描述请参考各自的备忘录。
    开发者如果要为自己的方法得到一个方法号,可以联系IANA。可以参考关于已经被分配号码
    的文档以得到当前所有方法的列表和相应的协议。
    符合本文档的SOCKS V5实现必须支持GSSAPI,并且在将来支持用户名/密码认证方式。
    4.请求
    一旦子协商过程结束后,客户端就发送详细的请求信息。如果协商的方法中有以完整性检查和
    /或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。
    SOCKS请求的格式如下:
    VER
    CMD
    RSV  
    ATYP
    DST.ADDR
    DST.PORT
    1
    1
    X'00'
    1
    Variable
    2
    其中
    ? VER    协议版本: X'05'
    ? CMD
    ? CONNECT:X'01'
    ? BIND:X'02'
    ? UDP ASSOCIATE:X'03'
    ? RSV    保留
    ? ATYP   后面的地址类型
    ? IPV4:X'01'
    ? 域名:X'03'
    ? IPV6:X'04''
    ? DST.ADDR   目的地址
    ? DST.PORT   以网络字节顺序出现的端口号
    SOCKS服务器会根据源地址和目的地址来分析请求,然后根据请求类型返回一个或多个应答。
    5.地址
    ATYP字段中描述了地址字段(DST.ADDR,BND.ADDR)所包含的地址类型:
    ? X'01'
    基于IPV4的IP地址,4个字节长
    ? X'03'
    基于域名的地址,地址字段中的第一字节是以字节为单位的该域名的长度,没有结尾的NUL字
    节。
    ? X'04'
    基于IPV6的IP地址,16个字节长
      

  13.   

    6.应答
    一旦建立了一个到SOCKS服务器的连接,并且完成了认证方式的协商过程,客户机将会发送一
    个SOCKS请求信息给服务器。服务器将会根据请求,以如下格式返回:
    VER
    REP
    RSV
    ATYP
    BND.ADDR
    BND.PORT
    1
    1
    X'00'
    1
    Variable
    2
       其中:
    ? VER    协议版本: X'05'
    ? REP    应答字段:
    ? X'00'  成功
    ? X'01'  普通的SOCKS服务器请求失败
    ? X'02'  现有的规则不允许的连接
    ? X'03'  网络不可达
    ? X'04'  主机不可达
    ? X'05' 连接被拒
    ? X'06'  TTL超时
    ? X'07'  不支持的命令
    ? X'08'  不支持的地址类型
    ? X'09' – X'FF'  未定义
    ? RSV    保留
    ? ATYP   后面的地址类型
    ? IPV4:X'01'
    ? 域名:X'03'
    ? IPV6:X'04'
    ? BND.ADDR       服务器绑定的地址
    ? BND.PORT       以网络字节顺序表示的服务器绑定的段口
    标识为RSV的字段必须设为X'00'。
    如果选中的方法中有以完整性检查和/或安全性为目的的封装,这些应答必须按照该方法所定
    义的方式进行封装。
    CONNECT
    在对一个CONNECT命令的应答中,BND.PORT包含了服务器分配的用来连到目标机的端口号,
    BND.ADDR则是相应的IP地址。由于SOCKS服务器通常有多个IP,应答中的BND.ADDR常和客户端
    连到SOCKS服务器的那个IP不同。
    SOCKS服务器可以利用DST.ADDR和DST.PORT,以及客户端源地址和端口来对一个CONNECT请
    求进行分析。
    BIND
    BIND请求通常被用在那些要求客户端接受来自服务器的连接的协议上。FTP是一个典型的例
    子。它建立一个从客户端到服务器端的连接来执行命令以及接收状态的报告,而使用另一个从服务
    器到客户端的连接来接收传输数据的要求(如LS,GET,PUT)。
    建议只有在一个应用协议的客户端在使用CONNECT命令建立主连接后才可以使用BIND命令建
    立第二个连接。建议SOCKS服务器使用DST.ADDR和DST.PORT来评价BIND请求。
    在一个BIND请求的操作过程中,SOCKS服务器要发送两个应答给客户端。当服务器建立并绑
    定一个新的套接口时发送第一个应答。BND.PORT字段包含SOCKS服务器用来监听进入的连接的端
    口号,BAND.ADDR字段包含了对应的IP地址。客户端通常使用这些信息来告诉(通过主连接或控
    制连接)应用服务器连接的汇接点。第二个应答仅发生在所期望到来的连接成功或失败之后。在第
    二个应答中,BND.PORT和BND.ADDR字段包含了连上来的主机的IP地址和端口号。
    UDP ASSOCIATE
    UDP ASSOCIATE请求通常是要求建立一个UDP转发进程来控制到来的UDP数据报。DST.ADDR和
    DST.PORT 字段包含客户端所希望的用来发送UDP数据报的IP地址和端口号。服务器可以使用这个信息来限制进入的连接。如果客户端在发送这个请求时没有地址和端口信息,客户端必须用全0来填充。当与UDP相应的TCP连接中断时,该UDP连接也必须中断。
    应答UDP ASSOCIATE请求时,BND.PORT 和BND.ADDR字段指明了客户发送UDP消息至服务器的
    端口和地址。
    应答处理
    当一个应答(REP值不等于00)指明出错时,SOCKS服务器必须在发送完应答消息后一小段时间
    内终止TCP连接。这段时间应该在发现错误后少于10秒。如果一个应答(REP值等于00)指明成功,并且请求是一个BIND或CONNECT时,客户端就可以开始发送数据了。如果协商的认证方法中有以完整性、认证和/或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。类似的,当以客户机为目的地的数据到达SOCKS服务器时,SOCKS服务器必须用正在使用的方法对这些数据进行封装。
    7.基于UDP协议的客户
    在UDP ASSOCIATE应答中由BND.PORT指明了服务器所使用的UDP端口,一个基于UDP协议的客户必须发送数据报至UDP转发服务器的该端口上。如果协商的认证方法中有以完整性、认证和/或安全性为目的的封装,这些数据报必须按照该方法所定义的方式进行封装。每个UDP数据报都有一个UDP请求头在其首部:
    RSV
    FRAG
    ATYP
    DST.ADDR
    DST.PORT
    DATA
    2
    1
    1
    Variable
    2
    Variable
    在UDP请求头中的字段是:
    ? RSV  保留 X'0000'
    ? FRAG    当前的分段号
    ? ATYP   后面的地址类型
    ? IPV4:X'01'
    ? 域名:X'03'
    ? IPV6:X'04'
    ? DST.ADDR   目的地址
    ? DST.PORT   以网络字节顺序出现的端口号
    ? DATA     用户数据
    当一个UDP转发服务器转发一个UDP数据报时,不会发送任何通知给客户端;同样,它也将丢
    弃任何它不能发至远端主机的数据报。当UDP转发服务器从远端服务器收到一个应答的数据报时,必须加上上述UDP请求头,并对数据报进行封装。UDP转发服务器必须从SOCKS服务器得到期望的客户端IP地址,并将数据报发送到UDP ASSOCIATE应答中给定的端口号。如果数据报从任何IP地址到来,而该IP地址与该特定连接中指定的IP地址不同,那么该数据报会被丢弃。
    FRAG字段指明数据报是否是一些分片中的一片。如果SOCKS服务器要实现这个功能,X'00'指明数据报是独立的;其他则越大越是数据报的尾端。介于1到127之间的值说明了该分片在分片序列里的位置。每个接收者都为这些分片提供一个重组队列和一个重组的计时器。这个重组队列必须在重组计时器超时后重新初始化,并丢弃相应的数据报。或者当一个新到达的数据报有一个比当前在处理的数据报序列中最大的FRAG值要小时,也必须重新初始化从组队列。重组计时器必须小于5秒。只要有可能,应用程序最好不要使用分片。分片的实现是可选的;如果某实现不支持分片,所有FRAG字段不为0的数据报都必须被丢弃。一个SOCKS的UDP编程界面(The programming interface for a SOCKS-aware UDP)必须报告当前可用UDP数据报缓存空间小于操作系统提供的实际空间。
    ? 如果 ATYP是 X'01' - 10+method_dependent octets smaller
    ? 如果 ATYP是X'03' - 262+method_dependent octets smaller
    ? 如果 ATYP是X'04' - 20+method_dependent octets smaller
    8.  安全性考虑 
    这篇文档描述了一个用来透过IP网络防火墙的应用层协议。这种传输的安全性在很大程度上
    依赖于特定实现所拥有以及在SOCKS客户与SOCKS服务器之间经协商所选定的特殊的认证和封装方式。系统管理员需要对用户认证方式的选择进行仔细考虑。
      

  14.   

    思路有了~~~~可以肯定的是传输时绝对不是TCP传输~
      

  15.   

    http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=21228&page=1
      

  16.   

    反弹端口实际上并不是很难理解的。
    但你确实需要一个外部的IP地址,若没有那就用代理服务器。
    内网的ip及其端口实际上被解释成外网的ip和随机分配的一个端口。他的连接过程如下
    A为内网中的一台客户机,a为A的外网IP;b为一个外网(当然他是有固定的IP的)
    显示内网中的A向b连接(因为b有外网IP),这是b收到了A的请求,并得到a的ip和a
    随机分配的端口,b给A回信时就用a的ip和随机分配的端口,这是A就会收到回信的。
      

  17.   

    还要说一下TCP和UDP都是可以的。