前一段时间遇到一个问题。customer说发现连接VPN后在PPP端发现security leak,整个转了好大一个圈子才把问题解决了。之所以费这么大周折,倒不是因为很难解决,只是费了很大劲儿才定位了root cause。

1. 到底是不是security leak?

customer说连到VPN server,然后ping的过程中就发生了DNS leak,因为他们在PPP看到了明码。我跟他们一顿解释,在发送端,数据是在PPP以下的层次中的数据都是加密的。在接收端是在PPP以上的层次看到的数据都是解密的,这是正常的,不是security leak。

图1 VPN 在stack中的位置

他说不好意思,听不懂你在说什么,我只好继续发图解释。Tunnel保护数据在internet中的传输,到达corpnet后就被解密了。在接收端的PPP以上的层次接收到的肯定是明码,因为已经被解密过了。

图2 网络结构

对方是一个印度的大概是在线支持之类的角色吧。经过一轮沟通,他还是不清楚我在说什么。最后只好吐血画了张大图继续和他解释。在中间的绿色部分是处在VPN tunnel中的,如果在这儿的任意一层发现明码肯定是leak,但是到达VPN server后,上升到绿色部分以上之后就不再是VPN的保护范围了,应该所以能看到明码。

图3 网络结构

他说好像是懂了,他说customer的拓扑要比这个复杂。是client先通过ISP连到internet,然后再通过internet连到VPN sever的。这就有点麻烦了,因为他描述的scenario中包含两个PPP,我问他是在哪个PPP上发现了security leak。他说在两个PPP处都发现了明码DNS。

图4 customer的网络结构

好的,这下算是说到根上了。VPN server的PPP上发现DNS明码是正常的,但如果是在PPPoE的PPP上发现了明码,那基本就是security leak了。为了确认真的是这样,我在本地搭建环境重现了一下,在PPPoE server中抓到了这个结果,可以肯定DNS leak确实发生了。

图5 抓到的数据包

2. 问题的定位

印度同事终于提供了全套数据给我,可以详细分析一下问题背后的原因了。首先查路由相关信息。在他们提供的信息中我没有看到PPPoE的信息,但确实看到了DNS leak。看来leak和网络拓扑没有关系。路由表也没有发现明显问题,根据路由表,即使发给11.22.33.44 DNS Server的数据报也应被发送到VPN Server才对。

图6 client端路由表

图7 client端IP

图8  client端DNS leak query

这就有点麻烦了,问题可能是有几个原因导致的:

(1) 路由代码有问题;

(2) 路由查找中使用cache导致的;

(3) DNS代码的问题。

经研究发现,这个问题在IP层是解决不了的。因为有一种特殊情况,就是如果DNS Server和client是在同一网段的话,按照路由表,DNS query是一定要被直接路由到物理网卡而不是PPP的网卡。因此最终决定在应用层搞定,当发送DNS query时,首先判断是否存在VPN interface,如果有则所有DNS query都经过VPN interface发送,否则正常发送。

VPN DNS leak 问题的解决的更多相关文章

  1. 如何修改VPN连接的MTU,解决频繁断线和页面打不开的问题

    如何修改VPN连接的MTU,解决频繁断线和页面打不开的问题 MTU 介绍:MTU 即最大传输单元,它是指一种通信协议的某一层上面所能通过的最大数据包大小.为什么需要修改 MTU大多数设备原本支持通过 ...

  2. OneDrive不能上了?DNS被污染,解决方法很简单

    http://www.expreview.com/34434.html 除了LINE以外,最近微软的OneDrive云存储服务也出现访问故障,不过@月光博客 表示它只是受到DNS污染,被解析为无法访问 ...

  3. CentOS6重启后DNS被还原的解决办法

    CentOS6重启后DNS被还原的解决办法 http://luyx30.blog.51cto.com/1029851/1070765/ centos6.5的64位系统,修改完/etc/sysconfi ...

  4. Android 常见 Memory Leak 原因及解决办法总结

    待整理: http://geek.csdn.net/news/detail/50692 背景 在Android开发过程中,我们经常碰到的情况就是在我们不清楚为什么情况下,程序突然出现Crash了.其中 ...

  5. 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!

    域名解析的基本原理是把域名翻译成IP地址,以便计算机能够进一步通信,传递网址和内容等. 域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP ...

  6. 验证DNS解析失败:解决办法之一

    今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind  和bind-chroot[root@svr7 ~]# yum -y ...

  7. VPN连接错误800的解决办法

    1,IP填错.2,防火墙太严.3,使用过别的VPN软件.4,服务器上服务里Protected Sqwerrage和Routing and Remote Access这两项是否启动.5,重启电脑,删除原 ...

  8. Android Handler leak 分析及解决办法

    In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...

  9. Centos DNS重启失效的解决

    在KT的毒妇配置的时候,通过yum安装了桌面,默认安装了Gnome,在没重启前还一切正常,重启以后接着配置的时候,发现没法网络访问了,ping测试一 下,host unkown;基本可以确定是DNS的 ...

随机推荐

  1. html的3要素

    在HTML标记语言中可以将每个网页源码分成3部分: 1.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" &q ...

  2. ASP.NET的WebFrom组件LinkButton使用

    在ASP.NET的WebForm组件中的LinkButton组件也是一个服务器端的组件,这个组件有点类似于HTML中的<A>标识符.它的主要作用是就是在ASP.NET页面中显示一个超链接. ...

  3. VS2010水晶报表的添加与使用

    最近在学习VS2010水晶报表,发现原先安装的VS2010旗舰版没有 Crystal Report Viewer 控件,网上搜索一下发现要安装一个插件----CRforVS_13_0, 于是下载安装: ...

  4. Think PHP 提示验证码输入错误

    最近遇到一个项目中用的是Thinkphp这个框架开发的,其中在登录这块有验证码这个功能,其实这个功能是TP自带的,其中主要方法是buildImageVerify,位于ThinkPHP\Extend\L ...

  5. (转载)SQLServer存储过程返回值总结

    1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句) 用方法 int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况 (1)假如通过查询 ...

  6. linux 输入子系统(3)----事件处理(input_handler层)

    输入子系统主要设计input_dev.input_handler.input_handle.如下: [1]每个struct input_dev代表一个输入设备 struct input_dev { c ...

  7. WCF 动态生成 不用增加引用两种方式

    一.fromwork2.0低版本方式 1,打开vs的命令工具 输入:wsdl wcf地址 + /l:cs /out:文件名 上面红色部分替换掉就行,文件名,你想叫什么文件名都行. 2,回车,生成的文件 ...

  8. having count(*) > 1

    select phone from aa group by phone having count(*) > 1 后面的having子句是什么意思啊? 以phone分组,分组后每组里面phone出 ...

  9. ASP.NET中POST数据并跳转页面

    需求:先Post提交数据,然后跳转到目标页面 找了好久才发现这个神奇的类HttpHelper.原理很简单,利用html的from表单拼接,然后执行 使用方法: NameValueCollection ...

  10. (转载)Cocos2dx-OpenGL ES2.0教程:你的第一个立方体(5)

    在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率. 本教程将带领大家一起走进3D–绘制一个立方体.其实画立方体本质上和画三角形没什么区别,所有的模 ...