教你用n2n在Linux上配置一個非常實用免費的VPN解決方案
一個傳統的 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
下面是對命令列的一些解釋:
- “-d <介面名>”選項指定了由 edge 命令建立的 TAP 介面的名字。
- “-a <IP地址>”選項靜態地)指定了分配給 TAP 介面的 VPN 的 IP 位址。如果你想要使用 DHCP,你需要在其中一台邊緣節點上配置一台 DHCP 伺服器,然後使用“-a dhcp:0.0.0.0”選項來代替。
- “-c <組名>”選項指定了 VPN 組的名字最大長度為 16 個位元組)。這個選項可以被用來在同樣一組節點中建立多個 VPN。
- “-u”和“-g”選項被用來在建立一個 TAP 介面後降權放棄 root 許可權。edge 守護進程將會作為指定的使用者/組 ID 運行。
- “-k <密鑰>”選項指定了一個由 twofish 加密的密鑰來使用。如果你想要將密鑰從命令列中隱藏,你可以使用 N2N_KEY 環境變數。
- “-l <IP地址:連接埠>”選項指定了超級節點的監聽 IP 位址和連接埠號碼。為了冗餘,你可以指定最多兩個不同的超級節點比如 -l <超級節點 A> -l <超級節點 B>)。
- “-m ”給 TAP 介面分配了一個靜態 MAC 位址。不使用這個參數的話,edge 命令將會隨機產生一個 MAC 位址。事實上,為一個 VPN 介面強制指定一個靜態 MAC 位址是被強烈推薦的做法。否則,比如當你在一個節點上重啟了 edge 精靈的時候,其它節點的 ARP 快取將會由於新產生的 MAC 位址而遭到汙染,它們將不能向這個節點發送資料,直到被汙染的 ARP 記錄被消除。
至此,你應該能夠從一個邊緣節點用 VPN IP 位址 ping 通另一個邊緣節點了。
故障排除
注意 edge 守護進程需要超級使用者權限來建立一個 TAP 介面。因此需要確定用 root 許可權來執行,或者對 edge 命令設定 SUID。之後你總是可以使用“-u”和“-g”選項來降權放棄 root 許可權。
總結
n2n 可以成為對你來說非常實用的免費 VPN 解決方案。你可以輕鬆地配置一個超級節點,無論是用你自己家裡的網路,還是從雲主機供應商購買一個可以公用訪問的 VPS 執行個體。你不再需要把敏感的憑據和密鑰放在第三方 VPN 供應商的手裡,使用 n2n,你可以在你的朋友中配置你自己的低延遲、高頻寬、可擴充的 P2P VPN。
你對 n2n 有什麼想法嗎?請在評論中分享你的觀點。
via: http://xmodulo.com/configure-peer-to-peer-vpn-linux.html
作者:Dan Nanni 譯者:felixonmars 校對:wxy