Skip to content

SoftEtherVPN

概述

介绍

SoftEtherVPN是开源跨平台,多重协议的虚拟专用网方案,是openvpn最佳替代方案,比openvpn要快,其L2TP VPN与windows、mac、ios和android高度兼容。SoftEtherVPN本身还具有ssl-vpn协议,可以穿透任何类型的防火墙。

特点

安装包部署

前提条件

使用softethervpn构建虚拟局域网时需要具备如下条件:

  • softethervpn节点必须对公网的映射ip;
  • softethervpn节点能和内网server互通;

使用L2TP/IPSec方式实现内部局域网通信

An image

环境依赖

名称环境版本备注
操作系统(服务端)Ubuntu20.04
操作系统(客户端)Windows10
服务端SoftEther VPN ServerVer 4.39, Build 9772, beta
管理端SoftEther VPN ManagerVer 4.39, Build 9772, beta配置SoftEther VPN界面
客户端Windows VPNWindows自带VPN

环境搭建

下载安装包

前往SoftEther 下载中心下载服务端管理端

sh
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.39-9772-beta/softether-vpnserver-v4.39-9772-beta-2022.04.26-linux-x64-64bit.tar.gz

安装服务端

sh
# 安装依赖
sudo apt install make gcc

# 解压安装包
tar -zxvf softether-vpnserver-v4.39-9772-beta-2022.04.26-linux-x64-64bit.tar.gz 

# 编译
cd vpnserver/
make

# 输出
The preparation of SoftEther VPN Server is completed !

注意:ubuntu系统必须使用root权限操作上述步骤,否则会因权限不足导致端口无法开放!!!

启动服务端

sh
# 启动
./vpnserver start

# 输出
The SoftEther VPN Server service has been started.

Let's get started by accessing to the following URL from your PC:

https://10.0.0.121:5555/
  or
https://10.0.0.121/

Note: IP address may vary. Specify your server's IP address.
A TLS certificate warning will appear because the server uses self signed certificate by default. That is natural. Continue with ignoring the TLS warning.

配置systemd管理

如Linux服务端上没有安装 systemd,可以使用 yumapt 等命令安装 systemd

sh
# yum
yum install systemd
# apt
apt install systemd

使用文本编辑器,如 vim 创建并编辑 vpnserver.service 文件。

sh
vim /etc/systemd/system/vpnserver.service

写入内容

ini
[Unit]
# 服务的描述
Description=VpnServer
# 服务依赖—在什么服务之后启动,一般为在网络服务启动后启动
After=network.target

[Service]
# 服务类型—如果是shell脚本的方式,则Type=forking,否则不指定作何值(也就是去掉该配置项)
Type=forking

# 启动命令
ExecStart=/usr/local/vpnserver/vpnserver start
# 停止命令
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target

使用 systemd 命令,管理 vpnserver

sh
# 启动frp
systemctl start vpnserver
# 停止frp
systemctl stop vpnserver
# 重启frp
systemctl restart vpnserver
# 查看frp状态
systemctl status vpnserver
# 开机启动
systemctl enable vpnserver

连接服务端

在windows系统中,启动管理端

An image

首次连接无需输入密码,点击连接会提示设置新密码

An image

进入简单安装界面,勾选远程访问 VPN Server 并创建一个虚拟HUB,名称随意

An image

动态 DNS 功能,保持不变

An image

启用 L2TP 服务器功能,并设置 IPsec 预共享密钥(尽可能复杂,客户端连接时会使用到)

An image

禁用 VPN Azure 服务

An image

创建新用户,设置用户名和密码

An image

启用 SecureNAT 功能,暂时默认配置即可,后续会提供优化方案

An image

客户端连接

填写服务器名称或地址(自定义),VPN类型选择L2TP/IPsec,预共享密钥、用户名和密码需填写正确

An image

连接成功

An image

Docker部署

前提条件

使用softethervpn构建虚拟局域网时需要具备如下条件:

  • softethervpn节点必须对公网的映射ip;
  • softethervpn节点能和内网server互通;

使用L2TP/IPSec方式实现内部局域网通信

An image

环境依赖

名称环境版本备注
操作系统(服务端)Ubuntu20.04
操作系统(客户端)Windows10
服务端SoftEther VPN ServerVer 4.39, Build 9772, beta
管理端SoftEther VPN ManagerVer 4.39, Build 9772, beta配置SoftEther VPN界面
客户端Windows VPNWindows自带VPN
容器Dockerversion 24.0.5, build ced0996
容器编排Docker-composeversion 1.29.2, build 5becea4c

环境搭建

dockerhub:siomiz/softethervpn

生成服务配置文件

sh
# 创建数据目录
mkdir -p softethervpn/data/{server_log,packet_log,security_log} && cd softethervpn/

# 生成用户账户配置文件;
sudo docker pull siomiz/softethervpn:4.39
sudo docker run --rm siomiz/softethervpn:4.39 gencert > softethervpn_env

# 配置服务参数
# sudo vim softethervpn_env
TZ=Asia/Shanghai   # 设置时区
PSK=vpn  # 预共享密钥,设置复杂一点就好
SPW=test # 管理端密码
USERS=user1:admin@123;user2:admin@456 # 账户:密码,多个账号用";"隔开即可

构建compose文件

sh
# 添加compose文件
cat > docker-compose.yml <<eof
version: "3.9"
services:
  vpn:
    image: "siomiz/softethervpn:4.39"
    container_name: softethervpn
    privileged: true
    cap_add:
      - NET_ADMIN
    volumes:
      - "./data/server_log:/usr/vpnserver/server_log"
      - "./data/packet_log:/usr/vpnserver/packet_log"
      - "./data/security_log:/usr/vpnserver/security_log"
      - /etc/localtime:/etc/localtime
    env_file:
      - "./softethervpn_env"
    ports:
      # 公网放行vpn节点的500、1701、4500三个端口的udp协议策略;
      - 5555:5555/tcp
      - 500:500/udp
      - 4500:4500/udp
      - 1701:1701/udp
eof

# 启动服务
docker compose up -d

源码编译

下载源码

前往SoftEther 下载中心 (opens new window)下载源码

sh
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.39-9772-beta/softether-src-v4.39-9772-beta.tar.gz

安装编译依赖

Centos

sh
# 安装依赖
yum -y groupinstall "Development Tools"
yum -y install readline-devel ncurses-devel openssl-devel

# 解压
tar -zxvf softether-src-v4.39-9772-beta.tar.gz
cd v4.39-9772/
./configure
make

Debian

sh
# 安装依赖
sudo apt-get install gcc make libssl-dev libreadline-dev zlib1g-dev -y

# 解压
tar -zxvf softether-src-v4.39-9772-beta.tar.gz
cd v4.39-9772/
./configure
make

编译成功

sh
taketo@ubuntu:~/package/v4.39-9772$ ll bin/vpnserver/
total 4436
drwxrwxr-x 2 taketo taketo    4096 Oct  7 14:31 ./
drwxrwxr-x 6 taketo taketo    4096 Oct  7 14:30 ../
-rw------- 1 taketo taketo 2009296 Oct  7 14:31 hamcore.se2
-rwxrwxr-x 1 taketo taketo 2519200 Oct  7 14:31 vpnserver*

破除拆分隧道限制

Split Tunneling (拆分隧道),是 SoftEtherVPN 中比较强悍的一个功能。具体位置在SecureNAT配置界面就可以找到。

An image

但是对于SoftetherVPN 来说,拆分隧道功能并不适合官方下载的版本,从网上查到的信息,某些地区不可以使用该功能在内的一部分功能(当然仅限于官方下载的编译好的版本,对于自己进行源码编译是不限制的)

An image

下载源码后,解压后在v4.39-9772/src/Cedar路径下找到Server.c文件修改。

c
bool SiIsEnterpriseFunctionsRestrictedOnOpenSource(CEDAR *c)
{
        char region[128];
        bool ret = false;
        // Validate arguments
        if (c == NULL)
        {
                return false;
        }


        SiGetCurrentRegion(c, region, sizeof(region));

        if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0)
        {
                ret = true; //将true改为false即可。
        }

        return ret;
}

重新编译后即可破除限制。

拆分隧道

远程网关与本地网关

对于VPN来说,存在远程网关与本地网关的概念,以下图以SoftEther VPN 的 SecureNAT 配置为例,接入VPN后本地路由表的对比 。

  • 如果使用远程网关,默认路由均走VPN隧道,这样VPN服务器压力较大,而且日常的网络访问都需要从VPN服务器作为出口,很显然作为远程接入公司网络该场景使用不太合理
  • 如果使用本地网关,默认路由走的是本地的网络出口

An image

本地网关配合静态路由

如果单纯的使用本地网关,是无法直接访问到异地的内网地址的,缺少了一步静态路由。

比如使用本地网关的情况下,公司内网存在一个地址为 192.168.7.5 , 连接VPN后,tracert一下,如图所示,经过几跳以后,在公网直接超时了。

An image

此时我们只需要把VPN分配的虚拟网络的网关,(图中192.168.200.1 就是通过虚拟局域网前往异地内网的网关),作为本地的一条静态路由,指向如果走7网段直接通过网关192.168.200.1,添加后再次tracert 一下, 可以看到直接通过远程网关访问到了异地内网的机器

An image

所以如果使用本地网关,我们需要进行一次静态路由的添加,这里存在的问题也显而易见

  • 不添加为本机永久路由,需要每次机器重启后手动添加路由
  • 添加为本机永久路由,可能会在某些网络环境下造成地址冲突等情况

Split Tunneling

Split Tunneling (拆分隧道),是SoftEther-VPN中比较强悍的一个功能。具体位置在SecureNAT配置界面就可以找到。

简单来讲 拆分隧道可以理解为推送静态路由,接入 VPN 以后,server端会推送设置的静态路由到client端,断开VPN后,推送的静态路由失效,完美的解决了上述问题带来的痛点。

但是对于Softether VPN来说,拆分隧道功能并不适合官方下载的版本,从网上查到的信息,某些地区不可以使用该功能在内的一部分功能(当然仅限于官方下载的编译好的版本,对于自己进行源码编译是不限制的)

Softether VPN破除限制参考

配置SecureNAT

清除默认网关地址

An image

配置静态路由表

假设内外 IP 为192.168.31.0网段,255.255.255.0为内网子网掩码,这里的192.168.30.1为虚拟主机网络接口。

An image

设置不使用远程默认网关

An image