目录

PPTP简介

PPTP工作流程

建立连接

数据传输

直接穿越NAT会有什么问题

NAT44 NAT64

NAT66

NAT ALG PPTP实现方法

1. NAT 设置一个 call-id pool

2. 建立连接时

3. 数据传输时

结语


PPTP简介

PPTP全称Point to Point Tunneling Protocol,点对点隧道协议。

本质上就是个隧道, GRE头包裹加密数据,常用于VPN。

PPTP工作流程

建立连接

PPTP建立连接是要client主动connect 到PPTP Server,经过一系列交互后完成。

大致交互过程如下

1. client 生成一个Client-call-id,发送给Server

2. Server 也为这个client生成一个server-call-id, 发送给Client. 针对每个client,server都会分配一个server-call-id.

3. Server对client的校验(用户名、密码 or 秘钥等)

4. Server 为client分配 PPTP IP address

5. client已连入Server的虚拟局域网,连接完成。

数据传输

IP header1 GRE Header PPP payload
IP header2 data

IP header1,  src: client ip,  dst: server ip,  无tcp udp port

GRE Header, 带有对端call-id.

IP header2,  src: pptp client ip, dst: pptp server ip... 这是虚拟局域网中client和server的地址

Client ---> Server

GRE header里面带上 Server-call-id,Server通过这个Server-call-id识别是哪个client.Client  ----> Server

Server ----> Client

GRE header里面带上Client-call-id

直接穿越NAT会有什么问题

数据传输时是GRE包,无Port。

NAT44 NAT64

内网多个ip 映射一个外网ip,有GRE里的call-id, 从client 到server 看起来没什么问题。

从server回client就有问题了,根据回包call-id,理论上NAT也可以找到对应的client,但是不同的主机的call-id是极有可能重复的,它们之间是没有协商的。

当有2个主机的call-id一样时,NAT是无法分辨回包是去到哪里的。

NAT66

内网IP和外网IP一一对应,很好溯源,这种情况下,PPTP是可以顺利穿越的。

NAT ALG PPTP实现方法

针对不同主机Client-call-id重复导致PPTP无法穿越NAT, 可以通过NAT分配client-call-id来避免重复,完美溯源。

下面是一种简单的设计:

pptp_session {

ip address

local-call-id

nat-call-id

server-call-id

}

1. NAT 设置一个 call-id pool

2. 建立连接时

2.1 Client向Server请求连接,记录client-call-id至pptp_session的local-call-id,再为每一个Client 分配一个 nat-call-id,并建立map表,nat-call-id映射到该pptp_session。

2.2 Server回复Client, 记录 Server-call-id至pptp_session, 再建立一张map表,server-call-id映射到该pptp_session

3. 数据传输时

Client-->Server,   貌似什么也不用做,直接转换IP就出去了, GRE头里的call-id也自然是对端server-call-id.

Server-->Client,  根据GRE头里的call-id,  查询nat-call-id映射表,找到pptp_session, 更换call-id为local-call-id, 转换IP地址即可。

通过call-id pool 对client call-id重新赋值,就可以让PPTP顺利穿越NAT.

结语

关于NAT ALG有N种协议,如果想实现大部分,也是路漫漫其修远兮。

NAT ALG PPTP实现简要分析相关推荐

  1. 当NAT遇到PPTP

    转自:http://www.linuxidc.com/Linux/2012-08/67884.htm 我建了一个PPTP的帐号,想访问一下内网资源,结果发现,没法传输数据,这是怎么回事?于是在Goog ...

  2. NAT 网络地址转换技术(一)NAT原理介绍:静态NAT、动态NAT、NAPT、Easy IP、NAT ALG、NAT服务器、双向NAT技术

    文章目录 出现原因 基本概念 NAT技术基本原理 源NAT技术 静态NAT 动态NAT NAPT Easy IP NAT ALG NAT服务器 双向NAT技术 域间双向NAT(NAT Server+源 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...

  4. [Java] HashMap 源码简要分析

    特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 publ ...

  5. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  6. 【安全漏洞】简要分析复现了最近的ProxyShell利用链

    前言 近日,有研究员公布了自己针对微软的Exchange服务的攻击链的3种利用方式.微软官方虽然出了补丁,但是出于种种原因还是有较多用户不予理会,导致现在仍然有许多有漏洞的服务暴露在公网中,本文主要在 ...

  7. Android L Settings 简要分析

    1.本文说明 本文主要针对L平台上Settings模块正常启动流程做一个简要分析,并试着分析一下Settings下面Storage选项的实现过程. 2.Settings概览 在之前的KK平台上Sett ...

  8. Android 5.1 Settings源码简要分析

    概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...

  9. PyTorch多卡分布式训练:DistributedDataParallel (DDP) 简要分析

    ©作者 | 伟大是熬出来的 单位 | 同济大学 研究方向 | 机器阅读理解 前言 因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用.之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模 ...

  10. oracle查询表实际大小,简要分析估算oracle表的大小

    查询oracle表的大小有几种方法,笔者简要分析下他们的异同 环境,newsadmin.newlog,原本有244,459,078条记录,delete后,现在只有51,109,919记录. 一.seg ...

最新文章

  1. Python将MySQL表数据写入excel
  2. 人月神话_神话般的代码
  3. mysql check exist_mysql – 使用多个EXIST进行查询
  4. MySQL调优(二):数据类型和schema优化,MySQL8.0取消查询缓存的原因
  5. kafka to mysql_Flink : kafka to mysql example
  6. 简单数据恢复菜鸟教程 (转)
  7. 写在ICDsoft购买和Paypal付款之后
  8. 使用using关键字来自动清除对象资源
  9. 物联网学习之旅:微信小程序控制STM32(二)--ESP8266连接mqtt服务端
  10. 解决vue项目更新版本后浏览器的缓存问题
  11. SVAC1.0逆扫描反变换反量化分析
  12. python可视化小程序-实际利率与黄金价格走势图
  13. http://blog.csdn.net/congcong68/article/details/39256307
  14. 高斯滤波器(Gaussian Filter) python实现及部分原理说明(opencv)
  15. 2017年计算机春季高考试题,山东省2017年春季高考数学试题(PDF版,含答案)
  16. JAVA判断时间是否过期
  17. android preference 启动activity,Android PreferenceActivity 学习笔记
  18. Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)
  19. C++问题汇总(一)
  20. Tess4J 简单运用 巨坑太多了

热门文章

  1. 正确使用计算机键盘的方法是,电脑键盘指法练习的方法
  2. centos 7 系统安装
  3. python中response是什么意思_python中的requests,response.text与response.content ,及其编码
  4. Ripple相关资源汇总
  5. 网线传输速度测试_教你局域网中怎样对网线进行全面测试
  6. Facebook登陆SDK接入(Android)
  7. [UWP开发] Facebook SDK使用(一) —— 配置SDK及Facebook登陆
  8. 高效实现斐波那契数列(Fibonacci数列)
  9. 校验EXE文件防止软件被破解
  10. JAVA试练塔之试炼技能图