前一段时间遇到一个问题。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. ECSSHOP表结构

    ECSSHOP表结构 -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint ...

  2. jQuery获取同级元素

    next()相邻下一个同级元素 prev()相邻上一个同级元素 siblings()所有同级元素 $("#id").next(); $("#id").prev( ...

  3. 一些dos命令

    MS DOS 命令大全 一.基础命令 1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出隐含 ...

  4. jquery返回顶部特效

    <style> p#back-to-top{position:fixed; bottom:100px;right:10px; display: none; } p#back-to-top ...

  5. php header头信息 举例

    发布:sunday01   来源:Net     [大 中 小] 转自:http://www.jbxue.com/article/6915.html 用于演示PHP header()函数用法的代码,介 ...

  6. ECSHOP 支付宝发货确认接口,记录支付宝返回的交易号

    1,在order_info 数据表尾添加trade_no 字段 数据表尾怎么添加trade_no 字段 ECSHOP为了支付宝发货确认接口,需要记录支付宝返回的交易号 1,在order_info 数据 ...

  7. Python-Day1 Python基础学习

    一.Python3.5.X安装 1.Windows Windows上找度娘搜索“Python for windows下载”就OK了,安装的时候可以勾选设置环境变量,也可以安装完手动设置,这样在cmd中 ...

  8. 解决 ListView 水平滚动条不出现的问题(转载)

    问题的原因:http://www.cnblogs.com/nankezhishi/archive/2010/03/17/wpfbug13.html 解决方法:http://www.cnblogs.co ...

  9. http中的KeepAlive

    为什么要使用KeepAlive? 终极的原因就是需要加快客户端和服务端的访问请求速度.KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的.当客户端发送一次请求,收到相应以后,第二 ...

  10. console.log的使用

    相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是console能看到对象的内容. console不会打断你页面的操作,如果用al ...