NAT ALG PPTP实现简要分析
目录
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实现简要分析相关推荐
- 当NAT遇到PPTP
转自:http://www.linuxidc.com/Linux/2012-08/67884.htm 我建了一个PPTP的帐号,想访问一下内网资源,结果发现,没法传输数据,这是怎么回事?于是在Goog ...
- 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+源 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析...
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入 ...
- [Java] HashMap 源码简要分析
特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 publ ...
- Android Hal层简要分析
Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...
- 【安全漏洞】简要分析复现了最近的ProxyShell利用链
前言 近日,有研究员公布了自己针对微软的Exchange服务的攻击链的3种利用方式.微软官方虽然出了补丁,但是出于种种原因还是有较多用户不予理会,导致现在仍然有许多有漏洞的服务暴露在公网中,本文主要在 ...
- Android L Settings 简要分析
1.本文说明 本文主要针对L平台上Settings模块正常启动流程做一个简要分析,并试着分析一下Settings下面Storage选项的实现过程. 2.Settings概览 在之前的KK平台上Sett ...
- Android 5.1 Settings源码简要分析
概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...
- PyTorch多卡分布式训练:DistributedDataParallel (DDP) 简要分析
©作者 | 伟大是熬出来的 单位 | 同济大学 研究方向 | 机器阅读理解 前言 因为课题组发的卡还没有下来,先向导师问了实验室的两张卡借用.之前都是单卡训练模型,正好在这个机会实践以下单机多卡训练模 ...
- oracle查询表实际大小,简要分析估算oracle表的大小
查询oracle表的大小有几种方法,笔者简要分析下他们的异同 环境,newsadmin.newlog,原本有244,459,078条记录,delete后,现在只有51,109,919记录. 一.seg ...
最新文章
- Python将MySQL表数据写入excel
- 人月神话_神话般的代码
- mysql check exist_mysql – 使用多个EXIST进行查询
- MySQL调优(二):数据类型和schema优化,MySQL8.0取消查询缓存的原因
- kafka to mysql_Flink : kafka to mysql example
- 简单数据恢复菜鸟教程 (转)
- 写在ICDsoft购买和Paypal付款之后
- 使用using关键字来自动清除对象资源
- 物联网学习之旅:微信小程序控制STM32(二)--ESP8266连接mqtt服务端
- 解决vue项目更新版本后浏览器的缓存问题
- SVAC1.0逆扫描反变换反量化分析
- python可视化小程序-实际利率与黄金价格走势图
- http://blog.csdn.net/congcong68/article/details/39256307
- 高斯滤波器(Gaussian Filter) python实现及部分原理说明(opencv)
- 2017年计算机春季高考试题,山东省2017年春季高考数学试题(PDF版,含答案)
- JAVA判断时间是否过期
- android preference 启动activity,Android PreferenceActivity 学习笔记
- Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)
- C++问题汇总(一)
- Tess4J 简单运用 巨坑太多了
热门文章
- 正确使用计算机键盘的方法是,电脑键盘指法练习的方法
- centos 7 系统安装
- python中response是什么意思_python中的requests,response.text与response.content ,及其编码
- Ripple相关资源汇总
- 网线传输速度测试_教你局域网中怎样对网线进行全面测试
- Facebook登陆SDK接入(Android)
- [UWP开发] Facebook SDK使用(一) —— 配置SDK及Facebook登陆
- 高效实现斐波那契数列(Fibonacci数列)
- 校验EXE文件防止软件被破解
- JAVA试练塔之试炼技能图