1. 程式人生 > >什麼是VPN?看運維專家聊聊VPN的那些事兒

什麼是VPN?看運維專家聊聊VPN的那些事兒

VPN對各位來說肯定是非常熟悉的,比如在家裡加密訪問公司後臺,或者在特殊場景做許可權控制,還有就是可以讓移動裝置撥vpn之後利用tc做弱網模擬,或者是在國內訪問google服務等,不過聽說google學術已經開始重返中國,以後可以在國內直接訪問到了。

VPN技術可以做的遠不止如此,今天我們來隨便聊聊VPN身邊的那些事情。

一、概述

我們這裡說的VPN主要是關於企業應用常見相關,不涉及到非法跨網。

VPN有很多種,比如Linux上最常用的pptp型別的vpn,稍微複雜點的openvpn,還有學cisco時候實驗用的EASY VPN,還有些看起來高大上的Juniper VPN。

其實遠遠不止這些,在實際環境下如果要相容各個網路運營商和終端裝置的話,就非常推薦SoftEtherVPN這個vpn盒子了。

VPN網路

下面來挑點東西和大家分享下。

二、VPN實現

2.1 GRE隧道

這個gre隧道是Linux上一個最簡單的”vpn”,遠遠比pptp簡單,但是並不那麼出名,因為他不直接和使用者接觸,一般是屬於伺服器或者網路裝置之間的”vpn網路”。

在A、B兩個異地機房,有兩個內網需要連線起來,我們不需要用vpn,直接用Linux自帶屬性即可完成。

首先在A、B伺服器上互加IP白名單,然後在A伺服器上操作:

#載入ip_gre模組
modprobe ip_gre
ip tunnel add gre1 mode gre remote B_IP local A_IP ttl 255
ip link set gre1 up
ip addr add 192.10.10.2 peer 192.10.10.1 dev gre1

在B伺服器上操作:

#載入ip_gre模組
modprobe ip_gre
ip tunnel add gre1 mode gre remote A_IP local B_IP ttl 255
ip link set gre1 up
ip addr add 192.10.10.1 peer 192.10.10.2 dev gre1

兩邊都敲完的話就有個隧道網段生成了,紅色地方是本段和對端的公網IP,下面兩個就是生成的隧道網段的IP了:

VPN網路

然後在這兩個伺服器互相用route命令加上對方內網的路由表走這個對端IP就可以了。

要斷掉這個隧道網路的話直接刪掉這個隧道網絡卡即可:

ip tunnel del gre1

在伺服器之間用這個的話,比pptp搭建個vpn方便點點。 -_-

2.2 Socket代理

簡單介紹下web的代理,如果無法訪問vpn的時候,這個可能有用武之地,比如某後臺只允許了某臺伺服器的IP,我們可以在這個伺服器上臨時搭建個代理服務,然後終端使用者可以通過這個跳板來訪問後臺了。

這個代理我們一般是用於訪問web流量,比如用squid或者ssh新建一條隧道,這裡普及下,原先可能大家都認為squid做代理的時候因為沒有目的站點的證書,是無法代理https流量,但其實不是這樣,可以利用stunnel結合來做https流量的代理,或者sniproxy也行。

不過squid搭建起來也比較麻煩,這裡簡單介紹下ssh一條命令來建立代理:

ssh -p 22 -qTfnN -D 0.0.0.0:7070 [email protected]

在目的伺服器上執行之後會監聽7070埠,在瀏覽器設定這個代理之後,web流量的出口就可以是這個伺服器了。

這個可以快速在多臺伺服器上建立多個用於頻繁改變使用者出口IP的代理,在某些場合下可能用得到,比如“幫朋友投下票”。

2.3 PPP協議

PPP協議的vpn有幾種實現方式,勉強歸類一下,包括pptp、sstp、l2tp。

大家接觸linux時候一般都是用這個pptp型別的vpn,也很簡便,但我們在某些特殊場合下面把這個vpn的功能給升級了。

這個vpn有別的開啟方式能讓我們點贊。

首先是認證控制,原先認證只可以用帳號和密碼認證,但是其實還可以加上源IP校驗。

再有的是許可權的自動化控制,強調自動化是因為我們的場景是在後臺管理帳號、使用者源IP和撥vpn之後對應的許可權甚至是進行抓包備案。

實現這兩個功能利用的是/etc/ppp/ip-up這個檔案,這個是在校驗帳號密碼之後呼叫的一個指令碼檔案,我們在這裡可以自定義一些邏輯來實現我們需要的功能。

通過加入sh -x來除錯這個指令碼,可以發現會傳入6個引數,其中就有我們需要的變數資訊:

  • 第一個引數是網絡卡名稱
  • 第五個引數是vpn獲取的ip
  • 第六個引數是使用者的來源IP
  • PEERNAME變數代表使用者的帳號

有了這些我們就可以另外寫一個提供複雜邏輯的指令碼來給ip-up呼叫。

VPN網路

比如先在ip-up裡面加入日誌,然後呼叫add_iptables.sh來做複雜的認證和許可權控制,到最後放入一個tcpdump來在後臺抓包做備用審計。

add_iptables.sh邏輯也比較簡單,利用傳入的引數來跟我們後臺提供的資料進行對比然後呼叫IPTABLES處理相關的複雜許可權控制即可。

同理,還有另外一個/etc/ppp/ip-down的指令碼是在使用者斷開vpn的時候自動呼叫的一個指令碼,在這裡可以刪除掉之前IPTABLES做的控制,然後還可以自動分析之前的tcpdump資料包然後寫入mysql。

上面說的是pptp型別的vpn,但是自從IOS裝置已經棄用了pptp,在這個場景下我們可以再加入l2tp的vpn。同樣是在/etc/ppp目錄,我們只需要再安裝配置ipsec(libreswan)和xl2tpd即可。

注意l2tp對外開放埠時候需要加多個,有udp的500、4500、1701這3個埠和esp協議,而且l2tp和pptp的邏輯和帳號檔案是同一套,所以非常順利就相容了之前的那些方案,具體搭建方案就不再多闡述了。

2.4 OpenVPN

OpenVPN

曾經這個vpn型別在某些場合很流行,因為看起來比pptp那些高大上些,甚至是可以讓每個使用者必須有專有的證書才可以撥上這個openvpn,需要各種私鑰、公鑰、客戶端,給人一種靠譜的感覺。

有很多經過二次開發的商業化的VPN客戶端也是採用了類似的三層tun虛擬隧道或者tap的虛擬網絡卡原理來實現內部邏輯。

openvpn也比較靈活,比如可以用auth-user-pass-verify來呼叫許可權控制指令碼等,很長一段時間我們也在一些場合下用這個openvpn方案。

不過不打算深入講下去,因為我們之後有更加實用的選擇。

2.5 SoftEtherVPN盒子

這個vpn (地址:https://github.com/SoftEtherVPN/) 是集中了多個vpn協議的軟體,相容性非常強,有多強呢?看圖:

SoftEtherVPN

幾乎是所有型別的終端都可以找到合適的vpn協議來連線這個server。

同時支援用vpncmd命令列管理和客戶端管理:

VPN

雖然他提供了很多功能,相當於傻瓜式地自動安裝了,不過有幾點建議:

  1. 不要用他自帶的nat功能,自己用IPTABLES做nat好些
  2. 自帶有dhcp功能,如果是要做複雜的網段控制,特別是vlan功能,建議另行搭建dhcpd服務並在/etc/sysconfig/dhcpd加入多個監聽的網絡卡。
  3. 如果可行的話,建議匯入正規的證書,因為如果是做sstp的話會在使用者端校驗證書,否則使用者體驗非常不好甚至是直接失敗。
  4. 帳號認證可以使用radius伺服器,方便和別的帳號系統聯動,我們用的是CISCO的ISE裝置。
    由於各類網路運營商的限制,可以同時開啟多個型別vpn給使用者備用。

下面簡單介紹下命令列的使用,因為想要自動化還得靠這個。

#進入命令列管理介面
./vpncmd server:port /SERVER /HUB:hub_name /PASSWORD:password
#在命令列管理介面的子命令:
#檢視幫助,每個命令都可以用help檢視詳細引數
help
#檢視當前使用者和流量
SessionList
#使用者的增刪查改
UserCreate UserDelete UserList UserSet
上面幾個常用的命令基本可以滿足我們的需求了,通過管道傳入即可實現命令列自動化管理。

不過這個軟體有個遺憾,多個vpn協議中不支援pptp型別。

三、應用場景

應用場景比較多,這裡小列舉下。

3.1 加密跨網訪問

國際網路不好時候,用來翻牆訪問github之類的地址,這個是最常見的用法。

還有個是被媒體揭祕過的借VPN方案利用運營商的定向免費流量來謀取暴利的跨網訪問等,不過這個定向的免費流量利用方式不一定靠譜,不推薦。

3.2 網遊加速器

基於國內的各種網路環境,特別是小運營商的網路質量很讓人傷心,一些遊戲運營商會開發些經過封裝的“VPN軟體”,取名XX加速器,比如可以通過本地路由把遊戲伺服器的網段通過vpn技術導向服務端,服務端那裡再經過一些邏輯處理取就近資源或者直接使用高質量的BGP網路進行轉發以提高使用者訪問質量。

3.3 特殊網路審計

這個也就是上面ppp協議那裡的實現方法,用於一些特殊場合的精細化訪問控制和審計。

3.4 隨機出口IP方案

之前又說個改變使用者出口IP的事情,這裡順帶一個解決方案,比如可以在伺服器上既做提供vpn給使用者的服務端,同時也可以做全球不同地方的客戶端,然後通過控制IPTABLES的nat來切換vpn使用者的出口。

如果不方便在全球部署伺服器的話可以在機房拉一條ADSL到伺服器的另外一個網絡卡,然後通過pppoe-start來撥號,通過自動重撥來更改出口IP。大致框架如下:

VPN

注意這裡設定預設閘道器往ADSL出口的時候需要針對原本機IP做策略路由才可以保證網路是通的。

在/etc/iproute2/rt_tables裡面加入101 benji
然後本機策略路由:
/sbin/ip route add default via 原閘道器 dev em1 table benji
/sbin/ip rule add from 原IP table benji

這樣才可以保證ADSL出口不影響原IP的訪問。

3.5 弱網模擬
手遊在弱網環境下的測試也可以用vpn加上tc來模擬,這個在遊戲精細化運維時候有用得上。命令參考如下:

#新增root根
tc qdisc add dev eth0 root handle 1: prio
#配置這個id是丟包30%,上下浮動2%
tc qdisc add dev eth0 parent 1:1 handle 2: netem loss 30% 2%
#或者是延遲500ms,上下浮動20ms
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms 20ms
#然後設定
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 目的IP flowid 2:1
#測試完之後,刪除命令
tc qdisc del dev eth0 root

經過tc的控制,手機網路會控制地非常精準,用來做弱網模擬很不錯。

四、小結

總的來說,經歷過多個vpn之後發現juniper的防火牆提供的vpn是最繁瑣和死板的,還有license限制,pptp/l2tp的最靈活,最後最實用的是同時可以提供多個vpn協議的softethervpn。

VPN給人的印象也不應停留在非法的領域,具體用處還是挺多的,不過儘量不要使用網路上公開的那種vpn,在vpn服務端那裡可能存在各種中間人劫持甚至包括針對https的攻擊。

原文來自微信公眾號:運維軍團