1. 程式人生 > >OpenWRT(小米路由器使用系統)組建N2N VPN網路實現內網裝置之間的相互訪問

OpenWRT(小米路由器使用系統)組建N2N VPN網路實現內網裝置之間的相互訪問

http://www.shuyz.com/n2n-vpn-network-introduction-and-config.html

概述

如果要實現裝置的遠端訪問,比如在公司訪問家裡的電腦、路由器、智慧開關等,我們一般會需要一個公網地址,然後將相應埠對映到指定裝置上。隨著IPV4地址的枯竭,有些ISP已經不提供公網IP了,而且即使有公網IP,我們不一定有許可權操作NAT路由的埠對映(比如公司的網路),而且每次重啟路由器這個IP會變化,我們還得等一段時間讓DDNS生效,非常不便。

要是每個裝置固定一個IP地址就好了,讓我們在世界任何地方輸入10.2.5.1這個IP就可以登入家裡的路由、輸入10.2.5.2

就對應家裡的智慧開關、輸入10.2.5.3就登陸自己的Android手機,即使它使用的是行動網路...
注: 上述的10.2.5.X只是一個內網地址的例子,和常見的192.168.1.X是一樣的,使用這個地址段是為了避免N2N地址和常見的內網地址混淆。

N2N就是為此而生的,它是在資料鏈路層實現的一套P2P協議,目的是儘量簡化裝置直接的連線。引用論文中作者的話來說N2N的目的就是:

Is it possible to have decentralised, network-administrator-free, secure and permanent network access with a single/uniform address regardless of the current user’s location, local IP address and network type?
N2N旨在提供去中心化、無需管理、安全、穩定的網路連線,而和使用者的位置、IP地址和網路型別無關。通俗地說就是不需要公網IP、不需要配置NAT、穿透防火牆

N2N的實現具有兩個部分:supernode中心節點和edge邊界節點, 邊界節點通過中心節點找到對方,邊界節點之間建立通訊後,可以直接斷開中心節點,實現點對點的加密通訊。N2N網路的架構圖如下:

n2n

As N2N is a layer two VPN, edge nodes are identified uniquely by a 6 byte MAC address and a 16 byte community name.
N2N的邊界節點通過6位元組的網絡卡MAC地址和16位元組的組織機構名稱唯一標識。

中心節點可以自己建立,也可以使用公開的supernode。由於supernode

只是建立一個類似定址的功能,裝置之間的通訊資料不經過supernode,所以即使使用公開的supernode是安全的。

配置一個N2N網路

這裡建立一個私有的N2N網路,目的是將家裡的電腦、家裡的OpenWrt路由器、Android手機連線到同一個N2N網路上。

準備工作

N2N協議目前有兩個版本,v1和v2版本,這兩個版本是不相容的!也就是說如果一臺裝置使用v1版本,另一臺裝置使用v2版本,那麼這兩臺裝置是不能連線的,請務必注意這一點!
我使用的是v1版本,保守一點總是沒錯的...

公開一個我的N2N中心節點資訊:

  • IP: 104.128.82.194
  • Port: 82
  • Version: N2N v1
    僅供測試,我不能保證該節點長期有效

配置OpenWrt路由器的N2N客戶端

OpenWrt官方軟體源的N2N是v1版本,使用opkg update && opkg install n2n命令安裝 ,安裝完成之後先配置一下自己的N2N網路,編輯/etc/config/n2n這個檔案即可,內容如下:

config edge
        # 給裝置分配一個內網地址
        option ipaddr           '10.2.5.1'
        option supernode        '104.128.82.194'
        option port             '82'
        # 為自己的N2N網路組織機構取個名字,不要和我的一樣
        option community        'shuyz'
        # 其他裝置要使用相同的組織機構名和密碼才能加入
        option key              '123456789'
        option route            '1'

最後加入開機自啟後立即啟動就配置完成了。

/etc/init.d/n2n enable
/etc/init.d/n2n start

配置Windows的N2N客戶端

vpnhosting.cz為Windows寫了一個N2N的GUI客戶端,下載地址在這裡
安裝N2N GUI的時候會自動安裝虛擬網絡卡供edge使用,N2N的設定介面如下,除了IP地址,其他的資訊保持和OpenWrt上配置檔案一樣,然後開啟Advanced配置,選擇Use n2n v1協議,重啟一下軟體生效。

n2n

這時候路由器和電腦就加入同一個N2N網路了,我們在路由器端ping Windows:

[email protected]:~# ping 10.2.5.3
PING 10.2.5.3 (10.2.5.3): 56 data bytes
64 bytes from 10.2.5.3: seq=0 ttl=64 time=1052.175 ms
64 bytes from 10.2.5.3: seq=1 ttl=64 time=525.018 ms
64 bytes from 10.2.5.3: seq=5 ttl=64 time=522.537 ms
64 bytes from 10.2.5.3: seq=6 ttl=64 time=320.722 ms
64 bytes from 10.2.5.3: seq=7 ttl=64 time=422.895 ms
^C
--- 10.2.5.3 ping statistics ---
9 packets transmitted, 5 packets received, 44% packet loss
round-trip min/avg/max = 320.722/568.669/1052.175 ms

上面的測試可以看到網路延時非常嚴重,因為電腦和路由器在同一個區域網。我把路由器拿到公司之後再ping一下家裡的電腦:

[email protected]:~# ping 10.2.5.3
PING 10.2.5.3 (10.2.5.3): 56 data bytes
64 bytes from 10.2.5.3: seq=0 ttl=64 time=7.197 ms
64 bytes from 10.2.5.3: seq=1 ttl=64 time=8.212 ms
64 bytes from 10.2.5.3: seq=2 ttl=64 time=6.667 ms
64 bytes from 10.2.5.3: seq=3 ttl=64 time=8.371 ms
64 bytes from 10.2.5.3: seq=4 ttl=64 time=5.217 ms
64 bytes from 10.2.5.3: seq=5 ttl=64 time=8.936 ms
^C
--- 10.2.5.3 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 5.217/7.433/8.936 ms

由此可見N2N網路在不同公網之間的裝置連線上表現優秀,但在用一個區域網的裝置間很糟糕。

配置Android的N2N客戶端

在Google Play上可以下載到Android的N2N客戶端,點此進入,似乎是國人寫的,功能非常強大。

配置介面:

n2n

配置完成後啟動,可以看到和超級節點的註冊資訊,這時候手機也可以訪問N2N網路的其他裝置了,比如使用行動網路訪問家裡的路由器:

n2n

N2N中心節點的編譯和部署

編譯

svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n && cd n2n_v1
make 

編譯完成之後會生成edgesupernode兩個可執行檔案,可以使用make install命令安裝,或者拷貝到任意目錄執行。

除錯

這裡我們討論伺服器上的supernode,使用方法很簡單:

supernode -l <listening port> [-v] [-h]

測試的時候,建議開啟除錯日誌,比如:

supernode -l 8080 -v

總結

目前網上介紹N2N的文章非常少,但我覺得N2N的應用前景是非常廣泛的,最典型比如物聯網。將N2N協議可以在各種物聯網裝置上實現後,將這些裝置組建成一個N2N網路,這些裝置之間的通訊和互動將變得更加方便,從而實現各種可能。

參考資料