1. 前言

突然之前,电报群热烈讨论“隧道中转流量”。非常好奇这是什么技术,本着不懂就问的真理,询问大佬。大佬回答是: 10 块包安装。emmm……生命不息,折腾不止!我自己研究去吧!Google、Baidu 一圈后,在知乎上找到较为贴切问题的帖子,出自大佬 @iCodex (帖子链接见文末)。

我也是刚刚了解 隧道 方面的知识,如有错误请大佬指出。

2. IPLC、MPLS、隧道

我们目标建立的“隧道”概念,与 IPLC 有类似之处,所以先来了解一下。IPLC 粗暴点理解就是专线,直接用网线连接两边用户,不需要经过宽带运营商的机房。具体请看图:

在这里插入图片描述

那什么是 MPLS ?实际上我们无法通过软件手段实现物理层面上的两台服务器直接相连,不能完全达到 IPCL 的效果。所以将通过软件手段实现的“类 IPCL ”称为 MPLS。

至于 隧道 可以理解为一条通过软件构建的虚拟的网线,它直接连接两台服务器的。构建完成的架构图:

在这里插入图片描述

3. 进一步了解隧道

就我目前了解,隧道的实现方案有两类:

  • 使用 Zerotier、WireGuard 。将两台服务器组建在一个内网中,完成隧道部署后,两台机器就相当于在同一 WIFI 下的两台电脑,数据在内网中直接传输。
  • 使用 Stunnel、GOST 的 TLS 加密隧道。服务器 A 将数据加密后传输,到达服务器 B 后,服务器 B 解密转发到目标服务器(如 油土鳖等)

第二类方案操作比较简单,理解起来也比较容易,但缺点是 TLS 等加密方案大多都是基于 TCP 的,所以对这类隧道对 UDP 的支持较差。而第一类方案可以较好地支持 UDP 转发,但由于本身是特定的加密协议,特征较为明显,且 WireGuard 基于 UDP,对大陆的网络环境适应性不太好(易受宽带运营商 Qos 影响)。

—-摘选自利用 GOST 搭建加密中转隧道

两者较大的区别就是第一类方案会在每台主机上虚拟出一张网卡,并且虚拟网卡都在同一个网段。是不是有点熟悉?对没有错,就是内网穿透的感觉。

4. 隧道 与 iptables 等转发流量区别

在了解到隧道之前,我印象中中转服务器基本上都是使用 iptables 或者 socat 等工具,直接转发数据包(流量)到落点服务器。 在这种转发方式中,中转服务器没有对数据包进行任何操作(如:加密),仅仅转发数据包到落地服务器。而在 隧道 中的中转服务器有对数据包进行处理。具体请看图:

在这里插入图片描述

5. 使用 WireGuard 组建隧道

我选择的是第一种方法搭建 隧道 ,选择的工具是 WireGuard 。如果想了解用第二类方案实现,请看这篇帖子

顺带说一嘴,这个工具可以用做家庭 NAS 的内网穿透。工具还可以选择 Zerotier ,这个带 Web 管理,但服务器在国外,为了更好的链接体验,可以百度一下搭建一个 moon节点 加速。

WireGuard 服务器客户端一体,依据配置文件区分。官网有详尽的安装命令,实在看不懂英文翻译一下。这里给出大佬们的一键脚本。

Debian(萌咖)

1
wget --no-check-certificate -qO- 'https://moeclub.org/attachment/LinuxShell/wireguard.sh'| bash

Ubuntu(atrandys)

1
wget https://raw.githubusercontent.com/atrandys/wireguard/master/wireguard_install_ubuntu.sh && chmod +x wireguard_install_ubuntu.sh && ./wireguard_install_ubuntu.sh

CentOS(atrandys)

1
yum install -y wget && wget https://raw.githubusercontent.com/atrandys/wireguard/master/wireguard_install.sh && chmod +x wireguard_install.sh && ./wireguard_install.sh

落地服务器我们用作 wireguard 服务端,中转服务器用作 客户端。

先在 落地服务器 安装,使用 一键脚本 完成安装后会在 /etc/wireguard 目录下生成有:一对客户端key、一对服务端key、服务端配置文件客户端配置文件

服务端配置文件:wg0.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Interface]
PrivateKey = <服务端私钥>
# 组建内网服务端内网地址,NAT机器可能与原有网段冲突,请修改
Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = <监听端口>
DNS = 8.8.8.8
MTU = 1420

[Peer]
PublicKey = <客户端公钥>
# 组建内网服务端内网地址
AllowedIPs = 10.0.0.2/32

客户端配置文件:client.conf

1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
PrivateKey = <客户端私钥>
Address = 10.0.0.2/24
DNS = 8.8.8.8
MTU = 1420

[Peer]
PublicKey = <服务端公钥>
# 客户端公网IP:监听端口
Endpoint = 173.242.120.211:53115
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25

使用 Xshell 之类工具,将 clien.conf 下载到本地电脑待用。以相同方法在 中转服务器 上安装 wireguard 。安装完成后,将本地电脑的 client.conf 上传到中转服务器的 /etc/wireguard记得是覆盖上传!!!覆盖!!!

如无意外,隧道已经搭建完成了。启动隧道:

落地服务器(服务端)

1
wg-quick up wg0

中转服务器(客户端)

1
wg-quick up cleint

隧道启动完成,中转服务器流量会经落地服务器发出。可以测试一下:在中转服务器执行:

1
curl zx2c4.com/ip

返回的应该落地服务器的IP。至此 隧道中转流量 搭建完成。

怎么使用?你仅需要在中转服务器上安装 喜闻乐见的程序 ,开启隧道,你全部流量就会最终从落地服务器发出。不信你连接上 喜闻乐见的程序 后,去查查你的IP。

6. 后记

使用 隧道 转发流量和使用 iptables 转发流量,速度谁更快?我并没有对比,所以不知道。电报大佬说是 隧道 更快一点,但没有指明是哪种 隧道 方案。毕竟高峰期 TCP 与 UDP 差距是存在的。安全性的话,隧道 进行二次加密比单次加密的 iptables,在理论上安全性更高,毕竟多一次加密等于你家多一道门一样。但是,隧道 加密的特征可能被容易识别出来。

总结:说了等于没说,你们自己测试去吧。我家境贫寒。

7. wireguard 常用命令

使用 /etc/wireguard/ 下的配置启动

1
wg-quick up &lt;配置名&gt;

关闭&&停止

1
wg-quick down &lt;启动时用的配置名&gt;

查看运行状态&&链接信息

1
2
3
4
# 输入无显示,则为未启动
wg show

wg

8. 参考链接