VPN DNS leak 问题的解决
前一段时间遇到一个问题。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 问题的解决的更多相关文章
- 如何修改VPN连接的MTU,解决频繁断线和页面打不开的问题
如何修改VPN连接的MTU,解决频繁断线和页面打不开的问题 MTU 介绍:MTU 即最大传输单元,它是指一种通信协议的某一层上面所能通过的最大数据包大小.为什么需要修改 MTU大多数设备原本支持通过 ...
- OneDrive不能上了?DNS被污染,解决方法很简单
http://www.expreview.com/34434.html 除了LINE以外,最近微软的OneDrive云存储服务也出现访问故障,不过@月光博客 表示它只是受到DNS污染,被解析为无法访问 ...
- CentOS6重启后DNS被还原的解决办法
CentOS6重启后DNS被还原的解决办法 http://luyx30.blog.51cto.com/1029851/1070765/ centos6.5的64位系统,修改完/etc/sysconfi ...
- Android 常见 Memory Leak 原因及解决办法总结
待整理: http://geek.csdn.net/news/detail/50692 背景 在Android开发过程中,我们经常碰到的情况就是在我们不清楚为什么情况下,程序突然出现Crash了.其中 ...
- 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!
域名解析的基本原理是把域名翻译成IP地址,以便计算机能够进一步通信,传递网址和内容等. 域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP ...
- 验证DNS解析失败:解决办法之一
今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind 和bind-chroot[root@svr7 ~]# yum -y ...
- VPN连接错误800的解决办法
1,IP填错.2,防火墙太严.3,使用过别的VPN软件.4,服务器上服务里Protected Sqwerrage和Routing and Remote Access这两项是否启动.5,重启电脑,删除原 ...
- Android Handler leak 分析及解决办法
In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...
- Centos DNS重启失效的解决
在KT的毒妇配置的时候,通过yum安装了桌面,默认安装了Gnome,在没重启前还一切正常,重启以后接着配置的时候,发现没法网络访问了,ping测试一 下,host unkown;基本可以确定是DNS的 ...
随机推荐
- qml自定义标题栏
要实现自定义的标题栏只需在原来的窗口的基础上创建一个Rectangle并将其定位在窗口顶部即可,实现代码如下: ApplicationWindow { id: mainWindow visible: ...
- jQuery实例—选项卡(js源码和jQuery)【一些常见方法(1)-练习】
分别利用javascript的源码和jQuery来实现一个简单的选项卡,对比各自的步骤. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...
- netty启动过程
netty先启动work线程,work线程打开selector 绑定pipeline 启动boss线程,绑定端口,注册selector,绑定op_accetp事件 ------------------ ...
- ASP.NET Web API标准的“管道式”设计
详见:http://www.cnblogs.com/artech/p/asp-net-web-api-pipeline.html http://www.codeproject.com/Articles ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- Nginx upstream的5种权重分配方式
.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器down掉,能自动剔除 .weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. upstre ...
- 关于mapreduce过程中出现的错误:Too many fetch-failures
Reduce task启动后第一个阶段是shuffle,即向map端fetch数据.每次fetch都可能因为connect超时,read超时,checksum错误等原因而失败.Reduce task为 ...
- 语音合成,语音播报功能(系统)-b
第一次接触语音合成,只实现了很简单的功能,记录一下,以后免得去网上四处找资料 最近在做高德地图导航的时候有个语音播报的功能,高德sdk已经提供了要语音的字符串.我要做的就是把这些字符串读出声音来即可. ...
- iOS 支付宝应用(备用参考2)
接入前期准备工作包括商户签约和密钥配置 步骤1: 启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下, 并导入到项目工程中. AlipaySDK.bundle Al ...
- why you write code so slow.
今天我们要写一个日历表,用以存储所有的节假日. 虽然这个表设计的并不是很妙.但是将就着继续了. 让小弟把该表数据初始化3-5年的,结果一上午还没有出来,着急了,自己写了一个初始化的工具. 分享出来. ...