歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> iptables和策略路由實現VPN感興趣流的截獲

iptables和策略路由實現VPN感興趣流的截獲

日期:2017/2/28 15:55:18   编辑:Linux教程

感興趣流是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的絕佳舞台。

Copyright © Linux教程網 All Rights Reserved