# 前言

网上的各种教程只教如何简单的使用 n2n,却没教怎么防止自己的 n2n 服务器被白嫖(bushi)和一些更进阶的使用

此教程就结合我的经验和 n2n 作者写的文档来教大家如何进阶的使用 n2n 以及避免踩雷

这里演示的均以 Windows 系统为基础,Linux 大同小异

这里采用 v3 版的 N2N,v1 和 v2 参数可以会有所不同

N2N 项目地址 GitHub - ntop/n2n: Peer-to-peer VPN

# 准备

・一个有公网的 vps

• EasyN2N

・一个聪明的脑子

# 开始

# 给 supernode(服务端)设置密码

网上很多教程都没说明怎么给 supernode 设置密码来限制连接,不然白白给其他人白嫖了去(bushi)

给 supernode 设置密码也同样可以增加一定的网络安全性

但是 n2n 作者貌似设计传统的密码设置方案,而是给出了另一种有同样效果的方案,那就是限制小组名称的方式

将小组名称当做密码来限制 supernode 的连接。我也是在网上找了好久,也看了 help,最后在这个项目的 GitHub 的 FAQ 页面作找到的

下面是作者的原文

翻译过来就是

“我想设置一个只有我才能使用的超级节点。甚至可能受密码保护?
请将社区名称视为密码,并使用参数启动超级节点,其中是简单文本文件的路径,其中包含一行带有您的秘密社区名称的行。这将是唯一允许的社区。只有来自该社区的边缘节点才能加入(在边缘)。-c <community file> <community file>-c <community name>

那么这就很简单了,我们只需要在 supernode 的启动参数上加上 - c 包含组名称的文件路径 或者直接是组名称也行(不推荐,之后会说到)

在组名称文件里(一个普通的文本文件),输入组名称,一行一个即可。

然后这个组名称就变成了连接 supernode 的密码了(感觉很奇葩)

# 数据压缩

这里 N2N 内置提供了 2 种压缩算法

-Z1  | 使用 LZO (1x) 压缩算法压缩传输的数据
-Z2 | 使用 ZSTD 压缩算法压缩传输的数据

这个根据自己的需求选择,只需要在客户端附加启动参数就行了

# 数据加密

这里 N2N 提供了 4 种内置的加密算法

-A1  | 关闭局域网内传输的数据加密
-A2 | 使用 twofish 加密算法加密传输的数据
-A3 | 使用 AES 加密算法加密传输的数据
-A4 | 使用 chacha20 加密算法加密传输的数据
-A5 | 使用 Speck-CTR 加密算法加密传输的数据

如果要使用加密的话,需要和 - k 密码 一起使用,并且通信时要求对方也需要相同的密码

下面是作者对这几种加密算法的比较

还有一个可选参数

-H  | 数据包报头完整加密

下面是作者对此的介绍

翻译过来就是

“默认情况下,社区名称以普通女巫每个数据包的形式传输。因此,固定名称的社区可能会将您的弟弟妹妹排除在您的社区之外(只要他们不知道社区名称),但是嗅探攻击者会发现社区名称。使用这个名字,他们只需连接到超级节点就可以访问它。”

虽然这个翻译很牵强,但大致意思就是又可以增加安全性

但是这里就有个坑!!!!!!

如果要使用这个数据包报头完整加密的话,必须要配合服务端的 -c 参数使用,并且在组名称列表下添加下面的字符,不然无法连接!!!!

.*

作者也给出了示例

然后就可以正常连接了

# tips

避雷小 tips

断开 n2n 后立即连接会发现连接失败并在服务端抛出 “Authentication fail”

这是由于客户端未向服务端发送下线命令而直接断开连接导致触发服务端的防欺骗保护,一般在开启防欺骗保护的服务端会出现这种情况,

解决方法

  1. 等一会重试

  2. 重启服务端

  3. 关闭防欺骗保护,在服务端启动参数后加上 - M 即可关闭(不推荐)

下面是作者给出的原文解答

The edge repeatedly throws an “Authentication error. MAC or IP address already in use or not released yet by supernode” message. What is wrong?
The edge encountered n2n’s protection against spoofing. It prevents that one edge’s identity, MAC and IP address, can be impersonated by some other while the original one is still online, see some details. Mostly, there are two situations which can trigger this:

If you use a MAC or IP address that already is in use, just change those parameters.

If the edge prematurely has ended in a non-regular way, i.e. by killing it using or , it did not have a chance to un-register with the supernode which still counts the edge for online. A re-registration with the same MAC or IP address will be unsuccessful then. After two minutes or so the supernode will have forgotten. A new registration with the same parameters will be possible then. So, either wait two minutes or chose different parameters to restart with.kill -9 …kill -SIGKILL …

And, as a matter of principal, always end an edge by either pressing + or by sending SIGTERM or SIGINT by using or ! A plain without will do, too. And finally, a command to the management port peacefully ends the edge as well.CTRLCkill -SIGTERM …kill -SIGINT …kill …-9stop

# 参考文档