DN42 是一个大型的私有互联网络,众多节点通过 VPN 的方式互相连接,然后再通过 BGP 等协议相互交换自己的路由,并提供像 DNS, IRC 这样的基础设施。
当我在自己的 vps 上和其他人成功 peer 后,我就在想应该如何让自己的其他计算机可以在不与其他人 peer 的情况下可以随意地访问 DN42 内的计算机,同时让 dn42 内的其他节点也可以访问到我的计算机。
如果你想和我 peer, 请点下面的链接!
安装 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
,创建 hosts
和 intern_lap
,以及生成密钥。
但是对于网卡的配置有一些不同。在安装目录的 tap-win64
文件夹下有一个名为 add-tap.bat
的文件,右键以管理员身份运行,即可添加网卡。
接下来在控制面板中找到一个写着 TAP-Win32 Adapter V9
的网卡,将其重命名为 tinc.conf
中 Interface
的值,在这里是 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.bat
和 tinc-down.bat
来执行启动和关闭时的脚本。
测试 & 运行
在正式启动 tinc 之前,你还需要交换每个节点的配置文件。将服务端 hosts
里的文件复制到各个客户端里, 客户端的 hosts
里的文件也复制到服务端,如果你想让客户端之间也能连接,那么客户端之间也需要有对方 hosts
里的文件。
你可以在每个计算机上执行 tincd -n intern -D -d3
在前台以调试模式启动 tinc,并且观察运行状态。 如果你觉得不错,使用 Ctrl + \
关闭程序,然后把它添加到服务中:
sudo systemctl enable tinc@intern
sudo systemctl start tinc@intern
对于 Windows 系统,你需要在管理员身份启动的 cmd 下进入 tinc 安装目录, 然后执行 tincd -n intern
,如果成功的话会出现一个开机自动启动的服务 tinc.intern
。
如果一切正常的话,你现在就能在任意一台计算机上访问 dn42 的网络了。
先试试我们的虚拟内网:
(奇怪,怎么延迟变低了?)
再看看 dn42 里的服务器:
瞧这扭曲的路由
不出意外的话,在 master 节点上使用 tcpdump -I intern0
也可以看到从那台计算机上路过的 ICMP 请求。
通过其他人的 Looking Glass, 也可以直接访问到我们内网:
写在最后
你可以用这样的方式来让自己的所有设备全部加入 DN42 网络。访问的延迟取决于你和网关服务器的延迟。不过,如果你的网络内有其他延迟更低的 BGP router,也可以直接把它作为网关。
把自己家的电脑送上公共网络是不安全的。如果你要让自己的电脑或者手机加入 DN42 网络,最好还是把防火墙给设置好。或者通过 NAT 的方式上网。