《什么是VPN?看運維專家聊聊VPN的那些事兒》要點:
本文介紹了什么是VPN?看運維專家聊聊VPN的那些事兒,希望對您有用。如果有疑問,可以聯系我們。
VPN對各位來說肯定是非常熟悉的,比如在家里加密訪問公司后臺,或者在特殊場景做權限控制,還有就是可以讓移動設備撥vpn之后利用tc做弱網模擬,或者是在國內訪問google服務等,不過聽說google學術已經開始重返中國,以后可以在國內直接訪問到了.
VPN技術可以做的遠不止如此,今天我們來隨便聊聊VPN身邊的那些事情.
我們這里說的VPN主要是關于企業應用常見相關,不涉及到非法跨網.
VPN有很多種,比如Linux上最常用的pptp類型的vpn,稍微復雜點的openvpn,還有學cisco時候實驗用的EASY VPN,還有些看起來高大上的Juniper VPN.
其實遠遠不止這些,在實際環境下如果要兼容各個網絡運營商和終端設備的話,就非常推薦SoftEtherVPN這個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了:
然后在這兩個服務器互相用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 test@127.0.0.1
在目的服務器上運行之后會監聽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個參數,其中就有我們需要的變量信息:
有了這些我們就可以另外寫一個提供復雜邏輯的腳本來給ip-up調用.
比如先在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
曾經這個vpn類型在某些場合很流行,因為看起來比pptp那些高大上些,甚至是可以讓每個用戶必須有專有的證書才可以撥上這個openvpn,需要各種私鑰、公鑰、客戶端,給人一種靠譜的感覺.
有很多經過二次開發的商業化的VPN客戶端也是采用了類似的三層tun虛擬隧道或者tap的虛擬網卡原理來實現內部邏輯.
openvpn也比較靈活,比如可以用auth-user-pass-verify來調用權限控制腳本等,很長一段時間我們也在一些場合下用這個openvpn方案.
不過不打算深入講下去,因為我們之后有更加實用的選擇.
2.5 SoftEtherVPN盒子
這個vpn (地址:https://github.com/SoftEtherVPN/) 是集中了多個vpn協議的軟件,兼容性非常強,有多強呢?看圖:
幾乎是所有類型的終端都可以找到合適的vpn協議來連接這個server.
同時支持用vpncmd命令行管理和客戶端管理:
雖然他提供了很多功能,相當于傻瓜式地自動安裝了,不過有幾點建議:
下面簡單介紹下命令行的使用,因為想要自動化還得靠這個.
#進入命令行管理界面
./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.大致框架如下:
注意這里設置默認網關往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的攻擊.
原文來自微信公眾號:運維軍團
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4287.html