一個傳統的 VPN(如 OpenVPN、PPTP)由一個 VPN 服務器和一個或多個連接到這台服務器的客戶端組成。當任意兩個 VPN 客戶端彼此通信時,VPN 服務器需要中繼它們之間的 VPN 數據流量。這樣一個中心輻射型的 VPN 拓撲結構存在的問題是,當連接的客戶端增多以後,VPN 服務器很容易成為一個性能上的瓶頸。從某種意義上來說,中心化的 VPN 服務器也同樣成為一個單點故障的來源,也就是當 VPN 服務器出現故障的時候,整個 VPN 都將無法被任何 VPN 客戶端訪問。
點對點 VPN(又稱 P2P VPN)是另一個 VPN 模型,它能解決傳統的基於服務器-客戶端模型的 VPN 存在的這些問題。一個 P2P VPN 中不再有一個中心的 VPN 服務器,任何擁有一個公開 IP 地址的節點都能引導其他節點進入 VPN。當連接到一個 VPN 之後,每一個節點都能與 VPN 中的任何其他節點直接通信,而不需要經過一個中間的服務器節點。當然任何節點出現故障時,VPN 中的剩余節點不會受到影響。節點中的延遲、帶寬以及 VPN 擴展性在這樣的設定中都有自然的提升,當你想要使用 VPN 進行多人游戲或者與許多朋友分享文件時,這都是十分理想的。
開源的 P2P VPN 實現已經有幾個了,比如 Tinc、peerVPN,以及 n2n。在本教程中,我將會展示如何在 Linux 上用 n2n 配置點對點 VPN。
n2n 是一個開源(GPLv3)軟件,它允許你在用戶間構建一個加密的 2/3 層點對點 VPN。由 n2n 構建的 VPN 是“對 NAT 友好”的,也就是說,不同 NAT 路由器後方的兩個用戶可以通過 VPN 直接與對方通信。n2n 支持對稱的 NAT 類型,這是 NAT 中限制最多的一種。因此,n2n 的 VPN 數據流量是用 UDP 封裝的。
一個 n2n VPN 由兩類節點組成:邊緣(edge)節點和超級(super)節點。一個邊緣節點是一台連接到 VPN 的電腦,它可能在一個 NAT 路由器後方。一個超級節點則是擁有一個可以公共訪問的 IP 地址的電腦,它將會幫助 NAT 後方的邊緣節點進行初始通信。想要在用戶中創建一個 P2P VPN 的話,我們需要至少一個超級節點。
准備工作
在這篇教程中,我將會創建一個擁有 3 個節點的 P2P VPN:一個超級節點和兩個邊緣節點。唯一的要求是,邊緣節點需要能夠 ping 通超級節點的 IP 地址,而它們是否在 NAT 路由器之後則沒有什麼關系。
在 Linux 上安裝 n2n
若想用 n2n 構建一個 P2P VPN,你需要在每個節點上安裝 n2n,包括超級節點。
由於它非常精簡的依賴需求,在大多數 Linux 平台上 n2n 都能被輕松編譯。
在基於 Debian 的系統上安裝 n2n:
復制代碼代碼如下:$ sudo apt-get install subversion build-essential libssl-dev
$ svn co https://svn.ntop.org/svn/ntop/trunk/n2n
$ cd n2n/n2n_v2
$ make
$ sudo make install
在基於 Red Hat 的系統上安裝 n2n:
復制代碼代碼如下:$ sudo yum install subversion gcc-c++ openssl-devel
$ svn co https://svn.ntop.org/svn/ntop/trunk/n2n
$ cd n2n/n2n_v2
$ make
$ sudo make install
用 n2n 配置一個 P2P VPN
如前文所述,我們需要至少一個超級節點,它將會作為一個初始化引導服務器。我們假設這個超級節點的 IP 地址是 1.1.1.1。
超級節點:
在一個作為超級節點的電腦上運行下面的命令。其中“-l <端口>”指定超級節點的監聽端口。運行 supernode 並不需要 root 權限。
復制代碼代碼如下:$ supernode -l 5000
邊緣節點:
在每個邊緣節點上,使用下面的命令來連接到一個 P2P VPN。edge 守護程序將會在後台運行。
邊緣節點 #1:
復制代碼代碼如下: $ sudo edge -d edge0 -a 10.0.0.10 -c mynetwork -u 1000 -g 1000 -k password -l 1.1.1.1:5000 -m ae:e0:4f:e7:47:5b
邊緣節點 #2:
復制代碼代碼如下:$ sudo edge -d edge0 -a 10.0.0.11 -c mynetwork -u 1000 -g 1000 -k password -l 1.1.1.1:5000 -m ae:e0:4f:e7:47:5c
下面是對命令行的一些解釋:
至此,你應該能夠從一個邊緣節點用 VPN IP 地址 ping 通另一個邊緣節點了。
故障排除
在調用 edge 守護程序的時候得到了如下錯誤。
復制代碼代碼如下:n2n[4405]: ERROR: ioctl() [Operation not permitted][-1]
注意 edge 守護進程需要超級用戶權限來創建一個 TAP 接口。因此需要確定用 root 權限來執行,或者對 edge 命令設置 SUID。之後你總是可以使用“-u”和“-g”選項來降權放棄 root 權限。
總結
n2n 可以成為對你來說非常實用的免費 VPN 解決方案。你可以輕松地配置一個超級節點,無論是用你自己家裡的網絡,還是從雲主機提供商購買一個可以公共訪問的 VPS 實例。你不再需要把敏感的憑據和密鑰放在第三方 VPN 提供商的手裡,使用 n2n,你可以在你的朋友中配置你自己的低延遲、高帶寬、可擴展的 P2P VPN。