0x00 简介
0x00.0x00 项目
首先说一下n2n是个啥吧。这个项目的仓库地址是https://github.com/ntop/n2n,其实从我知道这个项目到现在也就是个半年时间,说了解得有多深入,也没有,简单来说这就是一个基于C/S架构的P2P VPN项目,如果有使用过tailscale或者zerotier的小伙伴估计对这类产品会有所了解,n2n其实呢,就是这类产品的开源版本,当然对应的功能特性要远弱于tailscale以及zerotier这类平台。
中间插一段,在两年前,我由于在做基于webrtc串流的远程桌面项目,曾经关注到过国内一个叫happyn的团队(说是团队,但通过联系沟通之后,我才发现这个团队就一个哥们,所有事情都全揽,我也是很佩服)。当时由于关注点全都在串流桌面上,也没去进一步了解过happyn这个项目,其实这兄弟其实已经把所有的代码都在github上开源了。回来了解到n2n之后才知道,原来happyn就是基于n2n进行开发的,并且对全平台做了封装,就是由于初创并且资金以及人员比较匮乏等原因,项目现在只能转変方向,也是觉得挺可惜的。
VPN相信大家就算不了解也听说过,反正都会跟FQ挂钩起来,当然,我指代的VPN并不是就用来FQ的哈,其实VPN一开始的应用场景跟FQ是没半毛钱关系,能让VPN拥有了这巨大的作用真的是全靠GFW了,真是得感谢你全家!
VPN其实全称是Virtual Private Network,直译就是虚拟私有网络,简单说就比如现在接在同一个路由器下的电脑或者手机设备等是可以直接通过内网IP进行通信,也可以相互进行扫描的,这就是物理私有网络。而VPN通过overlay技术,让物理网络中通信的网络数据加层封装,增加一层逻辑内网,让真正通信的应用以为与对端其实是在同一个内网进行通信,概括起来就如同下图的描述:
而内网通信有啥好处呢,就是可以简单的通过内网IP即可进行网络通信,互联网上通信就很复杂了,具体在本篇中就不展开讲了,讲起来就没完没了了。
传统的VPN的网络数据是需要中心节点进行转发的,这个中心节点是需要组建虚拟内网的节点均可以与之进行物理网络的通信,然后所有在虚拟内网中传递的数据都会通过该中心节点,会导致中心节点的负载较高,压力较大。
同时由于数据需要走转发,所以数据的传输过程耗时较高(延迟高),也受限于更多的物理资源,比如带宽不只受限于对端节点的网络带宽,也受限于中心节点的网络带宽。
基于P2P的VPN方案就可以解决这类问题,所谓P2P不代表不需要中心节点。在建立点对点网络之前,依然需要中心节点进行点对点网络的打通,至于打洞相关的知识,出于懒的原因,放在其他篇博客上再讲吧 ,只有在点对点网络打通的情况下虚拟内网中对等节点传输数据才会不经过中心节点直接转发到对端,而如果点对点网络未打通,则数据依然会经过中心节点进行转发,就如下图。
由于需要中心服务器,如果用云服务,那国内的带宽价格可不是一般夸张的高,一般个人能租个3~4M就顶天了,但是一般家用宽带的上行也有个30M,那要怎么用尽这些镰刀运营商的带宽呢 ,所以还是得用P2P,坚决吃光无良商家资源,虽然最后其实也不影响他们半点......
0x00.0x01 团队
n2n是由ntop团队所开发的项目,这个团队的官网是https://www.ntop.org,至于这个团队。。。我是真的没有了解过,哈哈。不过我在了解n2n项目之后还是大概看了一下这个团队的介绍,是个挺叼的团队(毕竟敢叫network top,而在linux界top一般都是顶顶的项目),按照介绍来看,团队规模不大,并且一般都是跨地办公的,并且他们热衷于开源,同时又把开源与商业结合得挺好,商业的用户又是分散状态,并不会大量依赖于某个单点的收入,简直是神仙般的状态。
不过最佩服他们的还是能不断坚持着开源,让自己对网络技术的理解不断分享给其他人,而不是封闭自顾。
0x01 操作
0x01.0x00 前置
n2n项目我一般是通过编译使用,一方面是自己确实希望能更多去了解这个项目,另一方面就是这个项目在github上确实也只对linux提供二进制封装包。
该项目也是通过cmake作为跨平台编译工具,windows在mingw下也可以快速进行编译,那干嘛不稍微折腾一下呢。
我选择该项目的版本是最新的稳定版本,即仓库的3.0-stable分支,下面会讲到如何选择该版本。
无论哪个操作系统,需要先操作的就是将n2n的源码仓库下载下来,至于要怎么下载,就不多说了,就是git clone罢了,会的肯定是觉得很简单,但是不会的我长篇大论下来也会一脸懵逼,如果还不太知道git的话我建议还是先拿一本git的书简单啃一下,应该还可以感受到git的伟大。
不过在windows上相对来说会费劲点,因为git不是windows的默认软件,但官方也已经完全支持windows了,下载地址是https://git-scm.com/download/win,接下去就是windows标准的下一步下一步安装,然后clone下来就行。
之后需要一条命令将仓库的代码切到3.0稳定版分支下
git checkout -b 3.0-stable --track remotes/origin/3.0-stable
n2n的3.0稳定版不启用特性的话,就只需要直接进行编译就可以,我这里一般会启用openssl以及zstd的特性。
其中openssl是用于数据包加密操作,避免n2n在虚拟二层数据在互联网中是完全裸露发送(当然,不是说n2n不打开openssl特性就是裸数据,只是openssl支持的加密特性比较全罢了)。
zstd的作用是进行数据压缩,从而减少在网络中传输的带宽占用量。
0x01.0x01 Ubuntu
Linux环境下编译n2n很简单,只需要通过对应的仓库管理工具下载安装依赖库以及编译工具。
在Ubuntu Linux下需要安装的就是对应的编译工具,cmake,openssl依赖库以及zstd依赖库。
通过apt进行安装即可,命令如下:
sudo apt install -y build-essential cmake libssl-dev libzstd-dev
之后进入n2n仓库目录,先对根目录上的cmake编译配置文件——CMakeLists.txt 进行修改,打开openssl以及zstd特性。
将以下内容:
OPTION(N2N_OPTION_USE_PTHREAD "USE PTHREAD Library" ON)
OPTION(N2N_OPTION_USE_OPENSSL "USE OPENSSL Library" OFF)
OPTION(N2N_OPTION_USE_PCAPLIB "USE PCAP Library" OFF)
OPTION(N2N_OPTION_USE_ZSTD "USE ZSTD Library" OFF)
改为
OPTION(N2N_OPTION_USE_PTHREAD "USE PTHREAD Library" ON)
OPTION(N2N_OPTION_USE_OPENSSL "USE OPENSSL Library" ON)
OPTION(N2N_OPTION_USE_PCAPLIB "USE PCAP Library" OFF)
OPTION(N2N_OPTION_USE_ZSTD "USE ZSTD Library" ON)
之后直接开始编译即可,命令如下:
mkdir build
cd build
cmake ..
make
sudo make install
这样n2n在系统中就已经编译安装完毕了!
0x01.0x02 ArchLinux
为什么要记录这么个蛋疼的OS呢?因为我在用,就记一下吧。不过我觉得如果想要学习折腾Linux,Arch绝对是不二之选。
首先还是安装编译工具,cmake,openssl依赖库以及zstd依赖库。
通过pacman进行安装,命令如下:
sudo pacman -S --noconfirm base-devel zstd openssl cmake
同样进入n2n仓库目录对根目录上的CMakeLists.txt进行修改,打开openssl以及zstd特性,并开始编译。
这些步骤与ubuntu中的步骤完全相同,就不复制粘贴了。
0x01.0x03 Windows
Windows的编译应该是最复杂的,因为依赖的库环境Windows都必须找到并安装上,同时,在Windows上要部署一个编译环境传统方式是装一个Visual Studio,那个安装量简直不能再逆天了。
不过,还好开源中有一个MinGW的项目,用于在Windows中可以部署一个类似Linux的开发环境,这个相对来说是要轻量不少了。
首先我的Windows系统环境是Windows 11,不过这个应该没有什么影响,对于现在流行的10或者11的版本编译应该都没什么问题,在n2n项目内并没有特别去引用Windows特有接口,毕竟开源现在跟Windows还是没什么相关性的。
0x01.0x03.0x01 安装tap驱动
首先得在Windows下安装虚拟化网络对应的驱动,该驱动在大部分的Linux发行版中是默认启用的。
该驱动的作用是模拟二层协议网卡,当数据通过该驱动设备,即可得到完整封装好的二层网络数据包,是大部分VPN方案的基础。
该驱动的windows版本维护在openvpn的项目下。
Openvpn也是个伟大的vpn项目,不过由于它的复杂性一般让很多人望而却步,无P2P特性也让使用场景受限,但至少它的开源性以及持续对开源进行维护的模式已经让它足够称得上伟大了。
tap的windows驱动下载地址:https://build.openvpn.net/downloads/releases
直接找到tap-windows-x.xx.x.exe文件列表,找到最新版,双击安装即可,so easy,哪里不会点哪里!
0x01.0x03.0x01 部署MinGW
MinGW的原项目支持的是32位系统,现在的CPU架构基本都是64位,因此我用的MinGW的64位版本。
项目名:MinGW-w64,官网:https://www.mingw-w64.org
为了便于安装配置,到Downloads页面下找到Sources点击SourceForge链接,如下图所示:
进入下载页后,拉到最下面,找到相应版本下载,我选用的是MinGW-W64 GCC-8.1.0——x86_64-win32-seh版本包。
其中8.1.0是gcc的对应版本,这个一般就影响编译特性。
x86_64标识64位架构,现在的CPU一般都是用AMD的x86_64的拓展架构,i686指代的是intel 32位高等级的CPU,现在用的都是64位架构,所以肯定使用的是x86_64.
win32指代的是windows的线程模型,与之对应的是Linux标准的posix模型,既然在windows上编译,我就直接使用win32了,其实也没什么影响。
seh是异常处理标识,具体我也不是很了解,但这个不影响n2n项目编译。
为啥不直接用MinGW-W64-install,看着不更简单?不懂是不是网络原因,反正一选好版本开始下载就异常,我就直接放弃了。
下载下来后是一个zip包,直接当作一个软件安装包解压,最后在Path环境变量中加入包内的bin目录路径就行。
比如我的包是解压在D盘的software目录下,之后我的环境配置就是如下图一样配置的:
之后打开cmd或者powershell之类终端输入gcc或者mingw32-make之类命令就可以使用了。
0x01.0x03.0x02 安装cmake
cmake本就是跨平台工具,在官网上即可获取,下载地址:https://cmake.org/download
直接找到msi文件下载安装就行,就是简单的下一步下一步,安装包会自行将环境变量添加好,就可以进行使用了。
0x01.0x03.0x03 安装openssl
openssl官网未提供windows版本,但可以找得到对应的安装包,对应的下载地址:https://slproweb.com/products/Win32OpenSSL.html
不可以下载light版本,light版本不包含开发链接库,并且我建议就下载v1.1.1的Win64版本,因为不清楚为啥,3之后的版本安装上之后,lib目录下无对应的链接库,会导致cmake无法将安装目录认成openssl目录。
0x01.0x03.0x04 安装zstd
zstd的下载地址不在官网,在github对应仓库的release中,下载地址:https://github.com/facebook/zstd/releases
找到最新版以及对应的win64的zip包下载下来,并解压到分区中即可。
0x01.0x03.0x05 编译
到这里。。。终于尼玛的把Windows下的环境准备好了,找那些依赖库以及下载我都花了大半天,Windows做开发,真的是辛苦了啊。
编译这边就比较简单了,不过还是有小许区别。
同样需要进入n2n仓库目录对根目录上的CMakeLists.txt进行修改,打开openssl以及zstd特性。
但这里面还得再修改一个位置,由于Windows无法自动搜索到zstd的链接库,因此需要手动指定,我是直接指定到zstd的静态链接库,将zstd直接编译入执行文件。
在CMakeLists.txt文件中找到以下内容:
if(N2N_OPTION_USE_ZSTD)
target_link_libraries(n2n zstd)
endif(N2N_OPTION_USE_ZSTD)
将其改为
if(N2N_OPTION_USE_ZSTD)
# target_link_libraries(n2n zstd)
target_link_libraries(n2n D:/software/zstd-v1.5.6-win64/static/libzstd_static.lib)
endif(N2N_OPTION_USE_ZSTD)
其中D:/software/zstd-v1.5.6-win64/static/libzstd_static.lib就是zstd静态链接库的绝对路径,特别要注意的是这串字符里的斜杠,是Linux标准的路径分隔符,并不是Windows标准的,这个一定要注意哈。
之后就正式开始进行编译了,在n2n仓库下新建build目录,通过powershell或者cmd进入到build目录之后,执行以下命令:
cmake -G "MinGW Makefiles" -DOPENSSL_ROOT_DIR="D:\software\OpenSSL-Win64" ..
这个跟正常的cmake命令不太相同,其中-G "MinGW Makefiles"作用是将编译环境指定到MinGW工具环境下,-DOPENSSL_ROOT_DIR="D:\software\OpenSSL-Win64"是指定openssl的包路径,指定后cmake即可找到openssl对应的链接库。
最后就是进行make和make install了,不过MinGW环境下,make执行程序名应该是mingw32-make,因此要进行正式编译的命令为:
mingw32-make
mingw32-make install
还有最后一个问题,就是当进行install的时候,n2n是将执行程序安装到C盘中,如果不用管理员权限启动的powershell或者cmd执行将出现权限不足的问题,具体的操作步骤我就不再啰嗦了,毕竟写到这里也有点累了。
0x02 总结
本来是想简单记录一下在Windows下编译n2n这个项目的流程罢了,因为太久没碰编译以及对Windows的不熟悉,也是折腾了不少时间,结果写了这么一大坨。
其实n2n还有很多东西可以写并且我觉得需要写出来的,比如使用架构,特性,还有新的3.1.1版本相对我现在编译的3.0版本新增的upnp功能,这个还是放在后续的文章里吧。
看来写博客这个事还是得抛掉一些写文档的惯性思维,慢慢改进吧......
文章评论