感兴趣流是VPN的术语,说的是需要进行保护的流量,也就是说需要进入VPN隧道的流量,然则仔细推敲之后,发现基于IP层加密的VPN这么使用“流”的概念是有问题的,因为对于IP,根本不存在流的概念,实质在于IP协议根本就没有方向。即使这样,本文还是介绍了一种全网互通的感兴趣流的截获技术。下面是一个拓扑图:可以看出,这个拓扑图中有四个网段,其中VPN端点的每一侧都有两个,两个网段中的其中一个的资源是需要加密访问的。虽然图比较简单,但是它却很有代表性,几乎囊括了所有的访问情形,那就是从任意网段加密或者明文访问任意的其它网段。那么怎样定义一个规则从而实现感兴趣流的截获呢?仔细思考这个问题就会发现它实际上并没有想象的那么简单,因为在同一个位置IP层无法区分一个数据包是到加密网段的需要加密的包还是从加密网段发起的到非加密网段的访问的返回包。因此必然需要一定的传输层信息,使用基于五元组的conntrack机制才可以准确区分这二者。对于IPSec,是通过配置复杂的策略数据库来实现的,www.linuxidc.com具体可以参见FreeSwan的实现框图。而对于OpenVPN,我们可以使用更加灵活的策略路由来实现,当然仅仅使用策略路由是不够的,还要使用conntrack模块,具体来讲就是使用mangle表的规则来对一些数据包打上mark,然后根据这些mark定位策略路由表。整个过程所使用的工具就是经典强大的iproute2以及iptables 。我使用ip_conntrack的ctstate这个match来区分下面两类数据包:1.源自任意地点经由此地到加密网段的访问包。2.源自任意地点经由此地的到达非加密网段访问包的返回包。ip_conntrack为一个流保存了一组状态,通过状态机来切换这些状态,本文中我们所使用到的有两个状态,分别是NEW和ESTABLISHED。其中NEW状态表示基于五元组进行连接跟踪的一个流的第一个包,而ESTABLISHED状态则标示一个流的反方向的第一个以及后续两个方向的所有包(这里没有考虑INVALID情况,也没有考虑过期)。也就是说,当发起一个请求时,数据包到达VPN端点的时候,其ctstate一定是NEW,而此时可以捕获其目的地址,根据目的地址是否是加密网段而进行走隧道还是走明文的抉择,另外一种情况,如果是访问加密网段的返回包,那么也是要加密走隧道的,而此时该包到达VPN的另一个端点时,其ctstate已经是ESTABLISHED的了,因此可以捕获其源地址,如果源地址是加密网段,ctstate为ESTABLISHED,那么也是要加密的,其余的则全部明文放过。对于两个或者多个VPN端点,都是如此配置即可,因此我们为整个VPN所要做的,仅仅是知道到达哪些网段的流量需要加密即可,然后把上述的文字组织成脚本即可。本方法使用OpenVPN这种VPN再合适不过了,因为OpenVPN有丰富的接口和事件脚本和外部网络事件联动,同时其推送能力也会最大限度的简化配置。如此一来,你就不必像配置IPSec VPN那样,非常对称的在两端同时进行配置,而只需要在OpenVPN服务器端进行统一的配置即可,所有的客户端的配置都是可以推送下去的。这也是非对称的,C/S模式的OpenVPN的绝佳舞台。
Linux之ip_conntrack容易混淆的问题点滴Linux的ip_conntrack半景相关资讯 IpTables
- CentOS Samba 服务器 Iptables 和 (今 07:14)
- iptables超全详解 (09月01日)
- Iptables防火墙 基础知识 (08月19日)
| - Iptables工作原理使用详解 (09月06日)
- iptables中NAT表 (08月25日)
- Linux 为FTP 服务器添加iptables规 (08月11日)
|
本文评论 查看全部评论 (0)
评论声明- 尊重网上道德,遵守中华人民共和国的各项有关法律法规
- 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
|