解决PPTP访问内网资源时无法传输数据的问题

PPTP有两个流,一个是控制流(RFC2637定义),另外一个数据流(GRE, RFC2784)。和一般的ALG不同的是(比如FTP),NAT遇到PPTP的时候,不是端口或 者IP惹的祸,而是PPTP里面callID(抛一个球给各位,为何PPTP把call ID整到 PPTP控制流里面?)。在PPTP协议里面,有一个call ID的概念,客户端向服务器 发起连接,会告诉服务端我的call ID是多少,服务端也会回应客户端它的call ID是多少,并且更重要的一点是,这个call ID在以后的某些(注意不是全部哦) 控制传输中需要用到,在所有的数据传输中(GRE)需要用到。而接下来我们从两 个方面一起来看一下问题是如何产生,以及如何去解决:

从内网向外网 发起PPTP连接请求

从外网向内网发起PPTP连接请求(俗称静态映射)

走,咱们去看看外面的世界

(注:下面的结构是1)提一下PPTP协 议;2)提一下GRE协议;3)如何搞定GRE数据流;4)如何搞定PPTP控制流。)

PPTP服务器是监听在TCP/1723端口。客户端发送的第一个携带call ID的 数据包是被称为Outgoing-Call-Request的数据包,一个示例如下图所示(忽略了 前面的以太网头,IP头,以及TCP头):

可以看到我们这边的示例客户端的call ID是16384(这个call ID是给自己分 配的),那我就以Client-Call-ID表示吧。

服务端收到这个数据包之后 ,然后会回应一个称为Outgoing-Call-Reply的数据包,示例如下:

这个说明服务端自己的call ID是107(这个服务端是给自己分配的,我就以 Server-Call-ID表示), 同时也把Client-Call-ID返回给客户端。咦,这样看来 好像没有什么问题嘛,反正这个call ID改不改,对于这一条连接都没有影响, NAT也可以正常运作。但是,各位看官,PPTP还需要用到一个协议,那就是GRE (RFC 2784)。而GRE是一个和TCP以及UDP处在同一个水平线的协议。但是和 TCP/UDP之流不同的是,GRE里面不携带端口信息,而它利用的就是call ID来作 multiplex以及demultiplex的。我们看一下客户端发给服务端的一个GRE数据包( 提示一点,GRE头后面的是PPP协议封装,不过这里不需要关心):

里面有call ID,这个call ID不是说自己的,而是说对方的(对,就是PPTP里 面的那个Server-Call-ID),也就是服务端的,也就是我这个GRE数据要发给服务 端的107“端口”。

而服务端也采用同样的策略,只不过call ID表明的 是客户端的,一个示例如下:

(注:上面的都是一些协议的原理,如果你读了RFC,未必不懂这些。插一个 情景,来自一个电影:C开一辆车在公路上,前面有一个人D骑一辆自行车。C在 追D的,C紧张的说:“你。。。你骑自行车未必比我开车快!”)

问题是 这些个数据包也要经过我们可怜的NAT啊,GRE会问NAT:“我这个call ID,管还 是不管?”,NAT答曰:”不管。”话虽如此,但是谈何容易,因为GRE里面没有 端口,如果NAT不伪造一个端口的话,下面的情形就不堪设想了:

一个主 机A的IP地址是192.168.1.2,向1.1.1.1(声明:这里仅仅是假设,没有对其进行 真正的试验,1.1.1.1请不要见怪)发起PPTP连接请求,Client-Call-ID是16384 ,Server-Call-ID是107;

还有一个主机B在内网,IP地址是192.168.1.3 ,也向1.1.1.1发起PPTP连接请求,Client-Call-ID2是16385, Server-Call- ID2是108。

NAT如果仅仅是转换IP地址(假设NAT的公网IP是 116.238.184.159),那么数据到能够到达1.1.1.1,可是GRE数据包回到 116.238.184.159的时候,NAT这个时候是该把它发给192.168.1.2呢,还是 192.168.1.3呢?在这种情况下,NAT必须要找一个“端口”,来决定这个数据包 是发给谁,而“端口”需要满足以下特性:

在一台主机上,这个是唯一 的;

必须每个数据包中都存在。

而扫描整个GRE数据包,只有call ID具有此特性。所以这个关系是这样的,由于GRE数据包里面没有像TCP/UDP的端 口信息,所以需要这样一个信息,而call ID的存在恰恰满足了这样一个条件。 但是call ID和TCP/UDP端口有不一样的地方:

TCP/UDP的端口在传输层中 的位置是一样的,相对偏移量是0,而call ID在传输层里面的偏移量是 6;

TCP/UDP的端口在每个数据包里面都会携带源端口和目的端口,但是 call ID仅仅携带一个,并且是指对方的。

意识到这些不同点非常重要, 这会影响到NAT对待TCP/UDP和GRE要完全不同,而也正是PPTP ALG的原因之一!

嘿嘿,是否对为何需要针对GRE作特殊处理的原因了吧?好,那我们看如 果保证GRE数据包能够顺利通过NAT。

时间: 2024-06-13 08:55:01

解决PPTP访问内网资源时无法传输数据的问题的相关文章

为什么用TMG搭建VPN后无法访问内网资源

前段时间被朋友问到利用TMG构建VPN服务平台后,用户远程连接到VPN后无法访问内网资源的问题,今天就做一个简单的分享吧. 首先FTMG配置完成VPN后,默认是不可以访问内网资源的,要想访问,则需要创建一条允许访问内网资源的访问规则. 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Network/Firewall/

Win7连接VPN后不能访问内网怎么办

解决方法: 在公司单位网络下连接VPN容易遇到的一个问题,因为VPN连接是全局性的,会改变本机IP,从而导致不能访问公司内部网络.想要解决这个问题其实也不难,借助修改路由表分流一下,使得访问内部网络时还是通过本地网关,下面介绍一下操作方法,以Windows系统为例. 打开记事本程序,添加以下内容另存为bypass.bat文件.代码适当修改一下,将下面的192.168.1.0修改为你自己的网关.注意最后一个必须为0,比如你的网关是192.168.1.1,则写192.168.1.0(网关信息可以在网

win7 双网卡要怎么配置,可以访问外网,也可以访问内网,但是我还要访问通过联通公司的一条网络

问题描述 win7 双网卡要怎么配置,可以访问外网,也可以访问内网,但是我还要访问通过联通公司的一条网络 win7 双网卡要怎么配置,可以访问外网,也可以访问内网,但是我还要访问通过联通公司的一条网络,双网卡时不通,单时就通,详细看图,帮我想想办法. 解决方案 关于如何通过外网访问到内网的数据库?(delphi) 解决方案二: 这个问题不难解决,我们经常做的,方法见我的博客:双网卡同时上内外网的方法

paket dll-win8系统的 每次启动学校的内网supplicant时就提示缺少paket.dll

问题描述 win8系统的 每次启动学校的内网supplicant时就提示缺少paket.dll 已经在网上下载了一个win8的paket.dll放在windows/system32目录下了 可是重启之后还是提示缺少paket 帮忙解决一下吧 谢谢大神们

NAT/ICS下让外网用户访问内网WEB服务器

解决在使用NAT/ICS的情况下让外网用户访问内网WEB服务器的方法. 关于ICS里面的一个附加功能,操作相当简单,如果已经进行了NAT(网络地址转换)或ICS(Internet 连接共享),可以再完善. 一.使用NAT的情况 1.打开路由与远程访问MMC; 2.假设你的服务器名字是Myserver,启用了NAT的连接是"本地连接1".依次展开"Myserver"->"IP路由选择"->"网络地址转换(NAT)".

外网访问内网-端口映射,内网ip映射

问题描述 端口映射,内网ip映射 广域网访问局域网的服务器最便捷的办法,除了用花生壳外,还有什么办法? 如果用路由器设置,什么品牌的可以? 解决方案 一般的路由器都有这样的设置的把, 把内网某个内网ip映射到指定的端口 解决方案二: 首先纠正你一点,外网访问内网,花生壳根本办不到.花生壳是ddns,仅仅解决了一个动态ip的自动维护它的dns指向的功能. 外网访问内网的前提是,你的内网通过路由器连接到公网上,这个公网有公网ip,你对路由器有控制能力.你只要做端口映射就可以访问到了.任何品牌基本都可

wi-fi-Android通过内网wifi访问内网webservice问题

问题描述 Android通过内网wifi访问内网webservice问题 android开发的APP在模拟器上运行正常,然后把APK文件安装到手机上后,通过内网的wifi网络无法访问内网的服务器,请问该如何解决此问题?? 解决方案 访问内网问题 解决方案二: 访问不了内网,除非你们运维给你开放或者做映射 解决方案三: 你通过ip访问还是什么?ip应该没有问题 解决方案四: 确保在同一个网段 你可以看下你手机IP,然后在服务器上ping 这个地址,如果通的话,没有问题的 解决方案五: 回复小三余:

ipconfig-外网怎样访问内网IP上的端口

问题描述 外网怎样访问内网IP上的端口 家里电脑IP地址115.175.233.xx 命令行输入ipconfig看到: 无线局域网适配器 -> IPv4地址是192.168.1.102,子网掩码是255.255.255.0,默认网关192.168.1.1 以太网适配器 -> IPv4地址是192.168.231.1,掩码一样 我用本地端口55321开了个服务器,怎样可以通过外网访问? telnet 155.175.233.xx 55321 连不上.怎样把NAT映射到本机 解决方案 ISP做了N

阿里云API 发生子账号访问主账号资源时的鉴权规则有哪些

ECS API 发生子账号访问主账号资源时的鉴权规则 当子账号通过 ECS Open API 对主账号的 ECS 资源进行访问时,ECS 后台向 RAM 进行权限检查,以确保资源拥有者的确将相关资源的相关权限授予了调用者. 每个不同的 ECS API 会根据涉及到的资源以及 API 的语义来确定需要检查哪些资源的权限.具体地,每个 API 的鉴权规则见下表 Action鉴权规则 AllocatePublicIpAddressacs:ecs: $regionid:$accountid:instan