(建议用这个repo: https://github.com/meyerd/n2n ,它的v2版。这样在mac上,才会编译成功。 如果用这个repo: https://github.com/ntop/n2n,在mac上,编译会失败)
n2n 可以成为对你来说非常实用的免费 VPN 解决方案。你可以轻松地配置一个超级节点,无论是用你自己家里的网络,还是从云主机提供商购买一个可以公共访问的 VPS 实例。你不再需要把敏感的凭据和密钥放在第三方 VPN 提供商的手里,使用 n2n,你可以在你的朋友中配置你自己的低延迟、高带宽、可扩展的 P2P VPN。
n2n 可以成为对你来说非常实用的免费 VPN 解决方案。你可以轻松地配置一个超级节点,无论是用你自己家里的网络,还是从云主机提供商购买一个可以公共访问的 VPS 实例。你不再需要把敏感的凭据和密钥放在第三方 VPN 提供商的手里,使用 n2n,你可以在你的朋友中配置你自己的低延迟、高带宽、可扩展的 P2P VPN。
- 作者:译者: felixonmars来源:Linux中国
一个传统的 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 进行多人游戏或者与许多朋友分享文件时,这都是十分理想的。
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 守护程序的时候得到了如下错误。n2n[4405]: ERROR: ioctl() [Operation not permitted][-1]
注意 edge 守护进程需要超级用户权限来创建一个 TAP 接口。因此需要确定用 root 权限来执行,或者对 edge 命令设置 SUID。之后你总是可以使用“-u”和“-g”选项来降权放弃 root 权限。
总结
n2n 可以成为对你来说非常实用的免费 VPN 解决方案。你可以轻松地配置一个超级节点,无论是用你自己家里的网络,还是从云主机提供商购买一个可以公共访问的 VPS 实例。你不再需要把敏感的凭据和密钥放在第三方 VPN 提供商的手里,使用 n2n,你可以在你的朋友中配置你自己的低延迟、高带宽、可扩展的 P2P VPN。
你对 n2n 有什么想法吗?请在评论中分享你的观点。
--------------------------------
p2p vpn
p2p vpn的基本概念
p2p vpn这个概念的提出,是因为openvpn在数据传输上的一个特性——虚拟链路都是从拨入端到服务器的。例如vpn网关在北美,上海电信的两个人要通讯,数据就要从北美绕一圈。这个特性在多节点打通上无疑很扯,于是催生了很多p2p vpn。他们的基本理念是——尽力从端到端,不成再绕。而且为了解决端到端,顺便得解决NAT问题——也就是带有STUN打洞。
tun模式的三层转发表
先说明一点,大部分p2p vpn都是tun模式。这也很正常,tunnel用的么。但是大家在配置openvpn的时候,不知是否注意过iroute这个指令。为什么会有iroute指令的存在?
tun模式是三层模式,相信大家都有数。也就是说,报文传递的时候只带有三层地址,openvpn也凭借三层地址来找到要转发给谁。这里和普通的网络就显示出区别了——普通网络使用ARP协议来自管理转发规则,而openvpn则是凭借内部写好的转发表。
例如vpn gateway的虚地址是192.168.100.1,节点1是100.5,节点2是100.10。那么节点2发送报文给节点1时,报文大约长这个样子。
192.168.100.10 -> 192.168.100.5
在普通网络中,第一步会查路由表,确定是eth0(虚拟网络是tun0)。然后在上面广播ARP请求,获得MAC地址。最后填写MAC地址,发送报文。但是在tun虚拟网络中,仔细看你的路由表,是不是整个虚网络都被交给了一个叫做100.4之类的奇怪gateway转发?甚至如果你没有打开client-to-client,整个虚网络只有一台可见,这台还是交给这个gateway转发的。
这是因为你到这个奇怪的IP之间还是走ARP过程,但是这个奇怪的IP收到你的报文后,就可以是纯三层过程了。你可以把这个IP视为本地openvpn的化身。openvpn会把你的报文发送到openvpn gateway,然后openvpn gateway再转发给正确的机器。也就是说,openvpn gateway必须知道某个目标IP需要转给哪个节点,物理地址多少,对吧?
作为纯虚网络,知道节点的IP很容易——毕竟是openvpn gateway管理的地址分配过程。但是作为tunnel和多地址打通,这里就有点困难了。例如节点1还有个网段是192.168.80.0/24,节点2还有个网段是192.168.60.0/24,那么如下一个报文从节点2中出去,你让openvpn gateway怎么办?
192.168.60.15 -> 192.168.80.15
你也许会说,我当然有配节点1的网关转给openvpn的拨入端。问题是,这个动作,openvpn的拨入端尚且不知,何况openvpn gateway?于是我们派生了route/iroute这两个指令。
route/iroute表示这个地址段归属于这个节点所有,区别在于route同时修改路由表,而iroute不修改路由表。配合push,可以由服务器端下发指令修改客户端路由表。
p2p vpn也有类似的问题。甚至,由于没有统一配置端,因此连每个节点的虚IP都不能很容易的得到。在配置中必须注意这点。
n2n
n2n的模式比较简单,也比较有局限性。基本分为两个端,supernode和edge。supernode类似于hub,把所有edge拉到一起。edge都是对等的。
supernode:
supernode -l port
edge:
edge -a [address] -c [name] -k [password] -l [supernode:port] -u [userid] -g [groupid]
解释一下。开一个supernode,不用做任何设定。反正supernode也不会持有edge别的信息。edge要设定supernode的ip和端口,然后提交name和password。name和password相同的,就进入同一个虚拟网络。然后自己的虚拟ip是address。最后的userid和groupid必须是数字。主要是因为开tun需要root权限,因此可以在获得完权限后退化成普通用户,以防权限太高。
这里好玩的就是,理论上address可以天南海北,完全不用管路由怎么走。甚至172.16.0.1可以和10.0.0.1通讯(我没实际确认)。因为大家都是看彼此的IP是否经过注册,而不是计算路由表。
但是这里就有个缺点,我看到man文档中只提到address,没提到可以提交一个网段。所以无论我怎么设定,使用三层方案做隧道的时候,n2n是转不过去的。因为他不知道这个网段归哪个节点管。
所以,n2n的p2p模式很便利,但是没法打tunnel(至少我不知道怎么玩)。
tinc
tinc和n2n一样,也是一种p2p vpn。不过好处在于,tinc允许你在一个节点上配置多个网络,因此可以打tunnel。
在配置之前,我先约定两个词。“配置名”和“节点名”。一个配置是接入同一个网络的多个节点,还有他们如何拓扑。节点名就是一个节点的名字。所以,和配置有关的有以下两个。
/etc/tinc/nets.boot: 这里写上想自动启用的配置的名字
/etc/tinc/[configname]: 配置的根路径,以下路径全是相对路径。
配置
下面就是某个配置中的一堆文件。注意这些配置都是配置自己节点的属性信息。
tinc.conf:
Name = [nodename] Device = /dev/net/tun ConnectTo = xxx
tinc-up:
ip link set $INTERFACE up ip addr add [address/32] dev $INTERFACE ip route add [network/mask] dev $INTERFACE
tinc-down:
ip route del [network/mask] dev $INTERFACE ip addr del [address/32] dev $INTERFACE ip link set $INTERFACE down
其中tinc-up会在tinc启动时执行,tinc-down会在tinc关闭时执行,所以两者必须是+x权限。有趣的是,tinc并不管理你的整个启动过程,tinc-up和tinc-down甚至要亲自来管理接口的up和down过程。但是这也给你足够的额权力去执行任何复杂的路由逻辑指令。
hosts
除去上部分外,还有一个很大的hosts目录。里面放满了节点群信息。
hosts/[nodename]:
Address = external ip address Port = external port Subnet = network/mask
其中Address和Port如果没有可以不写。Subnet可以彼此重叠,路由决定逻辑是从小子网到大子网(普通路由表逻辑)
初始化
在配置hosts的时候,我建议每个节点就配置自己的hosts/[nodename]文件,然后执行下面的指令:
tincd -n [name] -K
这个指令会在/etc/tinc/[configname]/rsa_key.priv下生成一个私钥,并且把公钥添加到hosts/[nodename]文件中。最后,在多个node间把彼此的hosts/下的文件一复制,让每个node都拥有其他node的hosts文件,整个网络就完成配置了。
如果你的配置名已经写入nets.boot文件的话,可以用
/etc/init.d/tinc restart
来重启启动整个网络.
related post:
http://briteming.blogspot.com/2016/07/n2n.htmlhttp://briteming.blogspot.com/2015/04/p2p-vpn_16.html
-------------
组建N2N VPN网络实现内网设备之间的相互访问
概述
如果要实现设备的远程访问,比如在公司访问家里的电脑、路由器、智能开关等,我们一般会需要一个公网地址,然后将相应端口映射到指定设备上。随着IPV4地址的枯竭,有些ISP已经不提供公网IP了,而且即使有公网IP,我们不一定有权限操作NAT路由的端口映射(比如公司的网络),而且每次重启路由器这个IP会变化,我们还得等一段时间让DDNS生效,非常不便。
要是每个设备固定一个IP地址就好了,让我们在世界任何地方输入
注: 上述的10.2.5.X只是一个内网地址的例子,和常见的192.168.1.X是一样的,使用这个地址段是为了避免N2N地址和常见的内网地址混淆。
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的目的就是:
N2N的实现具有两个部分:
supernode
中心节点和edge
边界节点, 边界节点通过中心节点找到对方,边界节点之间建立通信后,可以直接断开中心节点,实现点对点的加密通信。N2N网络的架构图如下:
中心节点可以自己建立,也可以使用公开的
supernode
。由于supernode
只是建立一个类似寻址的功能,设备之间的通信数据不经过supernode
,所以即使使用公开的supernode
是安全的。配置一个N2N网络
这里建立一个私有的N2N网络,目的是将家里的电脑、家里的OpenWrt路由器、Android手机连接到同一个N2N网络上。
准备工作
N2N协议目前有两个版本,v1和v2版本,这两个版本是不兼容的!也就是说如果一台设备使用v1版本,另一台设备使用v2版本,那么这两台设备是不能连接的,请务必注意这一点!
我使用的是v1版本,保守一点总是没错的...
我使用的是v1版本,保守一点总是没错的...
公开一个我的N2N中心节点信息:
- IP: s1.shuyz.com
- 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网络了,我们在路由器端ping Windows:
root@MagicBox:~# 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一下家里的电脑:
root@MagicBox:~# 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中心节点的编译和部署
编译
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
cd n2n && cd n2n_v1
make
编译完成之后会生成
edge
和supernode
两个可执行文件,可以使用make install
命令安装,或者拷贝到任意目录运行。调试
这里我们讨论服务器上的
supernode
,使用方法很简单:supernode -l <listening port> [-v] [-h]
测试的时候,建议开启调试日志,比如:
supernode -l 8080 -v
总结
目前网上介绍N2N的文章非常少,但我觉得N2N的应用前景是非常广泛的,最典型比如物联网。将N2N协议可以在各种物联网设备上实现后,将这些设备组建成一个N2N网络,这些设备之间的通信和交互将变得更加方便,从而实现各种可能。
参考资料
- hxihcom, OpenWrt中文应用技术网, (主流VPN技术比较) 无公网IP?远程访问路由?内附详细教程
- Luca Deri, Richard Andrews, N2N: A Layer Two Peer-to-Peer VPN
- vpnhosting.cz, N2n Gui En
---------------
n2n
Edge node
You need to start an edge node on each host you want to connect with the same community.
- become root
- create tun device:
$ tunctl -t tun0
- enable the edge process
$ ./edge -d n2n0 -c mynetwork -k encryptme -u 99 -g 99 -m 3C:A0:12:34:56:78 -a 1.2.3.4 -l a.b.c.d:xyw
or
$ N2N_KEY=encryptme ./edge -d n2n0 -c mynetwork -u 99 -g 99 -m 3C:A0:12:34:56:78 -a 1.2.3.4 -l a.b.c.d:xyw
Once you have this worked out, you can add the
-f
option to make edge detach and run as a daemon.
Note that
-d
, -u
, -g
and -f
options are not available for Windows.Supernode
You need to start the supernode once
./supernode -l 1234 -v
Dropping Root Privileges and SUID-Root Executables (UNIX)
The edge node uses superuser privileges to create a TAP network interface device. Once this is created root privileges are not required and can constitute a security hazard if there is some way for an attacker to take control of an edge process while it is running. Edge will drop to a non-privileged user if you specify the
-u <uid>
and -g <gid>
options. These are numeric IDs. Consult /etc/passwd
.
You may choose to install edge SUID-root to do this:
- Become root
chown root:root edge
chmod +s edge
- done
Any user can now run edge. You may not want this, but it may be convenient and safe if your host has only one login user.
Running As a Daemon (UNIX)
Unless given
-f
as a command line option, edge will call daemon(3) after successful setup. This causes the process to fork a child which closes stdin, stdout and stderr then sets itself as process group leader. When this is done, the edge command returns immediately and you will only see the edge process in the process listings, eg. from ps or top.
If the edge command returns 0 then the daemon started successfully. If it returns non-zero then edge failed to start up for some reason. When edge starts running as a daemon, all logging goes to syslog daemon.info facility.
IPv6 Support
n2n supports the carriage of IPv6 packets within the n2n tunnel. N2n does not yet use IPv6 for transport between edges and supernodes.
To make IPv6 carriage work you need to manually add IPv6 addresses to the TAP interfaces at each end. There is currently no way to specify an IPv6 address on the edge command line.
eg. under linux:
on hostA:
[hostA] $ /sbin/ip -6 addr add fc00:abcd:1234::7/48 dev n2n0
on hostB:
[hostB] $ /sbin/ip -6 addr add fc00:abcd:1234::6/48 dev n2n0
You may find it useful to make use of tunctl from the uml-utilities package. Tunctl allow you to bring up a TAP interface and configure addressing prior to starting edge. It also allows edge to be restarted without the interface closing (which would normally affect routing tables).
Once the IPv6 addresses are configured and edge started, IPv6 neighbor discovery packets flow (get broadcast) and IPv6 entities self arrange. Test your IPv6 setup with ping6 - the IPv6 ping command.
Performance Notes
The time taken to perform a ping test for various ciphers is given below:
Test:
ping -f -l 8 -s 800 -c 10000 <far_edge>
AES (-O0) 11820 TF (-O0) 25761
TF (-O2) 20554
AES (-O3) 12532 TF (-O3) 14046 NULL (-O3) 10659
(C) 2007-2010 - Luca Deri deri@ntop.org and Richard Andrews andrews@ntop.org
from https://github.com/ntop/n2n
---------
TPLINK注册用户后可以利用路由器动态DNS(DDNS)功能将固定IP地址绑定在用户名的网址上, 例如 username.tpddns.cn, 或者用内置的花生壳的功能也可以绑定在某个网址上. 通过最后的端口映射, 就是将局域网内某台电脑的分配IP固定起来后, 将其某个端口和这个公网IP的端口绑定, 外网访问该公网IP的端口就可以相当于和局域网某电脑通讯.
另外路由器还有一个功能叫DMZ主机, DMZ主机又叫对外网络(边界网络)主机, 其物理上处于局域网内网(例如路由器内), 所有端口可被外网访问, 而通过在DMZ主机上设置端口转发, 外网也能和局域网内其余主机通讯. DMZ主机可以被外网和内网访问. 严格的DMZ主机是无法直接访问内部网络的, 和内部网络分开, 保证了安全性. 但路由器的DMZ主机往往是以一种简单的方法将所有端口转发到另外的防火墙或NAT设备上。由于本路由器被NAT了, 因此这个DMZ功能也自然被NAT了.
---------
P2P网络-n2n穿墙
今天想把家里的网络弄成能在外部开放, 想利用路由器的DDNS和虚拟服务器功能来构建一个能在公网访问的功能. 然而, 多次尝试后不成功.TPLINK注册用户后可以利用路由器动态DNS(DDNS)功能将固定IP地址绑定在用户名的网址上, 例如 username.tpddns.cn, 或者用内置的花生壳的功能也可以绑定在某个网址上. 通过最后的端口映射, 就是将局域网内某台电脑的分配IP固定起来后, 将其某个端口和这个公网IP的端口绑定, 外网访问该公网IP的端口就可以相当于和局域网某电脑通讯.
- 新版TPLINK DDNS设置官方教程
- 旧版TPLINK界面 端口映射(虚拟服务器)教程. 新版类似,也就是在应用里的虚拟服务器功能里面同样设置两个端口和本地局域网IP,协议
另外路由器还有一个功能叫DMZ主机, DMZ主机又叫对外网络(边界网络)主机, 其物理上处于局域网内网(例如路由器内), 所有端口可被外网访问, 而通过在DMZ主机上设置端口转发, 外网也能和局域网内其余主机通讯. DMZ主机可以被外网和内网访问. 严格的DMZ主机是无法直接访问内部网络的, 和内部网络分开, 保证了安全性. 但路由器的DMZ主机往往是以一种简单的方法将所有端口转发到另外的防火墙或NAT设备上。由于本路由器被NAT了, 因此这个DMZ功能也自然被NAT了.
为了解决NAT的问题, 办法就是实现NAT穿透, 也就是内网穿透(NAT-DDNS). 花生壳提供新花生壳软件穿透, 也提供如花生棒来实现硬件穿透, 当然, 也就不是免费的罗(即使免费肯定也一堆限制). 另一个办法就是申请固定IP而不是NAT的IP, 但这也是要额外收费的…看到知乎上一个帖子如何远程登录家里的Ubuntu电脑(命令行模式)?, 里面提到另一种策略: P2P(peer-to-peer)的穿网. 另外有一种类似的, 通过第三方来进行通讯转发实现的策略. 这类都属于 TCP hole punching:
TCP hole punching实现内网穿透.
ZeroTier 提供一个公网群, 任何计算机可以连接进去再和别的计算机直接沟通起来. 如果安全性不考虑的话, 还是很方便好用的, 也可以创建网络, 免费可以支持最多100设备连入(足够使用了吧…). 如果不是大公司, 这个方法基本就是免费咯. 但缺点就是毕竟有第三方, 所以不确认是否完全安全. 支持多个平台(win,osx,linux,ios,安卓), 客户端开源. 有空试用一下~ 因为我自己在外面有VPS, 所以使用N2N自己搭建更加安全些.
好了, 开始介绍这个N2N技术.
2008年,ntop的作者Luca Deri推出全新p2p VPN产品 – N2N。相对于hamachi,n2n最大的优势在于:
n2n工作原理是如下图, 服务器端中心节点(
源代码和程序可以从其github库和官方svn库获得.
这个东东分两个版本, 两个版本核心处理不同, 因此不通用, 用apt安装的是1.x版本, 所以推荐客户端和服务器端都使用1.x版本.
如果使用sudo apt来安装, 安装后有
PS:
缺点是, 由于太旧了, 我在ubuntu16上面编译n2n_v2后的
Github上也有一些老的库是folk的SVN版本. 可自行搜索.
另外, 官方还有以下一篇BlogHow to enable broadcast and multicast support on Amazon (AWS) EC2介绍安装使用n2n. 里面和传统做法不同的是, 取消了内容加密(n2n_v2下
对于Unix类系统, 使用github这个库编译安装问题并不大. 问题在于Window版本.
在市面上流行的window n2n客户端(包括n2nedgegui 和 n2nguien)使用的都是内核为官方旧版的n2n edge, 如果使用github上最新版编译的supernode和旧版的进行通信, edge 会die掉, 无法进行通信. 因此, 如果使用github新版本编译的supernode作服务中心, 那么window上客户端也需要重新编译edge版本.
下载新版本的源代码. 解压后得到n2n-master 文件夹. 再在该文件夹下操作. 这里以n2n_v2 为例. 官方的安装说明可以参考这里
第一步, 很重要, 安装cmake. 这里根据自己需求来下载啦, 例如CMAKE-V3.6.2 的32位win版本安装器点这里. 这里注意, 必须要先卸载掉旧版本的cmake才能安装新版本. 如果使用VS编译, 可以使用64位的cmake, 这里我主要使用mingw, 所以采用32位.
第二部, 采用编译工具编译, 例如Visual Studio或者Mingw.
VS由于我个人不太喜欢 (太大启动太慢), 所以电脑没有安装, 因此就没有测试, 官方以VS 2010版本的为例:
这里重点使用mingw, 这里和官方安装指导方法不同.
第二步, 直达文件夹. 默认下右键打开的shell是到
在最后一行, 注释掉
这里介绍在苹果系统里的安装:
经研究, 即使关闭那个10.11新的System Integrity Protection (SIP)服务 (重启
在
最后只能卸载咯..
Ubuntu参考手册: supernode - n2n supernode daemon
配置服务器端的背景服务 (自己仿改的, 需要自己修改SNPORT端口部分, 貌似那些stop什么的不好使..停掉就
更新:请勿参考!! 另外, 可以参考附录1, 创建这个
不喜欢创建的话, 可以找一些公共中心节点也是可以的(理论上也是安全的, 但有时候udp打动不通会通过supernode来转发, 那就不知道咯), 例如
服务器端命令是比较简单的, 但如果想要获得服务运行的信息, v1和v2是不同的, v2 中只有加入
具体常用到的选项有:
-l : supernode的IP和端口, 格式是
这个配置文件和下面的网上流行的openwrt配置文件不太一样, 因为我没有这种路由器不太方便调试, 上述是本人的ubuntu16的配置.
好了, 现在只要
要永久开启服务, 就用
除了使用服务, 还可以直接用命令行运行 (如果报错, 检查是否之前开了服务, 先
或者避免密码显露使用
这时会出现大量通信信息. 更多参数可以参考Ubuntu参考手册: edge - n2n edge node daemon
另外可以将信息保存在类似于上面的
如果服务器端/客户端都在一个内网, 反而ping值会很卡… 通过公网连接会好很多. 如果连接特别慢可以把MTU调到1300 (编辑
在不同的主机配置好edge客户端后, 就可以
启动后, 可以
界面图形化, 比之前的配置就是
安卓客户端可以去google play搜索n2n 来安卓下载: google play 下载
这些图形界面的配置介绍可以参考ref 1.
v2也是可以正常使用的。tuntaposx我是下下来编译的,然后禁用了kext signature check。默认安装没有测试是否可行。
-----------------------------
http://www.fuphp.cn/linux/1284.html
http://blog.csdn.net/yetyongjin/article/details/7419894
-------------------
相关帖子:http://briteming.blogspot.de/2016/07/n2n.html
TCP hole punching实现内网穿透.
- P2P策略: 直接将两台主机连接通信, 不通过第三方中介. 例如这里介绍的N2N, 以及ZeroTier
- 第三方中介策略: 利用第三方将两个网络接入后通信, 例如TeamViewer, VPN(两个网络都接入同一个VPS的VPN), ngrok.comn. ngrok就是其网站服务器作为第三方, 提供端口绑定不同计算机不同端口, 就是端口对端口, 觉得不安全也可以通过自己构建服务器.
ZeroTier 提供一个公网群, 任何计算机可以连接进去再和别的计算机直接沟通起来. 如果安全性不考虑的话, 还是很方便好用的, 也可以创建网络, 免费可以支持最多100设备连入(足够使用了吧…). 如果不是大公司, 这个方法基本就是免费咯. 但缺点就是毕竟有第三方, 所以不确认是否完全安全. 支持多个平台(win,osx,linux,ios,安卓), 客户端开源. 有空试用一下~ 因为我自己在外面有VPS, 所以使用N2N自己搭建更加安全些.
好了, 开始介绍这个N2N技术.
2008年,ntop的作者Luca Deri推出全新p2p VPN产品 – N2N。相对于hamachi,n2n最大的优势在于:
- 开源,任何人都可以检查代码,看看是否有猫腻,而hamachi是闭源的,LogMeIn是否会截获密钥不得而知,一旦截获密钥,就可以对流经hamachi服务器的数据包进行解码。n2n的加解密过程由edge node实现,只有两端的用户知道协商好的共享密钥,super node无从知晓。
- 灵活性,n2n允许用户在Internet上自行创建super node,也可以利用任何一个公开的super node。hamachi用户则必须登录到LogMeIn服务器才能创建隧道。
n2n工作原理是如下图, 服务器端中心节点(
supernode
) 用于交流, 相当于一个”路由器”, 而边界节点(edge
)就是每一台在网络中(可以是内网中)的主机.
edge通过和supernode沟通后, 进入某个组的”局域网”, 当有同”局域网”(同组)的主机进行连接时, 两台主机就直接连接起来,
就像局域网内的两台主机一样. 在两台主机连接后, supernode任务完成, edge断开中心节点, 实现P2P的加密通信.
因此supernode并不参与两台主机间直接通信, 只是起到媒人的作用.源代码和程序可以从其github库和官方svn库获得.
这个东东分两个版本, 两个版本核心处理不同, 因此不通用, 用apt安装的是1.x版本, 所以推荐客户端和服务器端都使用1.x版本.
PS: 不同发布版本的 n2n 可能也不通用. 所以要使 n2n 能成功, 第一要素是使用同一版本v1/v2 的n2n, 另一要素是使用相同发行版的n2n, 后面会提到
安装
APT傻瓜式安装
最简单ubuntu安装方法是:sudo apt install n2n
/usr/bin/supernode
和 /usr/sbin/edge
两个文件新生产, 且生成两个相关文件 /etc/default/n2n
和 /etc/init.d/n2n
, 前者是配置参数, 后者是服务文件.PS:
- 使用apt安装的版本是 n2n v.1.3.2 for x86_64 (2016.9.19)
- 使用apt安装的版本编译时间是2014年, 对后面的Window下GUI客户端兼容
- 使用apt安装, 在我测试的vps中的Ubuntu14并没有自动加载服务的东东, 而自己安装的Ubuntu16上具有
源码安装 from SVN
另外也可以svn或github获得源码来安装. 官方的提供原处是SVN库. SVN库版本是官方发布版, 对市面上的GUI客户端兼容较好.缺点是, 由于太旧了, 我在ubuntu16上面编译n2n_v2后的
edge
不能正常使用. 如果你能正常编译后, 使用./edge --help
没有出现segmentation fault, 那恭喜你~sudo apt-get install subversion cmake build-essential libssl-dev
svn co https://svn.ntop.org/svn/ntop/trunk/n2n
## or use github
# git clone https://github.com/meyerd/n2n.git
cd n2n/n2n_v2
make
### If you want to install it to /usr/bin, use following
# sudo make install
另外, 官方还有以下一篇BlogHow to enable broadcast and multicast support on Amazon (AWS) EC2介绍安装使用n2n. 里面和传统做法不同的是, 取消了内容加密(n2n_v2下
Makefile
中修改为N2N_OPTION_AES=no
)和内容压缩(n2n_v2下n2n.h
中修改为#define N2N_COMPRESSION_ENABLED 0
). 不知道取消加密和压缩后能不能解决上述问题, 但不推荐这样做, 不安全且流量大.从github下载安装v2版本
meyerd的库是有更新的, 里面修正得也更好, n2n_v2 在 Ubuntu16中使用gcc5+ 编译也没问题. 因此强烈推荐.git clone https://github.com/meyerd/n2n.git
### for fatal error: openssl/aes.h: No such file or directory : to install libssl-dev
sudo apt install cmake libssl-dev
cd n2n/n2n_v2
mkdir build
cd build
cmake -build . ..
make
# Install tunctl to create virtual tun device
sudo apt install uml-utilities
sudo tunctl -t tun0
./edge -d n2n0 -c community -k encryptme -u 99 -g 99 -m MAC_address_01:02:03:04:05:06 -a 10.1.2.1 -l 88.86.108.50:86
# 2N_KEY=encryptme ./edge -d n2n0 -c community -u 99 -g 99 -m MAC_address_01:02:03:04:05:06 -a 10.1.2.1 -l 88.86.108.50:82
在市面上流行的window n2n客户端(包括n2nedgegui 和 n2nguien)使用的都是内核为官方旧版的n2n edge, 如果使用github上最新版编译的supernode和旧版的进行通信, edge 会die掉, 无法进行通信. 因此, 如果使用github新版本编译的supernode作服务中心, 那么window上客户端也需要重新编译edge版本.
Window下源码安装编译n2n
我这里使用的是github 新版本的n2n, 更稳定.下载新版本的源代码. 解压后得到n2n-master 文件夹. 再在该文件夹下操作. 这里以n2n_v2 为例. 官方的安装说明可以参考这里
第一步, 很重要, 安装cmake. 这里根据自己需求来下载啦, 例如CMAKE-V3.6.2 的32位win版本安装器点这里. 这里注意, 必须要先卸载掉旧版本的cmake才能安装新版本. 如果使用VS编译, 可以使用64位的cmake, 这里我主要使用mingw, 所以采用32位.
第二部, 采用编译工具编译, 例如Visual Studio或者Mingw.
VS由于我个人不太喜欢 (太大启动太慢), 所以电脑没有安装, 因此就没有测试, 官方以VS 2010版本的为例:
C:\n2n> mkdir build
C:\n2n> cd build
C:\n2n\build> cmake -G "Visual Studio 10" --build .\ ..\
-- Check for working C compiler using: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 10
-- Check for working CXX compiler using: Visual Studio 10 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/n2n/build
- 先安装好mingw, 下载后是GUI安装器(很小), 运行后会先安装
mingw-get
用于安装组件, 随后会让你选择要安装的内容. 确保安装mingw-basse和gcc-g++等也就够了. 这个缺了的话还是可以通过安装器再次安装和更新的. - 运行mingw中msys的bash shell, 例如默认安装位置下是
C:\MinGW\msys\1.0\msys.bat
. 推荐创建桌面快捷方式. - 尝试运行cmake, 直接敲
cmake
回车. 如果已经安装cmake还说没有, 请将cmake路径加入到搜索路径当中 (右键我的电脑, 属性, 高级系统设置, 环境变量, 双击编辑用户变量中的PATH, 加入cmake路径(例如32位是C:\Program Files (x86)\CMake\bin
)). 请确保解决cmake可以直接执行. - 跑到解压后的n2n_v2 文件夹, 例如
cd /c/Users/Username/Desktop/n2n/n2n_v2
. 或者更简单使用下面msys here的方法到达文件夹. - 执行
cmake -G "MSYS Makefiles" --build ./ ../
, 使用MSYS编译链配置来进行cmake编译. (网上有说用MINGW Makefiles, 但我试过失败, 参见最后的附录部分). 如果成功的话有下面类似的配置编译内容. 完成后make
来编译, 并./edge --help
来测试一下即可.
$ cmake -G "MSYS Makefiles" --build ./ ../
-- The C compiler identification is GNU 5.3.0
-- The CXX compiler identification is GNU 5.3.0
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) at CMakeLists.txt:95 (add_executable):
# Policy CMP0037 is not set: Target names should not be reserved and should
# match a validity pattern. Run "cmake --help-policy CMP0037" for policy
# details. Use the cmake_policy command to set the policy and suppress this
# warning.
# The target name "test" is reserved or not valid for certain CMake features,
# such as generator expressions, and may result in undefined behavior.
This warning is for project developers. Use -Wno-dev to suppress it.
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/zhaozx/Desktop/n2n-master/n2n_v2/build
PS : 配置右键可以运行msys的shell并转到该文件夹目录:第一步, 创建一个文件txt, 改名例如叫msys.reg. 一定要
.reg
作后缀. 编辑文件内容(右键编辑), 黏贴以下内容并保存后, 双击加载该注册表文件即可将msys here加入右键.Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\Background\shell\msys]
@="Open msys Here"
[HKEY_CLASSES_ROOT\Directory\Background\shell\msys\command]
@="C:\\MinGW\\msys\\1.0\\msys.bat"
~
用户目录下. 要修改其配置文件(默认安装时位置): C:\MinGW\msys\1.0\etc\profile
在最后一行, 注释掉
cd "$HOME"
为#cd "$HOME"
. OK, enjoy.Mac
在10.10 Yosemite和10.9的系统应该没问题 (10.10 我测试成功过). 经测试 (2016.10.25), 暂时Mac不能在El Capitan正常使用edge.这里介绍在苹果系统里的安装:
- 装上 brew (自行百度)
- 复制github源码
git clone https://github.com/meyerd/n2n.git
- 安装 openssl 安全通讯:
brew install openssl
- 编辑
n2n_v2/CMakeLists.txt
文件, 找到set(CMAKE_C_FLAGS
和set(CMAKE_CXX_FLAGS
两行 - 在这两行的里面括号里面的部分, 加入编译参数
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
- 在 n2n_v2 创建 build 文件夹,
cmake ..
来创建Makefile, 然后make
brew cask install tuntap
安装tuntaposx./edge -c community -k passwd -l 12.34.56.78:86 -a 10.2.2.22
尝试连接一下. 如果成功, 可以复制cp ./edge /usr/local/bin
后续可以参考Ubuntu等的执行教程.
edge
的时候, 始终无法创建虚拟网卡 : ERROR: Unable to open tap device. 这个问题在Yosemite里面可以通过安装tuntaposx来实现 (上述过程直接brew cask install tuntap
安装), 但是只支持10.9和10.10, 不支持10.11的El Capitan.经研究, 即使关闭那个10.11新的System Integrity Protection (SIP)服务 (重启
cmd+R
进入网络恢复, 然后命令行输入csrutil disable
), 依然不行, 尝试启动tuntaposx的扩展服务, 报错:$ sudo ifconfig tap0 up
$ ifconfig: interface tap0 does not exist
$ sudo ifconfig tap0 create
$ ifconfig: SIOCIFCREATE2: Invalid argument
/dev/tap0
里是有tap0道15, tun0到15的, 但是却依然不识别. 再进一步考察, 其实是以下两个kext并没有真正加载/Library/Extensions/tap.kext
/Library/Extensions/tun.kext
# Check the shasum of installed files.
find /Library/Extensions/{tap,tun}.kext/ -type f | xargs shasum
# Load the kext
/sbin/kextload /Library/Extensions/tap.kext
…. *.kext failed to load - (libkern/kext) not privileged tuntap最后确认是作者并没有在新系统对程序进行签名所导致..
最后只能卸载咯..
brew cask uninstall --force tuntap
# Delete the installed file if it exists.
sudo rm -rf /Library/Extensions/tap.kext
sudo rm -rf /Library/Extensions/tun.kext
sudo rm -rf /Library/LaunchDaemons/net.sf.tuntaposx.tap.plist
sudo rm -rf /Library/LaunchDaemons/net.sf.tuntaposx.tun.plist
配置服务器端
安装好后, 直接运行supernode -l port
就可以了, port就是服务器端口号, 就是后面用的822. 如果要详细信息就用-v
选项.Ubuntu参考手册: supernode - n2n supernode daemon
配置服务器端的背景服务 (自己仿改的, 需要自己修改SNPORT端口部分, 貌似那些stop什么的不好使..停掉就
ps -ef | grep supernode
再手动kill吧..)更新:请勿参考!! 另外, 可以参考附录1, 创建这个
supernode
可执行文件, 放到/etc/init.d/supernode
, 然后sudo update-rc.d supernode defaults
就可以创建各种级别服务了
开启服务: sudo service supernode start
. 但貌似还是有点问题.不喜欢创建的话, 可以找一些公共中心节点也是可以的(理论上也是安全的, 但有时候udp打动不通会通过supernode来转发, 那就不知道咯), 例如
remoteqth.com:82
. 不过可能由于版本问题, 时间问题等原因, 很多都挂了. 最好还是自己搭建吧.服务器端命令是比较简单的, 但如果想要获得服务运行的信息, v1和v2是不同的, v2 中只有加入
-f
选项才能获得运行信息. 以下是v2版本, 创建一个可执行sh文件来背景运行supernode.#! /bin/bash
/usr/bin/nohup /home/user/n2n/n2n_v2/build/supernode -l 86 -v -f > /home/user/supernode.log 2>&1 &
配置客户端
客户端的核心程序是edge. 该程序在n2n_v1和v2两个版本里除了核心不同外, 其余运行基本相同. 除了一个-f
选项差异.- 在v1里,
-f
选项用于背景运行程序. 没有输出. 要看输出, 不要-f即可, - 在v2里,
-f
选项用于取消背景运行. v2的edge默认是背景运行的. 要看输出就要-f
选项
-d
来指定虚拟网卡, -u, -g
来指定执行用户和组ID. 参考下面两个版本的参数:$ hom@localhost:~$ ~/n2n/n2n_v2/build/edge --help
# Welcome to n2n v.2.1.0 for Linux-2.6.32-042stab108.2
# Built on Sep 18 2016 12:48:29
# Copyright 2007-09 - http://www.ntop.org
#
# edge -d <tun device> -a [static:|dhcp:]<tun IP address> -c <community> [-k <encrypt key> | -K <key file>] [-s <netmask>] [-u <uid> -g <gid>][-f][-m <MAC # address>]
# -l <supernode host:port> [-p <local port>] [-M <mtu>] [-r] [-E] [-v] [-t <mgmt port>] [-b] [-h]
#
# -d <tun device> | tun device name
# -a <mode:address> | Set interface address. For DHCP use '-r -a dhcp:0.0.0.0'
# -c <community> | n2n community name the edge belongs to.
# -k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>. Not with -K.
# -K <key file> | Specify a key schedule file to load. Not with -k.
# -s <netmask> | Edge interface netmask in dotted decimal notation (255.255.255.0).
# -l <supernode host:port> | Supernode IP:port
# -i <local_ip> | Add local ip to bypass between same nat problem
# -b | Periodically resolve supernode IP
# : (when supernodes are running on dynamic IPs)
# -p <local port> | Fixed local UDP port.
# -u <UID> | User ID (numeric) to use when privileges are dropped.
# -g <GID> | Group ID (numeric) to use when privileges are dropped.
# -f | Do not fork and run as a daemon; rather run in foreground.
# -m <MAC address> | Fix MAC address for the TAP interface (otherwise it may be random)
# : eg. -m 01:02:03:04:05:06
# -M <mtu> | 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.
$ ./edge.exe --help
# Welcome to n2n v.2.1.0 for Windows
# Built on Sep 19 2016 19:48:54
# Copyright 2007-09 - http://www.ntop.org
#
# edge -a [static:|dhcp:]<tun IP address> -c <community> [-k <encrypt key> | -K <key file>] [-s <netmask>] [-m <MAC address>]
# -l <supernode host:port> [-p <local port>] [-M <mtu>] [-r] [-E] [-v] [-t <mgmt port>] [-b] [-h]
#
# -a <mode:address> | Set interface address. For DHCP use '-r -a dhcp:0.0.0.0'
# -c <community> | n2n community name the edge belongs to.
# -k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>. Not with -K.
# -K <key file> | Specify a key schedule file to load. Not with -k.
# -s <netmask> | Edge interface netmask in dotted decimal notation (255.255.255.0).
# -l <supernode host:port> | Supernode IP:port
# -i <local_ip> | Add local ip to bypass between same nat problem
# -b | Periodically resolve supernode IP
# : (when supernodes are running on dynamic IPs)
# -p <local port> | Fixed local UDP port.
# -m <MAC address> | Fix MAC address for the TAP interface (otherwise it may be random)
# : eg. -m 01:02:03:04:05:06
# -M <mtu> | 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.
-l : supernode的IP和端口, 格式是
IP:port
-a : 客户端在虚拟局域网中的IP
-c : 虚拟局域网名
-k : 密码
-f : v1中为背景运行, v2中为取消背景运行. win下没有该选项.
-m : 可选, 指定物理mac地址, 为了固定mac地址.UBuntu 客户端配置
编辑配置文件:vi /etc/default/n2n
:- 网络组名
N2N_COMMUNITY
, 相连的主机要在同一个组 - 沟通密码
N2N_KEY
, 要能连接两个主机必须用相同的组名和密码 - 服务器端IP和端口:
N2N_SUPERNODE
和N2N_SUPERNODE_PORT
, 这个和服务器端设置的端口和服务器的IP一致 - 该主机在网络中的IP:
N2N_IP
每台主机设置不同的IP才可以, 用于区分不同主机 N2N_EDGE_CONFIG_DONE
该行要去注释, 去掉以后就可以用/etc/init.d/n2n
来开启服务, 否则不能使用服务.
# Config file for the n2n edge node daemon.
# Sets the n2n community name. All edges within the same community appear on
# the same LAN (layer 2 network segment). Community name is 16 bytes in length.
N2N_COMMUNITY="Ubuntu_n2n_Groupname"
# Sets the twofish encryption key from ASCII text. All edges communicating must
# use the same key and community name.
N2N_KEY="Your_password"
# Sets the n2n supernode IP address and port to register to.
N2N_SUPERNODE="12.34.56.78"
N2N_SUPERNODE_PORT="822"
# Sets the n2n virtual LAN IP address being claimed. This is a private IP
# address. All IP addresses in an n2n community typical belong to the same /24
# net‐ work (ie. only the last octet of the IP addresses varies).
N2N_IP="10.1.2.2"
N2N_DAEMON_OPTS=""
# Uncomment this to get edge node started.
N2N_EDGE_CONFIG_DONE="yes"
#TODO
# add routing option
# sudo ip route add 192.168.1.0/24 via 10.1.2.1
好了, 现在只要
sudo service n2n start
就可以开启客户端的服务了. stop
/restart
都是支持的.要永久开启服务, 就用
sudo sysv-rc-conf
来配置2345项开启就好了. 不明白sysv-rc-conf可搜索一下。除了使用服务, 还可以直接用命令行运行 (如果报错, 检查是否之前开了服务, 先
sudo service n2n stop
):sudo edge -a 10.1.2.2 -c Ubuntu_n2n_Groupname -k Your_password -l 12.34.56.78:822
或者避免密码显露使用
$N2N_IP=Your_password sudo edge -a 10.1.2.2 -c Ubuntu_n2n_Groupname -l 12.34.56.78:822
这时会出现大量通信信息. 更多参数可以参考Ubuntu参考手册: edge - n2n edge node daemon
另外可以将信息保存在类似于上面的
/etc/default/n2n
文件里, 然后source /etc/default/n2n
export N2N
/usr/sbin/edge -f -a $N2N_IP -c $N2N_COMMUNITY -l $N2N_SUPERNODE:$N2N_SUPERNODE_PORT -u $(id -u nobody) -g $(id -g nobody)
/etc/init.d/n2n
修改 ifconfig edge0 mtu 1300 #修改MTU为1300
). MTU是最大传输单元, 就是每个包的大小.在不同的主机配置好edge客户端后, 就可以
ping 10.1.2.3
去看看是否相通 (这里面可能要等一会儿才能通)启动后, 可以
ifconfig
发现多了一个”网卡”:edge0 Link encap:Ethernet HWaddr aa:aa:aa:aa:aa:aa
inet addr:10.1.2.2 Bcast:10.1.2.255 Mask:255.255.255.0
inet6 addr: 1111::1111:1111:1111:1111/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1400 Metric:1
RX packets:140 errors:0 dropped:0 overruns:0 frame:0
TX packets:145 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:17251 (17.2 KB) TX bytes:21087 (21.0 KB)
openwrt 客户端配置(没经测试)
# 安装
opkg install http://downloads.openwrt.org/snapshots/trunk/brcm63xx/packages/n2n_3875-1_brcm63xx.ipk
# 编辑配置文件
root@Openwrt:~# cat /etc/config/n2n
config edge
option ipaddr '10.111.11.1'
option supernode '12.34.56.78'
option port '82'
option community '你自己建立的组'
option key '密码'
option route '1'
# 开启服务
root@Openwrt:/home# /etc/init.d/n2n start
Window/Android 客户端配置
去下载 n2nedgegui 或者 n2nguien: http://www.vpnhosting.cz/n2nguien.exe. (都是vpnhosting.cz 开发, 前者使用SF托管的, 经测试是n2n_v2的, 使用v1版supernode不能通, 后者可以在Advanced里面设置为n2n_v1从而解决问题,如果用n2n_v1请使用后者)界面图形化, 比之前的配置就是
Advanced
多了一个版本选择(记得服务器,各个edge都要版本一致)使用自己编译的edge这很重要. 由于supernode可能使用不同发行版本, 因此会出现edge崩溃的问题. 而上述GUI的客户端都是使用某个旧版本编译出来的, 使用GITHUB上的新代码注定崩. 因此可以参考上面的Window下安装方法编译出来的
edge.exe
去替换掉GUI版本里相应的edge.exe文件. 这里, n2nedgegui使用的是V2版的,只有一个edge.exe. 直接替换即可. 而n2nguien使用的是V1和V2均有, 对应的文件是edge.exe
和edge2.exe
. 做相应替换即可.安卓客户端可以去google play搜索n2n 来安卓下载: google play 下载
这些图形界面的配置介绍可以参考ref 1.
PS: Win端可能ping不通, 因为默认下win7 以上处于安全考虑不允许外部主机对其进行ping 测试. 运行ICMP 回显,
设置: 控制面板 -> 防火墙 -> 高级设置 -> 入站规则 ->
找到文件和打印机共享(回显请求-ICMPv4-in, 有两个), 右键启用规则即可.
PS: 如果开有多个版本有多个虚拟网卡时, 可以用ping -I tun0 ip
这样去指定ping(例如我在客户端同时开有多个edge)
附录
supernode 启动服务写法参考
#!/bin/sh
### BEGIN INIT INFO
# Provides: n2n
# Required-Start: $network $remote_fs $local_fs
# Required-Stop: $remote_fs $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the n2n VPN
# Description: This script controls the n2n VPN service.
# It is called from the boot, halt and reboot scripts.
# So far, only 1 PVN is supported by this script.
# More can be started via the command line.
### END INIT INFO
set -e
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC='n2n P2P VPN Supernode'
NAME=supernode
DAEMON=/usr/bin/supernode
SNPORT="82"
DAEMON_ARGS="-l $SNPORT" # Arguments to run the daemon with
#PIDFILE=/var/run/$NAME-edge.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
. /lib/lsb/init-functions
# Function that starts the daemon/service
#
do_start()
{
#if [ -r /sys/class/net/edge0 ]; then
# echo edge node is already running.
# exit 0
#fi
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --user nobody --exec $DAEMON --test > /dev/null \
|| return 1
export N2N_KEY
start-stop-daemon --start --quiet --user nobody --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2 &
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --user nobody --exec $DAEMON
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
N=/etc/init.d/$NAME
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
exit 0
win下mingw进行cmake记录
## First, I modify CMakeToolchainFileMingw32.cmake, change compiler to gcc and g++, but fail.
$ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake --build ./ ../
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:1 (project):
The CMAKE_C_COMPILER:
cl
is not a full path and was not found in the PATH.
To use the NMake generator with Visual C++, cmake must be run from a shell
that can use the compiler cl from the command line. This environment is
unable to invoke the cl compiler. To fix this problem, run cmake from the
Visual Studio Command Prompt (vcvarsall.bat).
Tell CMake where to find the compiler by setting either the environment
variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
the compiler, or to the compiler name if it is in the PATH.
CMake Error at CMakeLists.txt:1 (project):
The CMAKE_CXX_COMPILER:
cl
is not a full path and was not found in the PATH.
To use the NMake generator with Visual C++, cmake must be run from a shell
that can use the compiler cl from the command line. This environment is
unable to invoke the cl compiler. To fix this problem, run cmake from the
Visual Studio Command Prompt (vcvarsall.bat).
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.
-- Configuring incomplete, errors occurred!
See also "C:/Users/zhaozx/Desktop/n2n-master/n2n_v2/build/CMakeFiles/CMakeOutput.log".
See also "C:/Users/zhaozx/Desktop/n2n-master/n2n_v2/build/CMakeFiles/CMakeError.log".
## Then, I find that I can use -G to assign compiler chain for cmake
## Error when run cmake previous to generate conf file: CMakeCache.txt CMakeFiles. It cause cmake to still run nmake instead of mingw-make
$ cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake --build ./ ../
CMake Error: Error: generator : MinGW Makefiles
Does not match the generator used previously: NMake Makefiles
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
$ rm -rf ./*
## Error when use "MinGW Makefiles" to setup
$ cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake --build ./ ../
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.6/Modules/CMakeMinGWFindMake.cmake:22 (message):
sh.exe was found in your PATH, here:
C:/MinGW/msys/1.0/bin/sh.exe
For MinGW make to work correctly sh.exe must NOT be in your path.
Run cmake from a shell that does not have sh.exe in your PATH.
If you want to use a UNIX shell, then use MSYS Makefiles.
Call Stack (most recent call first):
CMakeLists.txt:1 (project)
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
## Indeed, don't need to setup -DCMAKE_TOOLCHAIN_FILE=../cmake/CMakeToolchainFileMingw32.cmake
## Success finally
$ cmake -G "MSYS Makefiles" --build ./ ../
$ make
## Finally run the program, it works
$ ./edge.exe --help
Welcome to n2n v.2.1.0 for Windows
Built on Sep 19 2016 19:48:54
Copyright 2007-09 - http://www.ntop.org
edge -a [static:|dhcp:]<tun IP address> -c <community> [-k <encrypt key> | -K <key file>] [-s <netmask>] [-m <MAC address>]
-l <supernode host:port> [-p <local port>] [-M <mtu>] [-r] [-E] [-v] [-t <mgmt port>] [-b] [-h]
-a <mode:address> | Set interface address. For DHCP use '-r -a dhcp:0.0.0.0'
-c <community> | n2n community name the edge belongs to.
-k <encrypt key> | Encryption key (ASCII) - also N2N_KEY=<encrypt key>. Not with -K.
-K <key file> | Specify a key schedule file to load. Not with -k.
-s <netmask> | Edge interface netmask in dotted decimal notation (255.255.255.0).
-l <supernode host:port> | Supernode IP:port
-i <local_ip> | Add local ip to bypass between same nat problem
-b | Periodically resolve supernode IP
: (when supernodes are running on dynamic IPs)
-p <local port> | Fixed local UDP port.
-m <MAC address> | Fix MAC address for the TAP interface (otherwise it may be random)
: eg. -m 01:02:03:04:05:06
-M <mtu> | 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.
## Indeed, edge need as administrator
$ ./edge.exe -l 11.11.11.11:86 -c Helloworld -k Helloworld -a 10.1.2.3
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:2495] Starting n2n edge 2.1.0 Sep 19 2016 19:48:54
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:2500] supernode 0 => 11.11.11.11:86
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:2500] supernode 1 =>
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:2547] ip_mode='static'
Open device [name={742EF053-CF5D-4511-BC68-9A85D4173001}][ip=10.1.2.3][ifName=Ethernet 2][MTU=1400][mac=01:02:03:04:05:06]
Setting Ethernet 2 device address...
请求的操作需要提升(作为管理员运行)。
WARNING: Unable to set device Ethernet 2 IP address [netsh interface ip set address "Ethernet 2" static 10.1.2.3 255.255.255.0]
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:2614] edge started
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c: 416] Chose new tx_transop_idx=1
19/Sep/2016 19:53:03 [c:/Users/zhaozx/Desktop/n2n-master/n2n_v2/edge.c:1935] Rx REGISTER_SUPER_ACK myMAC=01:02:03:04:05:06 [11.11.11.11:86] (external 123.123.123.123:16313). Attempts 2
Reference
我在mac下可以正常使用v1版本,tuntaposx直接从sf下的tuntap_20150118里面的pkg安装就行了,n2n是github上弄下来,直接编译安装就行.v2也是可以正常使用的。tuntaposx我是下下来编译的,然后禁用了kext signature check。默认安装没有测试是否可行。
-----------------------------
http://www.fuphp.cn/linux/1284.html
http://blog.csdn.net/yetyongjin/article/details/7419894
-------------------
异地也要玩局域网——使用N2N,实现异地服务器快速组建内网
我在一些服务器的配置环境中,经常遇到一个问题:
- 我想要在服务器之间组建一个局域网,但却用不起专线;
- 使用传统的VPN技术,服务器选在哪里都是个问题;选的不好,部分服务器连不上;
- 使用传统的VPN技术,所有的流量转发压力全集中在一台服务器不说,如果VPN服务器崩溃了,整个局域网都会崩溃;
- 墙,墙,墙,部分VPN过墙就被拦截,根本无法进行透传
所以随着P2P网络模式的流行,与之而来衍生出了一种新的概念:P2P VPN。
1. 什么是P2P VPN
所谓P2P VPN,就是在整个VPN网络中,所有的服务器之间的流量转发,不再需要经过中心服务器,而是直接实现点到点连接。只需在连接中心节点一次后,剩下的流量交换都在节点服务器中完成。
在传统的VPN中,有且只能有一台VPN服务器,所有的客户端都会连接到单点服务器上,并且所有的流量都必须通过单点服务器进行转发;负担过重不说,往往因为中心节点的崩溃导致局域网的分崩离析。
而在P2P VPN中,网络采用和BitTorrent网络(BT下载网络)类似的架构:部署几台信息服务器(Tracker服务器),剩下的客户端作为边缘节点加入网络中即可。只需要通过信息服务器获取各台服务器的信息,即可直接转发数据包到达目标服务器。流量交换的工作将不由中心服务器完成,而是各个边缘节点之间完成。
2. 部署教程
这次教程,我们将使用 N2N (Node-to-Node,至少我的理解是这样) 来完成本篇教程。N2N目前分为两个版本,v1版本和v2版本。本教程以v2版本为例(因为支持多个中心节点实现灾备冗余),系统使用Debian 9 x64系统。
请注意:服务器必须支持TAP/TUN能力,否则此教程中的方法无法正常使用!
一般KVM都支持,OpenVZ虚拟化请工单咨询你的VPS服务商!
一般KVM都支持,OpenVZ虚拟化请工单咨询你的VPS服务商!
2.1 安装环境
执行命令:
由于从国外拉取文件,所以如果使用国内的服务器部署N2N,建议为服务器临时配置代理!或者从国外服务器下载好后转存到当前服务器上!
之后开始使用svn下载源码:
下载源码的速度视所在网络的环境,国内的速度会相对较为缓慢,国外的服务器数十秒即可完成下载。
之后,进入N2N v2的源码目录:
开始编译并安装:
在所有需要加入内网的服务器上,执行以上步骤,完成环境的安装。
2.2 了解网络架构
安装完成后,我们会得到两个可执行文件:
supernode
和edge
。
supernode 是我们的中心信息节点程序,它起到了类似BT/PT中Tracker服务器的作用,完成对边缘节点信息的交换,并为无法暴露端口在公网的服务器提供流量转发能力。
edge 是我们的边缘节点程序。它相当于网络中的客户端,加入到网络后,即可在中心信息节点的指引下进行信息交换。
edge 是我们的边缘节点程序。它相当于网络中的客户端,加入到网络后,即可在中心信息节点的指引下进行信息交换。
在一个P2P VPN的网络中,我们只需要少数几个(1~2个)Supernode即可。Edge可以无限添加。
2.3 部署Supernode (中心节点)
首先请确认要作为中心节点服务器暴露在公网!(NAT服务器的话,请保证NAT端口映射准确正常)使用内网(或者NAT后)的服务器是无法作为中心节点的!
部署Supernode的命令行非常简单,只需要一条命令:
执行完成后,supernode即启动成功。我们使用命令来确认下:
返回如下结果:
root@supernode-1:~# ps -aux | grep supernode
root 578 0.0 0.0 4196 700 ? S 02:45 0:00 supernode -l 9999
root 45127 0.0 0.0 12788 980 pts/0 S+ 06:04 0:00 grep supernode
root@supernode-1:~#
即为Supernode启动成功。
在N2N v1中,一个Edge只能连接一个Supernode,但在N2N v2中,你可以至多连接两个Supernode!妥善利用多Supernode的优势,实现灾备冗余的能力!
2.4 部署Edge节点
Edge节点的命令相对要复杂许多。我先贴出来一个比较简单的命令:
命令行参数解读:
-a [内网IP地址]:设置此N2N网络中,本机的IP地址
-c [群组名称]:设置本机要加入的N2N网络组名称(一台Edge可以加入多个N2N网络组中,只要保证软件版本一致)
-k [密码]:加入N2N网络组使用的密码
-l [Supernode地址:端口号]:Supernode的地址,带上端口号
-p [外网暴露端口号]:其他Edge访问本机使用的端口号(所有的N2N流量都将流经此端口)
建议先在本地规划好网络信息后,再将命令贴到服务器上执行!
首选直接执行配置好的命令(至少在2台服务器上执行命令,方便测试):
比如我在Server A上使用IP:10.233.199.101,在Server B上使用IP:10.233.109.102;
先启动Supernode(如果已经启动完成了则跳过此步骤)
之后启动两个Edge节点,稍等数秒后,从Server A上Ping Server B的IP:
如果出现类似下面的结果:
root@edge-1:~# ping 10.233.109.102
PING 10.233.109.102(10.233.109.102) 56(84) bytes of data.
64 bytes from 10.233.109.102: icmp_seq=1 ttl=64 time=49.1 ms
64 bytes from 10.233.109.102: icmp_seq=2 ttl=64 time=49.9 ms
64 bytes from 10.233.109.102: icmp_seq=3 ttl=64 time=49.0 ms
64 bytes from 10.233.109.102: icmp_seq=4 ttl=64 time=49.2 ms
则说明两台服务器通过N2N组建P2P VPN网络成功。
2.5 常见故障排错
2.5.1 Destination Host Unreachable
如果出现了以下提示:
root@edge-1:~# ping 10.233.109.102
PING 10.233.109.102 (10.233.109.102) 56(84) bytes of data.
From 10.233.109.102 icmp_seq=1 Destination Host Unreachable
From 10.233.109.102 icmp_seq=2 Destination Host Unreachable
From 10.233.109.102 icmp_seq=3 Destination Host Unreachable
From 10.233.109.102 icmp_seq=4 Destination Host Unreachable
一般可能是以下原因:
- 对端的N2N Edge没有正确启动、参数错误或者刚刚启动(从启动Edge到加入网络需要数秒的时间)
- Supernode中心节点崩溃
- 你Ping错IP了(新手最常出现的问题)
2.5.2 Ping不通(没有反应)
如果出现了以下提示:
root@edge-1:~# ping 10.233.109.102
PING 10.233.109.102 (10.233.109.102) 56(84) bytes of data.
[没有反应]
一般可能是以下原因:
- 本机的N2N Edge没有正确启动、参数错误或者刚刚启动(从启动Edge到加入网络需要数秒的时间)
- 当前N2N网络组中IP/MAC地址冲突
根据实际情况修改配置即可完成网络部署。
3. P2P VPN的用途
P2P VPN可以用来在服务器间通过内网的方式进行连接,或者某些不愿意在公网进行传输的文件,可以通过P2P VPN网络进行内网分发。
不适用于NAT打洞,因为所有流量的转发都要经过Supernode,对中心节点压力较大,同时也会导致P2P VPN网络的不稳定性。
(悄悄说一句,N2N的P2P VPN可以用来cross the Wall……具体用途自己研究)
--------------------
No comments:
Post a Comment