使用SoftEther搭配VPS搭建VLAN环境(全网最详细中文教程!100%成功)

提醒:阅读本文并按照步骤操作预计需要30分钟以上,请读者保持绝对的细心和耐心。

1. 背景介绍

动机:codemaster F1系列游戏的联机模式类似P2P,在分布式的节点环境下数据传输和同步异常缓慢,经常出现长时间的加载等候、发车灭灯延迟、圈数和名次计算错乱等影响游戏和比赛体验的状况,因此考虑自己架设私人VPN实现虚拟局域网游戏。

本文所述VPN遵循其英文全称Virtual Private Network的严格表述,旨在创建远程私人局域网环境以供游戏使用,未涉及任何非法用途。尝试用该方法连接境外VPS实现科学上网的朋友,若触犯法律则后果自负。(我看刑)

如果你按照本文严格操作,一定能够搭建一个性能令自己满意的虚拟局域网服务器。相关资源分散,收集和尝试不易,如果本文内容对你有一定帮助,可以通过打赏(二维码在页面底部)的方式支持作者。

2. 准备工作

  1. 一个可以用作vps的付费服务器。免费服务器亦可尝试,但不保证效果
    • 可以是任意有固定公网IP的服务器
    • 示例使用GCP香港实例(内地访问居然也很好用)、阿里云和腾讯云轻量应用主机(新用户20多块钱三个月,美滋滋)搭配ubuntu系统镜像测试通过,如果追求长期稳定,建议内地用户使用境内服务器(e.g. 阿里云@上海、腾讯云@广州)
    • 系统镜像可以是 Ubuntu (or minimal) 或 Debian (or minimal)
    • 服务器带宽最好大于等于5Mbps,否则联机游戏会出现延迟
    • 核心数和内存要求不高,根据预算选择即可
    • 非常重要:一定要确认服务器的防火墙规则允许所有外部IP的TCP流量访问服务器5555端口。不知道怎么检查和编辑防火墙规则的朋友,可以提前参考本文最后部分操作
  2. 一台PC with Windows 10。
  3. (可选)SSH客户端:PuTTY,Xshell
  4. 对Linux基础命令不熟悉的可以参考Linux 命令大全 | 菜鸟教程 (runoob.com)

3. 配置服务器

使用SSH客户端或者云服务控制台的webshell登录服务器终端。使用 sudo su 命令进入管理员模式

image-20210925174627955

使用 apt-get 命令更新和安装软件包

1
2
apt-get update
apt-get install build-essential

访问开源软件SoftEther下载页面,按照图示选择后复制箭头所指的下载链接地址

image-20210925175641588

使用 wget url 命令下载server组件,链接可以替换成上面复制的下载链接以下载最新发行版

1
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz

解压缩并构建server组件,注意修改为你自己对应的文件名

1
2
3
tar zxf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
cd vpnserver
make

转到 /usr/local/ 路径并修改对应文件和路径的权限

1
2
3
4
5
6
cd ..
mv vpnserver /usr/local
cd /usr/local/vpnserver/
chmod 600 *
chmod 700 vpncmd
chmod 700 vpnserver

使用vim新建vpnserver配置文件

1
vim /etc/init.d/vpnserver

按小写i进入输入模式,粘贴以下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh
### BEGIN INIT INFO
# Provides: vpnserver
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable Softether by daemon.
### END INIT INFO
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

esc 退出编辑模式,输入 :wq 保存文件并退出。使用下列命令修改读写权限并启动服务,若出现提示 mkdir: cannot create directory ‘/var/lock/subsys’: File exists 可以忽略

1
2
3
4
chmod 755 /etc/init.d/vpnserver
mkdir /var/lock/subsys
update-rc.d vpnserver defaults
/etc/init.d/vpnserver start

命令行输出如图表示服务正常启动:

image-20210925181322493

运行检查程序

1
2
3
4
cd /usr/local/vpnserver/
./vpncmd
3
check

All pass 输出如图:

image-20210925181624220

使用 ctrl + D 退出vpncmd终端,再运行下面的命令配置admin端口和密码

1
2
./vpncmd
1

第一个需要输入的位置输入 127.0.0.1:5555 回车

image-20210925181935202

第二个输入留空,回车,进入命令终端

image-20210925182018389

输入 ServerPasswordSet 回车,设定并确认密码

image-20210925182158470

4. 安装和配置管理终端(Windows10 x64)

访问开源软件SoftEther下载页面,按照图示选择后下载安装包(不需要care是intel还是AMD)

image-20210925182415307

一路默认安装。安装完成后启动软件界面如图:

image-20210925182533182

新建设置,自定义设置名,主机名填云服务器公网IP,端口号选项卡选择5555,右下角输入刚才设置的管理密码。其他设置不动,点击确定

image-20210925182823375

然后弹出窗口(后面每步操作都会不停弹出新的窗口),勾选第一个选项远程访问VPN,下一步

image-20210925183009397

确定初始化选“是”

image-20210925183040300

随便起一个virtual HUB的名字,这里我用了 F1LAN ,点确定

image-20210925183207182

弹出窗口中可以自定义一个好记的动态DNS主机名,也可以留着不动。点击“退出”

  • 重新设置的话要手动点一下“设置上述主机名”
  • 后续客户端连接的时候,可以用公网IP或者这里设置的地址作为主机名
image-20210925183400779

弹出窗口中勾选L2TP over IPsec,点击确定

image-20210925183614137

弹出窗口中禁用VPN Azure,点击确定

image-20210925183706872

弹出窗口中点击“创建用户”

image-20210925183812396

设置好这三个地方。这是接下来你以及其他客户端登录的凭据(只配置一个用户就可以供多个client登录)。设置完点击确定,提示用户已创建完成

image-20210925184055220

关闭用户管理窗口。在管理虚拟HUB界面右下角点击虚拟NAT和DHCP

image-20210925184245287

点击启用SecureNAT,弹出窗口选确定(这是比较简单的方法,还有桥接的方法,优点是CPU占用低,带宽稍大,但配置起来多了几个步骤,想要一步到位的同学在看完下面Part5之后可以继续看Part6的介绍

有些同学ping服务器的时候可能会收到duplicate packet,像我这种强迫症就觉得很不爽,这里可以在“虚拟HUB属性”->"编辑虚拟HUB扩展选项列表"中把“DisableIpRawModeSecureNAT”的值编辑为1。

到这里,服务器端的配置就基本完成了,可以尝试ping一下公网IP地址和SoftEther的DNS主机名查看一下连通性。

image-20210925184827119

5. 客户端设置(Windows10 x64)

你以及其他所有希望加入局域网的设备(人话:用来玩游戏的电脑)上,访问开源软件SoftEther下载页面,按照图示选择后下载安装包(不需要care是intel还是AMD)

image-20210925185033191

一路默认设置安装后启动软件,界面如下

image-20210925185249666

点击添加新的VPN连接会提示需要初始化虚拟适配器,确定并随便起个名字,初始化完成后如图

image-20210925185349938

在添加新的VPN连接配置页面,按照数字顺序填写配置,每一步都非常重要

  1. 设置名随意,用于区分
  2. 主机名可以填写服务器外部IP或者softether中自己设置的主机名,我选择了后者
  3. 端口号在下拉选项中选5555
  4. 虚拟HUB名填写Part4设置管理端的时候自定义的HUB名
  5. 用户名填Part4中自己设置的
  6. 密码同上
  7. 都设置好后进入“高级设置”子菜单
image-20210925185655131

在高级设置中设置TCP连接数为8,并取消勾选SSL加密以提高传输速度(仅限娱乐游戏场景,如果是比较正规的比赛可以不用取消勾选),点击确定。回到连接设置界面,点击确定。

回到主界面,右键或者双击连接VPN

image-20210925190542434

连接成功,自动分配虚拟局域网IP

image-20210925190600841

如果别人反映连不上,你可以再参考本文最后一部分检查一下你自己服务器的防火墙规则

理论上此时就算离线启动steam也已经可以连接虚拟局域网游戏了。

F1 2021 Screenshot 2021.09.25 - 19.08.04.00

6. 补充:桥接方案(可选,第4步不使用SecureNAT的备选方案)

如果前面设置了SecureNAT,这里需要禁用。

image-20210925204604171

回到管理主界面,选择本地网桥设置

image-20210925205015521

按照下述步骤操作,其中HUB选择前面设置的HUB名字,tap名称可以跟我一样设置为soft方便follow后续步骤

image-20210925205159892

确定后,状态应该如下

image-20210925205228976

在服务器终端输入 ifconfig ,找到第一个设备的 inet addr (一般在输出的第二行)也就是内部IP地址,记录备用

image-20210925205511925

使用命令 apt-get install dnsmasq 安装DHCP服务器,以便分配局域网动态IP。

使用命令 vim /etc/dnsmasq.conf 打开DNS配置文件,在最后插入以下三行:

1
2
3
interface=tap_soft
dhcp-range=tap_soft,192.168.7.50,192.168.7.60,12h
dhcp-option=tap_soft,3,192.168.7.1

用命令 rm /etc/init.d/vpnserver 删掉之前的服务器配置文件。然后输入 vim /etc/init.d/vpnserver 建立一个新的配置文件,按i切换输入模式,粘贴如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/sh
### BEGIN INIT INFO
# Provides: vpnserver
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable Softether by daemon.
### END INIT INFO
DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/subsys/vpnserver
TAP_ADDR=192.168.7.1

test -x $DAEMON || exit 0
case "$1" in
start)
$DAEMON start
touch $LOCK
sleep 1
/sbin/ifconfig tap_soft $TAP_ADDR
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
sleep 1
/sbin/ifconfig tap_soft $TAP_ADDR
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

另外不要忘记修改权限,否则无法enable service:

1
chmod 700 /etc/init.d/vpnserver

新建ipv4转发配置 vim /etc/sysctl.d/ipv4_forwarding.conf ,粘贴如下内容

1
net.ipv4.ip_forward = 1

应用sysctl

1
sysctl --system

下面一条指令最后 [YOUR VPS IP ADDRESS] 需要替换成上面记录的内部IP

1
iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -j SNAT --to-source [YOUR VPS IP ADDRESS]

安装ip表持久化工具,系统重启不影响桥接转发

1
apt-get install iptables-persistent

最后用两条命令重启服务,服务器端就配置完成了

1
2
/etc/init.d/vpnserver restart
/etc/init.d/dnsmasq restart

客户端需要修改一下设置,首先右键VPN连接进入属性页面,点击右下方高级设置。按图示确认四个位置的设定:

  • TCP连接数为8
  • 勾选SSL加密
  • 勾选路由器/网桥模式
  • 勾选半双工模式
image-20210925212119935

到这里就ok了,和之前一样,回到主界面右键连接即可。

如果想改回SecureNAT模式,也并不复杂,只需要逐步回滚:

  • 在服务器上删除 /etc/sysctl.d/ipv4_forwarding.conf
  • /etc/init.d/vpnserver/etc/dnsmasq.conf 两个文件改回之前的样子
  • sudo apt-get remove --purge iptables-persistentsudo apt-get remove --purge dnsmasq 卸载iptable持久化和DHCP工具
  • sysctl --system 命令应用修改后的系统配置文件
  • /etc/init.d/vpnserver restart 命令重启VPN server服务
  • 在Windows管理工具->本地网桥设置中删除名为 soft 的本地网桥
  • 在Windows管理工具->管理虚拟HUB中启用SecureNAT
  • 在Windows登录端client连接属性->高级设置中取消勾选“半双工模式”和“路由器/网桥模式”

7. 关于服务器防火墙过滤规则

大部分云服务提供者(我测试的:GCP、阿里云、腾讯云)从安全角度考虑,为实例配置的默认防火墙规则一般不能允许来自任何外部IP的入站流量,这可能会导致你在本机测试一切正常,但别人怎么都连不上VPS。这里我给大家举例看一下怎么检查和修改防火墙规则,需要让服务器允许所有IP的外部TCP流量(至少是通过5555端口)访问你的服务器。

7.1 Google Cloud Platform (GCP)

在控制台中进入如下图所示的“防火墙”管理界面

iXavl7

选择上方“创建防火墙规则”

WVh4Xh

按照图中所示编辑规则后点击下方“创建”,流量方向默认选择“入站”,其他选项不动

fprrWX

规则应用后理论上所有人都可以从5555端口访问你的服务器了

7.2 阿里云

在控制台左侧选择“防火墙”

UeNU4r

右上方选择“添加规则”,在弹出的窗口中如下配置(我这里直接允许所有TCP连接了,比较省事,也可以单独制定端口),点击确定即可

AgciuK

7.3 腾讯云

在控制台上方选择“防火墙”

0u96qV

创建规则,允许全部TCP或者指定端口都可以

CXrylq

其他云服务应该有类似的控制界面,可以自行设置。