DN42 是一个大型的私有互联网络,众多节点通过 VPN 的方式互相连接,然后再通过 BGP 等协议相互交换自己的路由,并提供像 DNS, IRC 这样的基础设施。

当我在自己的 vps 上和其他人成功 peer 后,我就在想应该如何让自己的其他计算机可以在不与其他人 peer 的情况下可以随意地访问 DN42 内的计算机,同时让 dn42 内的其他节点也可以访问到我的计算机。

如果你想和我 peer, 请点下面的链接!

DN42
Hi, I’m AS4242421826, looking for peers on DN42 network now. If you are interested in peering with me, please send the following informationto [email protected]: * Your ASN * Your Clearnet IP * Your DN42 IP * Your Link-Local IP * Your WireGuard endpoint * Your WireGuard public key I prefer Mult…

安装 Tinc

Tinc 是一个轻量级的跨平台 full-mesh VPN 软件,它可以让节点之间互相建立隧道,从而让流量直接到达目标计算机。

各发行版软件仓库应该都有这个软件,所以你可以直接安装稳定版:

sudo apt install tinc

如果你想在 Ubuntu 上使用最新的 1.1 预览版,建议从 GitHub 获取源码手动编译:

sudo apt install -y autoconf textinfo
git clone https://github.com/gsliepen/tinc -b 1.1
cd tinc
autoreconf -fsi
./configure \
    --bindir=/usr/bin \
    --sbindir=/usr/sbin \
    --with-systemd \
    --enable-jumbograms \
    --disable-legacy-protocol \
    --datadir=/etc/tinc 
 make
 sudo make install

需要注意的是, Tinc 1.0.35 以前和 1.1-pre17 以前的版本有协议漏洞,而在 tinc-vpn.org 下载的 1.1-pre17 源码不支持 openssl1.1.1a 以上的版本,

否则程序在运行的时候会提示 Error while decrypting: error:060A7094:digital envelope routines:EVP_EncryptUpdate:invalid operation 。 这个问题在 GitHub 上已经被修复,但是官方还没有放出新的 release,具体情况是这样的。

准备

目前我有 172.20.143.48/28 这段IP,我将拆出一段IP 172.20.143.56/29 并分配到以下几个设备上:

master   -  172.20.143.57 -     网关,与其他 DN42 节点通讯
lax2     -  172.20.143.58 -     另外一台 Ubuntu 服务器
lap      -  172.20.143.59 -     电脑
rpi      -  172.20.143.60 -     树莓派
and      -  172.20.143.61 -     手机

master 可以访问其他 dn42 节点,所以可以让其他设备通过 master 访问 dn42 网络,那么就通过 VPN 组建一个虚拟内网,其他设备把 master 作为网关就好了。

配置

对于 Ubuntu系统,在 /etc/tinc 下新建一个目录,取名为 intern。然后在里面建立 hosts 文件夹和 tinc.conf (如果你是手动编译的 tinc,那么你可能要找的是 /usr/local/etc/tinc

对于 Windows 系统,你可以在 Tinc 的安装目录下建立 intern文件夹。

对于 Android 系统,你可以使用 Tinc App

在本例中,intern 是你的网络名字,你可以改成别的。

配置服务端 master

编辑 /etc/tinc/intern/tinc.conf, 写入以下内容:

Name = intern_master # 节点的名称
Mode = switch        # switch 模式
Interface = intern0  # 网卡名称

然后是 /etc/tinc/intern/hosts/intern_master,

Address = 服务器公网IP
Subnet = 172.20.143.57/32   # 这里的 172.20.143.57 就是在这个内网中 master 的 IPv4 地址

接下来生成密钥:

# 如果是 Tinc 1.0.x:
tincd -n intern -K
# 如果是 Tinc 1.1+
tinc -n intern generate-ed22519-keys

保持默认设置,一路回车就好了。

编写网卡初始化脚本 /etc/tinc/intern/tinc-up:

#!/bin/bash
ip link set up $INTERFACE
ip addr add 172.20.143.57/29 dev $INTERFACE

网卡关闭脚本 /etc/tinc/intern/tinc-down

#!/bin/bash
ip addr del 172.20.143.57/29 dev $INTERFACE
ip link set $INTERFACE down

设置执行权限:

sudo chmod +x /etc/tinc/intern/tinc-up
sudo chmod +x /etc/tinc/intern/tinc-down

配置 Linux 客户端 - lax2

服务端和客户端的配置基本上相同,编辑 /etc/tinc/intern/tinc.conf, 写入以下内容:

Name = intern_lax2
Mode = switch
Interface = intern0
ConnectTo = intern_master

然后是 /etc/tinc/intern/hosts/intern_lax2 :

Subnet = 172.20.143.58/32

在网卡初始化的时候,需要额外添加一条路由。

/etc/tinc/intern/tinc-up:

#!/bin/bash
ip link set up $INTERFACE
ip addr add 172.20.143.58/29 dev $INTERFACE
# 与 dn42 有关的 IP 全部走咱 master 网关
ip route add 172.20.0.0/14 via 172.20.143.57 dev $INTERFACE

然后在断开时,把路由也删掉。/etc/tinc/intern/tinc-down:

#!/bin/bash
ip addr del 172.20.143.58/29 dev $INTERFACE
ip route del 172.20.0.0/14 via 172.20.143.57 dev $INTERFACE
ip link set down dev $INTERFACE

生成密钥、设置脚本执行权限与上一步相同。

配置 Windows 客户端 - lap

这里下载 Windows 版的客户端,安装时三项全选。安装完成后,进入 tinc 安装目录。

接下来的步骤和上面 Linux 客户端基本上一样,无非是创建目录,编写 tinc.conf,创建 hostsintern_lap,以及生成密钥。

但是对于网卡的配置有一些不同。在安装目录的 tap-win64 文件夹下有一个名为 add-tap.bat 的文件,右键以管理员身份运行,即可添加网卡。

接下来在控制面板中找到一个写着 TAP-Win32 Adapter V9 的网卡,将其重命名为 tinc.confInterface的值,在这里是 intern0

右键它,点属性设置 IPv4 地址,将 IP 地址和子网掩码修改为 intern_lap 中的 Subnet的值。 DNS服务器也可以设置为 dn42 中的 dns 服务器 IP,这样你就可以直接在浏览器中访问 .dn42 的域名。

对于网关的设置,你可以选择在这个窗口中填入网关地址,但会造成你计算机上非 dn42 的数据包也会被发往服务器。

或者,也可以选择手动设置网关的路由,只需要以管理员身份启动 cmd,然后执行

route -p add 172.20.0.0/14 172.20.143.57

这里的 -p 参数会让这条路由设置在计算机重启后仍然存在(也就是说你不加它,重启后就会消失。)

如果你想删除路由,可以执行

route delete 172.20.0.0/14 172.20.143.57

在 Windows 上,你可以在类似的位置创建 tinc-up.battinc-down.bat 来执行启动和关闭时的脚本。

测试 & 运行

在正式启动 tinc 之前,你还需要交换每个节点的配置文件。将服务端 hosts 里的文件复制到各个客户端里, 客户端的 hosts 里的文件也复制到服务端,如果你想让客户端之间也能连接,那么客户端之间也需要有对方 hosts 里的文件。

你可以在每个计算机上执行 tincd -n intern -D -d3 在前台以调试模式启动 tinc,并且观察运行状态。 如果你觉得不错,使用 Ctrl + \ 关闭程序,然后把它添加到服务中:

sudo systemctl enable [email protected]
sudo systemctl start [email protected]

对于 Windows 系统,你需要在管理员身份启动的 cmd 下进入 tinc 安装目录, 然后执行 tincd -n intern ,如果成功的话会出现一个开机自动启动的服务 tinc.intern

如果一切正常的话,你现在就能在任意一台计算机上访问 dn42 的网络了。

先试试我们的虚拟内网:

(奇怪,怎么延迟变低了?)

再看看 dn42 里的服务器:

瞧这扭曲的路由

不出意外的话,在 master 节点上使用 tcpdump -I intern0 也可以看到从那台计算机上路过的 ICMP 请求。

通过其他人的 Looking Glass, 也可以直接访问到我们内网:

写在最后

你可以用这样的方式来让自己的所有设备全部加入 DN42 网络。访问的延迟取决于你和网关服务器的延迟。不过,如果你的网络内有其他延迟更低的 BGP router,也可以直接把它作为网关。

把自己家的电脑送上公共网络是不安全的。如果你要让自己的电脑或者手机加入 DN42 网络,最好还是把防火墙给设置好。或者通过 NAT 的方式上网。