背景
由于我將要把一臺樹莓派放在學校內網掛校內的 PT ,并且這臺樹莓派又是通過路由器接入校園網的,那這樣問題就來了。
假如我不在宿舍,但是我又想連上我的樹莓派看看電影下載完了沒有,那么我是沒有辦法連接上我的樹莓派的。
如果用路由器進行端口映射的話,那么我必須在校園網的網絡環境之中,并且我得知道我路由器的 IP ,由于校園網使用 DHCP 動態獲取IP地址,因此我很難知道我路由器的IP。
如果我在校外的話,那么就基本上沒有什么方法可以訪問到我的樹莓派了。
經過一輪折騰,我發現了 n2n 這個工具。
簡介
以下摘自維基百科并由本人進行人工翻譯。
n2n 是一個開放源代碼的2層跨越3層的VPN程序,該程序利用了點對點的架構來處理網絡間的成員關系和路由。
不像大多數 VPN 程序那樣, n2n 可以連接位于 NAT 路由器后面的計算機。這些連接在雙方計算機都能連接的第三方計算機的幫助下建立起來。這臺第三方的計算機,我們稱之為supernode
,他可以為 NAT 的計算機之間傳輸信息。
這是一個免費的開源軟件,以GNU General Public License v3
協議開源。
準備
由于我們需要自己自建整個 n2n ,因此我們需要一臺有公網固定 IP 地址的服務器來充當supernode
的角色
剛好,前幾天買了一年阿里云的學生機,正愁不知道做什么東西比較好,現在終于能派上用場了。
環境
Supernode:Debian 8.3
Edge:Raspbian 2015.05.05
安裝
如果使用apt-get
或者yum
進行安裝的,由于軟件庫的版本不同,因此可能會出現不兼容的問題。
n2n 有兩種協議,一種是v1
協議,另一種是v2
協議,兩種是不兼容的。
因此,我們最好使用編譯安裝,一開始我還擔心我的樹莓派的小 CPU 編譯不出來,結果還挺快的!
Ubuntu / Debian 系列
sudo apt-get install subversion build-essential libssl-dev
CentOS 系列
sudo yum install subversion gcc-c openssl-devel
不管你是什么系統,下面的代碼都是一樣的,我們使用v2
協議。
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n/n2n_v2
make
sudo make install
如果不出問題的話,我們就安裝成功了。
配置
Supernode 配置
Supernode 并不需要 root 權限就可以運行,不過如果你是想使用小于 1024 的端口,就需要 root 權限了。
運行以下命令即可把supernode
運行在后臺。
supernode -l 12345
更多的用法如下
pi@raspberrypi ~ $ supernode -h
supernode usage
-l Set UDP main listen port to
-f Run in foreground.
-v Increase verbosity. Can be used multiple times.
-h This help message.
Edge 配置
簡單修改并運行以下命令即可運行edge
edge -d edge0 -a 10.0.0.10 -c [community] -k [encrypt key] -u 1000 -g 1000 -l [Supernode IP]:[Supernode Port]
例子
edge -d edge0 -a 10.0.0.10 -c myn2nline -k password123 -u 1000 -g 1000 -l 123.121.22.102:43321
更多的用法如下
pi@raspberrypi ~ $ edge -h
Welcome to n2n v.2.1.0 for unknown
Built on Sep 26 2015 16:11:34
Copyright 2007-09 - http://www.ntop.org
edge -d -a [static:|dhcp:] -c [-k | -K ] [-s ] [-u -g ][-f][-m ]
-l [-p ] [-M ] [-r] [-E] [-v] [-t ] [-b] [-h]
-d | tun device name
-a | Set interface address. For DHCP use ''-r -a dhcp:0.0.0.0''
-c | n2n community name the edge belongs to.
-k | Encryption key (ASCII) - also N2N_KEY=. Not with -K.
-K | Specify a key schedule file to load. Not with -k.
-s | Edge interface netmask in dotted decimal notation (255.255.255.0).
-l | Supernode IP:port
-b | Periodically resolve supernode IP
: (when supernodes are running on dynamic IPs)
-p | Fixed local UDP port.
-u | User ID (numeric) to use when privileges are dropped.
-g | Group ID (numeric) to use when privileges are dropped.
-f | Do not fork and run as a daemon; rather run in foreground.
-m | Fix MAC address for the TAP interface (otherwise it may be random)
: eg. -m 01:02:03:04:05:06
-M | Specify n2n MTU of edge interface (default 1400).
-r | Enable packet forwarding through n2n community.
-E | Accept multicast MAC addresses (default=drop).
-v | Make more verbose. Repeat as required.
-t | Management UDP Port (for multiple edges on a machine).
Environment variables:
N2N_KEY | Encryption key (ASCII). Not with -K or -k.
需要注意的是,-a
參數所指定的是你連接上 n2n 網絡上的 IP 地址,顯然這是不可以重復的。
你可以使用 DHCP 服務器進行分配 IP ,使用-a dhcp:10.0.0.22
意思就是使用10.0.0.22
作為 DHCP 服務器進行 IP 地址的分配,而10.0.0.22
這臺服務器也是需要連接上同一個 Edge 的。
更多的用法你們可以自己參考上面的文檔。
錯誤解決
n2n[4405]: ERROR: ioctl() [Operation not permitted][-1]
在我的樹莓派上面運行的時候出現了上面的問題,顯然這是由于權限不足導致的,因為 edge 需要 root 權限來創建一個 TAP 接口,因此我們需要通過sudo
來運行。
實踐
經過了我的一番折騰,我在手機上安裝了n2n
的客戶端,Google Play
設置好了協議, supernode
的 IP 和端口,設置了組(相當于用戶名),設置了密碼,然后就可以連接了!
這是手機上面的 n2n 客戶端
使用 JuiceSSH 進行本地的ping
測試
10.0.0.10
是我的樹莓派的地址,10.0.0.11
是我手機設置的 IP 地址
最后
如果你們想要開機自動啟動的話,設置/etc/rc.local
就可以。
n2n 是個很好玩的東西,假如你在家里面也有幾臺類似 nas 之類的東西,你在學校也有路由器之類的東西,那么你就可以將他們組成一個內網了,無論在哪里都可以訪問到這幾臺設備了。只需要你在每一天設備上都設置好 edge ,部署在同一個 Supernode 上,并且設置相同的密鑰和community就好了。