我的工作机是A,通信网卡是Aeth0, Appp0;

然后我的云主机是B, 通信的网卡是Beth0, Bppp0;

在网卡Bppp0上会不断地很清晰的数据包:

16:40:39.522917 IP 61.135.169.121 > 192.168.0.234: ICMP echo reply, id 3361, seq 532, length 64
16:40:40.511096 IP 192.168.0.234 > 61.135.169.121: ICMP echo request, id 3361, seq 533, length 64
16:40:40.523714 IP 61.135.169.121 > 192.168.0.234: ICMP echo reply, id 3361, seq 533, length 64
16:40:41.512076 IP 192.168.0.234 > 61.135.169.121: ICMP echo request, id 3361, seq 534, length 64
16:40:41.524685 IP 61.135.169.121 > 192.168.0.234: ICMP echo reply, id 3361, seq 534, length 64
其中61.135.169.121是百度的ip地址,192.168.0.234 是我工作机A的IP地址,

在网卡Beth0上也会有清晰的数据包:下面是外界外界通信网卡Beth0上接收到的数据(去除了一些干扰的因素);发现问题所在了吗?以16:40:40这次的ping操作为例来分析,总有的六条关键的浅蓝色数据。我们按照时间戳对这六条浅蓝色数据排序,发现的处理顺序是:③-①-④-⑤-②-⑥

梳理一下流程,对于VPN服务器来说,首先用Beth0网卡接收到了来自我工作机的请求,这个请求的上层协议是GREv1(通用路由封装  general routing encapsulation)协议,收到数据之后讲数据的内容传送给使用该协议发送数据的pptpd,pptpd完成一些简单的解密操作之后,将实际的数据内容(链路层+IP+ICMP),传送给ppp0,ppp0是一个tun设备,这个设备调用ppp驱动层层解压,到了IP层发现实际要达到的网络的IP地址是百度的61.135.169.121,于是是云主机内部进行了转发操作,于是我云主机的网卡就就把这个对百度的ping操作给转发了出去。。。。有没有肖申克救赎的既视感?怎么回来呢?spaceX发射后还是要回收的呢,回来这条path咋整?因为配置pptpd服务的时候我们配置了一条nat设置:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE。这句话的意思是增加一条源是192.168.0.0/24的包机制,正好我们的从Beth0-->Bppp0-->Beth0出去的对百度的ping操作就是这样一个包,所以就这样,这个ping包换上我Beth0的主机地址真正地进入物联网大海了,然后baidu的主机61.135.169.121接收到了信息之后,百度的包回应了,回应之后数据到了我的云主机B,到了我的云主机后被网卡Beth0接收,接受好了之后,在路由之前IP地址被替换成了原来的地址192.168.0.234(iptables的设置有始有终呢),然后这个数据包就开始在云主机B中路由了,在我的云主机B中,有这样一条路由信息:

192.168.0.234   *               255.255.255.255 UH    0      0        0 ppp0
意思是说发往192.168.0.234的包,通过ppp0走,好了就这样,这个包从ppp0出去啦。。。由于,由于,由于,重要的事情说三遍,由于ppp0是一个tun设备,所以用户态的pptpd可以直接把这个数据包读出来,读出来之后,把裸的IP+ICMP的数据包使用GREv1的数据包发送到我的工作机Aeth0卡上!顺利返回。有心的同学对照着我的大白话解释和这1-6条看看吧。肯定能一一对应上。大家可以自己理一下客户端的逻辑,我在本篇文章的最后会贴出客户端的逻辑,先自己分析。

16:40:39.510232 IP Aeth0 > Beth0: GREv1, call 384, seq 8535, length 101: compressed PPP data
16:40:39.510284 IP Beth0 > 61.135.169.121: ICMP echo request, id 3361, seq 532, length 64
16:40:39.522911 IP 61.135.169.121 > Beth0: ICMP echo reply, id 3361, seq 532, length 64
16:40:39.522956 IP Beth0> Aeth0: GREv1, call 37226, seq 8829, ack 8535, length 105: compressed PPP data

16:40:40.511062 IP Aeth0 > Beth0: GREv1, call 384, seq 8536, length 101: compressed PPP data ③
16:40:40.511103 IP > 61.135.169.121: ICMP echo request, id 3361, seq 533, length 64 ④
16:40:40.523707 IP 61.135.169.121 > Beth0: ICMP echo reply, id 3361, seq 533, length 64
16:40:40.523753 IP Beth0 > Aeth0: GREv1, call 37226, seq 8830, ack 8536, length 105: compressed PPP data

16:40:41.512015 IP Aeth0 > Beth0: GREv1, call 384, seq 8537, length 101: compressed PPP data
16:40:41.512087 IP Beth0 > 61.135.169.121: ICMP echo request, id 3361, seq 534, length 64
16:40:41.524679 IP 61.135.169.121 > Beth0: ICMP echo reply, id 3361, seq 534, length 64
16:40:41.524732 IP Beth0 > Aeth0: GREv1, call 37226, seq 8831, ack 8537, length 105: compressed PPP data

配置好了pptp协议之后,用tcpdump抓Beth0和Bpp0上的包,在网卡B

客户端收发包的逻辑:

default         *               0.0.0.0         U     0      0        0 ppp0

客户端的收发包,把对所有工作机A外的地址访问给给ppp0去转发,于是当我做了一个ping了百度61.135.169.121的操作之后,对与百度的ping的包会从ppp0发送出去,ppp0同样是一个tun设备,数据会被pptp的客户端监听到,客户端监听到之后,讲完整的这个数据包【ppp+ip+icmp]完整地打包,将目的地址设置成为云主机B的IP地址,作为数据由网卡Aeth0发出; 然后这个数据包就跑到了我的云主机B那边啦;

【这里有个疑问:我设置了链条default的路由,pptp客户端是怎么确定  default路由的信息的?抓下ppp0和eth0的包】

客户端收包,首先肯定是从外置的网卡中来的,然后包被客户端收到,客户端收到了包之后包被pptp的监听的进程收到,收到这个数据包之后,把数据包吸入ppp0接口,写入ppp0,由于ppp0就是一个本地的地址了,所以数据包就达到了目的地;以18:21:56的一次ping操作抓的数据包为例,仍然按照时间戳排序①-③-④-

ppp0网卡抓包结果:

8:21:57.943195 IP 192.168.0.234 > 61.135.169.125: ICMP echo request, id 4332, seq 6, length 64
18:21:57.972086 IP 61.135.169.125 > 192.168.0.234: ICMP echo reply, id 4332, seq 6, length 64

Aeth0网卡抓包结果:

18:21:56.941288 IP Aeth0 > Beth0: GREv1, call 384, seq 9804, ack 10012, length 105: compressed PPP data
18:21:56.969878 IP Beth0 > Aeth0: GREv1, call 19459, seq 10013, ack 9804, length 105: compressed PPP data ④
18:21:57.470673 IPAeth0 > Beth0: GREv1, call 384, ack 10013, no-payload, length 12
18:21:57.971982 IP Beth0 > Aeth0: GREv1, call 19459, seq 10014, ack 9805, length 105: compressed PPP data

整个过程中的疑问,当然都是小case啦

1)这里没必要做成ppp设备啊,普通的一个设备就好呢;

2)GRE协议在哪里起作用没发现

这两个问题慢慢看吧,不影响对VPN机制的理解啦!总之一句话,所谓的VPN,把包当做数据,pptp服务器处中转一下,pptp服务器代理包的发送

pptp协议的工作原理的更多相关文章

  1. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  2. TCP协议通讯工作原理

    TCP协议通讯工作原理   一.TCP三次握手 传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议.面向连接是指一次正常的TCP传输需要通过在TCP ...

  3. @清晰掉 spi协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...

  4. FTP协议及工作原理

    1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的基础,它由一系列规格说明文 ...

  5. FTP协议及工作原理详解

    1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的基础,它由一系列规格说明文 ...

  6. Windows下ARP协议的工作原理简介

       ARP协议(Address Resolve Protocol,地址解析协议)工作在TCP/IP协议的第二层-数据链路层,用于将IP地址转换为网络接口的硬件地址(媒体访问控制地址,即MAC地址). ...

  7. SPI协议及其工作原理浅析

    转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...

  8. SPI协议及其工作原理浅析【转】

    转自:http://www.laoliu-soft.net/category/tech_chap/tech_linux/ 一.概述. SPI, Serial Perripheral Interface ...

  9. SPI协议及其工作原理详解

    一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...

随机推荐

  1. jzoj5196. 【NOIP2017提高组模拟7.3】B (数论,巧妙的暴力)

    Description

  2. [ZJOI2006]超级麻将(动规)

    题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...

  3. layDate 闪现 循环一个以上会闪现

    一个render一次渲染一个日期组件,这个是内置的,所以需要循环绑定, 又不能确定页面有多少个,还好layDate 提供了内置方法, //同时绑定多个 lay('.test-item').each(f ...

  4. django 面试题

    面试题1:migrate怎么判断哪些迁移脚本需要执行: 他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移 ...

  5. git push之后回滚(撤销)代码

    问题描述:首先,先说明一下,为什么会引发这次的话题,是这样的,我做完功能Agit push之后,2个月后需求部门要求不要功能A了,然后需要在没有功能A的基础上开发,怎么办?赶紧回滚代码呀. 然后我用g ...

  6. mysql计算排名

    mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...

  7. 06 python操作MySQL和redis(进阶)

    python操作mysql.redis 阶段一.mysql事务 主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息, ...

  8. Leecode刷题之旅-C语言/python-20.有效的括号

    /* * @lc app=leetcode.cn id=20 lang=c * * [20] 有效的括号 * * https://leetcode-cn.com/problems/valid-pare ...

  9. MVC中路由的修改和浏览器的地址参数

    在 ASP.NET MVC 应用程序中,它是更常见的做法在作为路由数据 (像我们一样与身份证上面) 比将它们作为查询字符串传递的参数中传递. ) { return HttpUtility.HtmlEn ...

  10. 1511: [POI2006]OKR-Periods of Words

    1511: [POI2006]OKR-Periods of Words https://www.lydsy.com/JudgeOnline/problem.php?id=1511 题意: 对于一个串的 ...