內網穿透、打洞工具有很多,此前在windows上使用的是vidcc這個玩意,也正因為linux不支持。自此在linux嘗試過一些打洞工具,ssh 反向代理這些,因為安全性不便捷等多種原因,最終選擇了n2n。
?
由于初次接觸n2n,對其不是很了解,就此對n2n實現內網穿透打洞過程進行基本表述。
?
2008年,ntop的作者Luca Deri開始研究p2p V**,他一方面看到公眾對p2p V**有著強烈的需求,另一方面又不滿足已有產品的現狀,于是n2n誕生了。
?
?
?
如上圖所示,n2n是一個二層架構的V**網絡,其中super node提供場所,讓兩個位于NAT/防火墻之后的edge node進行會面,一旦雙方完成首次握手,剩下的數據流就之發生在兩個edge node之間,如果有一方的NAT屬于對稱型(symmetrical),super node則還需繼續為雙方提供數據包的轉發;edge node負責數據流的加解密,原理很簡單。
?
至此,我們已經了解,部署n2n至少需要兩臺以上的機器。
?
我們此文采用兩臺centos。
?
centos7(super node) - 150.0.0.1 (公網IP)
?
centos 7(edge node)- 192.168.1.121 (虛擬機內網IP)
?
使用n2n產生的虛擬網段,將為 10.0.0.1 ~ 10.0.0.255
?
安裝n2n
?
無論是edgenode還是supernode 都需要安裝n2n,所以下面安裝方法通用,提供兩種n2n資源,均可。
?
git clone https://github.com/meyerd/n2n.git
?
or
?
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
?
n2n分為v1和v2版本,兩種協議互不兼容。我們選擇v2版本。
?
cd n2n/n2n_v2
?
安裝openssl、cmake、git、gcc、net-
?
yum install -y openssl-devel yum install -y cmake yum install -y net-tools yum install -y git yum install -y gcc gcc-c++
?
編譯安裝n2n
?
mkdir build cd build cmake .. make && make install
?
n2n編譯安裝完,會產生兩個程序指令,edge 和 supernode,欠著是邊緣節點使用(客戶端),后者則是超級節點使用(服務端)。
?
supernode(服務端運行)
?
supernode -l 5000
?
超級節點開啟5000端口進行監聽,以此來提供建交服務。
?
服務端也可以同時當做客戶端使用,將服務端加入到虛擬網絡中。
?
edge -a 10.0.0.10 -c edge0 -k wss -l 150.0.0.1:5000
?
edgenode(客戶端運行)
?
edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000
?
10.0.0.11 這個IP是虛擬網段,其他加入虛擬網絡中的IP地址需要在同一網段,統一key,即wss(可設置為其他)。
?
?
?
此節點已有10.0.0.11這個IP,所在的是n2n創建的虛擬網卡,kill 掉edge 進程則此網卡銷毀。
?
查看edge或者supernode 進程
?
ps -ef|grep supernodeps -ef|grep edge
?
--help
?
?
?
本文提到的重要參數
?
-k wss 通訊私匙,一般不用放在supernode節點,可自行約定edge節點的私匙統一設置。
?
-M 1200 設置mtu
?
-v -f 開啟調試輸出
?
調試
?
使用過程中不免遇到一些奇葩的事,調試是個關鍵,一些大的坑已經為你們踩過了,剩下的基本沒啥問題。
?
1.開啟調試模式
?
記住先kill掉之前的edge 或 supernode進程再進行調試以免沖突。
?
附加參數即可: -v -f
?
edge
?
edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000 -v -f
?
supernode
?
supernode -l 5000 -v -f
?
2.正常使用,節點互相連接不通。
?
如果ping都不通,懷疑是防火墻的問題?測試請先直接關閉防火墻。完畢后,將其恢復,慢慢測試。
?
防火墻放行端口示例:
?
iptables -I INPUT -p tcp --dport 5000 -j ACCEPT iptables -I INPUT -p udp --dport 5000 -j ACCEPT iptables save service iptables restart
?
?
?
2.創建了客戶端,虛擬網卡沒有ip
?
?
?
如果你開啟調試模式了,可能就會看到原來是ifconfig 命令不存在,這個命令在net-tools包里(centos),那么就需要安裝,重新開啟edge即可解決。
?
安裝net-tools
?
yum install -y net-tools
?
手動設置網卡IP(可省略,測試可以使用)
?
ifconfig edge0 10.0.0.11 netmask 255.255.255.0
?
那么,如果這步不成功的話,自然網絡沒有配置建立好,也就無法正常穿透內網。此時如果不開啟調試模式,你也看不到任何錯誤,也就是很多人往往出現的配置好了,卻無法正常訪問,ping都不通,何以解憂。
?
3.ping能通,http和ssh卻不通。
?
設置mtu值即可
?
edge -a 10.0.0.11 -c edge0 -k wss -l 150.0.0.1:5000 -M 1200
?
一般低于1400即可,當前設置1200。(不要忘了kill之前的進程哦)
?
至此,問題基本得以解決。
?
測試
?
10.0.0.10 (supernode、edge) 10不僅是超級節點也是邊緣節點。
?
10.0.0.11(edge)無數邊緣節點中其中一個
?
10 ping 11
?
?
?
11 ping 10
?
?
?
自此,網絡可以互相訪問,暢通無阻。如果你用你自己的電腦,需要將其加入到虛擬網絡中,即可像局域網一樣訪問。
?
windows edge客戶端軟件
?
http://www.V**hosting.cz/n2nguien.exe
?
http://sourceforge.net/projects/n2nedgegui/
?
還要其他版本以及安卓版本,自行搜捕。
?
nginx轉發端口代理映射
?
最后,我們將用nginx轉發下公網IP端口到內網指定ip指定端口,這樣可以讓外界不加入虛擬網絡即可訪問其中的節點機器。
?
用戶客戶端 =》 公網IP(150.0.0.1:6011)=》虛擬內網(10.0.0.11:22)
?
從流程來看,我們的用戶將訪問公網IP的6011端口,可以連接到內網機器10.0.0.11的22端口(ssh)。
?
首先關閉防火墻或放行公網6011端口連接
?
vi /etc/sysconfig/iptables
?
增加
?
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6011 -j ACCEPT
?
?
?
安裝nginx(supernode)
?
詳細請參照此文
?
注意需要轉發tcp數據,編譯時附加參數:--with-stream
?
#安裝編譯支持庫 mkdir /mnt/tools -p cd /mnt/tools yum -y install gcc automake autoconf libtool make yum install gcc gcc-c++#安裝PCRE wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz tar -xzf pcre-8.40.tar.gz -C ./ cd pcre-8.40 ./configure --prefix=/usr/local/pcre make && make install cd ..#安裝zlib wget http://zlib.net/zlib-1.2.11.tar.gz tar -xzf zlib-1.2.11.tar.gz -C ./ cd zlib-1.2.11 ./configure --prefix=/usr/local/zlib make && make install cd ..#安裝openss wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz tar -xzf openssl-1.0.2k.tar.gz -C ./ #注意,這里不需要進行安裝,后面步驟省略。#編譯安裝nginx wget http://nginx.org/download/nginx-1.12.0.tar.gz tar -xzf nginx-1.12.0.tar.gz -C ./ cd nginx-1.12.0./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/nginx \ --conf-path=/usr/local/nginx/nginx.conf \ --pid-path=/usr/local/nginx/nginx.pid \ --with-http_ssl_module \ --with-pcre=/mnt/tools/pcre-8.40/ \ --with-zlib=/mnt/tools/zlib-1.2.11/ \ --with-openssl=/mnt/tools/openssl-1.0.2k/ \ --with-stream#注:cpre、zlib、openssl等依賴包的路徑是解壓的源碼路徑不是安裝后的路徑。make make install
?
編譯安裝完畢后,到nginx目錄。
?
cd /usr/local/nginx/
?
編輯配置nginx.conf
?
stream {log_format proxy '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr" ''"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';access_log /var/log/nginx/tcp-access.log proxy ;open_log_file_cache off;include /usr/local/nginx/conf.d/*.stream; }
?
創建日志目錄
?
mkdir /var/log/nginx/
?
創建模塊配置目錄并進入
?
mkdir /usr/local/nginx/conf.d/ cd /usr/local/nginx/conf.d/
?
新建tcp.stream文件(vi tcp.stream)
?
upstream TCP6011 {hash $remote_addr consistent;server 10.0.0.11:22;}server {listen 6011;proxy_connect_timeout 5s;proxy_timeout 300s;proxy_pass TCP6011;}
?
重載nginx
?
cd ..
?
./nginx -s reload
?
使用putty連接 150.0.0.1:6011 成功連接10.0.0.11
?
?
?
因為是nginx代理請求,所以來源是10.0.0.10而不是直接客戶端。所以流量也會全部走supernode服務器而不直接交互。如果本地也配置到虛擬網絡,即建立連接通過supernode,之后則直接互通。
?
詳細請了解n2n官方,這個項目已經不在維護,但依然在廣泛使用。
?
http://www.ntop.org/n2n/
?
https://sourceforge.net/projects/ntop/files/n2n/
?
https://www.buckhill.co.uk/blog/how-to-enable-broadcast-and-multicast-support-on-amazon-aws-ec2/2