1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-07-10 17:54:58 +03:00

31 Commits

Author SHA1 Message Date
d788bb033e Merge 10a2806f12 into a4c3713f4b 2025-02-17 10:35:53 +08:00
a4c3713f4b Merge pull request #2104 from chipitsine/docker_ci_followup
Docker ci followup
2025-02-16 21:32:49 +01:00
abc516757e CI: mention temporary qemu version pin 2025-02-16 20:58:30 +01:00
3fee01e1cf CI: limit docker ci to SoftEtherVPN repo only 2025-02-16 20:56:47 +01:00
b3dfdc2ad0 Merge pull request #2102 from weidi/docker-ci
build arm and x86 as one tag
2025-02-16 20:53:28 +01:00
8d06ac3348 Merge pull request #2103 from chipitsine/modernize_freebsd
CI: cirrus-ci: bump FreeBSD image to 14-2
2025-02-16 18:32:08 +01:00
9d1c3306e0 CI: cirrus-ci: bump FreeBSD image to 14-2 2025-02-16 17:41:05 +01:00
7729966c50 Add README and remove no longer required Actions 2025-02-16 16:49:25 +01:00
591cf0e9b9 run all build sequentially, should help with caching layers 2025-02-10 21:40:34 +01:00
39996ab0a2 build arm and x86 as one tag 2025-02-10 21:16:41 +01:00
f525b4d660 Merge pull request #2101 from chipitsine/master
CI: move docker build machinery to the main repo
2025-02-10 19:59:22 +01:00
a081fdd5c8 CI: move docker build machinery to the main repo
more details: https://github.com/SoftEtherVPN/SoftetherVPN-docker/issues/4
2025-02-09 23:32:26 +01:00
10a2806f12 CI: Use system's cpu_features in FreeBSD CI 2025-01-15 17:09:18 +09:00
2628ac1884 Merge pull request #2091 from siddharth-narayan/oqs-submodule-update
Update liboqs and oqs-provider submodules - Add X25519MLKEM768 NIST f…
2025-01-15 07:22:50 +01:00
972256c578 Update liboqs and oqs-provider submodules - Add X25519MLKEM768 NIST finalized PQ Key exchange 2025-01-14 17:37:55 -06:00
e2e8193495 Improve the usage of cpu_features
- Add USE_SYSTEM_CPU_FEATURES flag to use system's cpu_features
  instead of the bundled one
- Allow the use of cpu_features for more architectures on Linux [1]

[1] https://github.com/google/cpu_features/tree/v0.9.0?tab=readme-ov-file#whats-supported
2025-01-14 22:58:20 +09:00
71b6aa7a8c Update cpu_features to 0.9.0 2025-01-14 18:09:18 +09:00
8be6d756b8 Merge pull request #2089 from metalefty/drop_exec
Drop unnecessary exec permission
2025-01-14 07:36:11 +01:00
a6c5f0d135 Drop unnecessary exec permission 2025-01-14 14:35:34 +09:00
c2487c6b2e Merge pull request #2086 from Mastemmah/ArtifactsPublising
Adding artifact publishing for Linux
2025-01-07 11:26:05 +01:00
817214da1f Adding artifact publishing for Linux
Simple Workflow change to download deb packages created within the Linux workflow
2025-01-07 00:13:06 +01:00
015f93f7b7 Merge pull request #2082 from chipitsine/master
stbchecker: modernize .net version
2024-12-15 01:18:01 +01:00
cdd3bddcc6 stbchecker: modernize .net version 2024-12-15 00:55:46 +01:00
0a1f0913d9 Merge pull request #2081 from chipitsine/master
CI: modernize macos versions
2024-12-15 00:49:45 +01:00
18cbd4627a CI: modernize macos versions 2024-12-15 00:25:35 +01:00
e475d70c0b Merge pull request #2056 from nynauy/nynauy-systemd-patch
Correct and simplify systemd service files
2024-09-24 16:47:23 +02:00
e94240d9a0 Merge pull request #2033 from siddharth-narayan/nt-fix
Fix "Not on NT" error message and add uihelp to vpncmd
2024-09-21 21:59:10 +02:00
023eb3465d Correct and simplify systemd service files
Remove unnecessary wrappers and change to start services directly. Also remove misused "EnvironmentFile" and unrecommended "KillMode=process".
2024-09-17 07:03:19 +08:00
27d233a522 Merge branch 'SoftEtherVPN:master' into nt-fix 2024-08-15 04:28:13 -04:00
128fefc63e Add UI helper to vpncmd on Windows 2024-08-15 04:26:15 -04:00
3a25c6bf73 Fix incorrect "Not on NT" error messages 2024-07-17 15:16:11 -07:00
23 changed files with 343 additions and 28 deletions

View File

@ -11,12 +11,12 @@ FreeBSD_task:
SSL: SSL:
matrix: matrix:
freebsd_instance: freebsd_instance:
image_family: freebsd-14-0 image_family: freebsd-14-2
prepare_script: prepare_script:
- pkg install -y pkgconf cmake git libsodium $SSL - pkg install -y pkgconf cmake git libsodium cpu_features $SSL
- git submodule update --init --recursive - git submodule update --init --recursive
configure_script: configure_script:
- ./configure - CMAKE_FLAGS="-DUSE_SYSTEM_CPU_FEATURES=1" CFLAGS="-I/usr/local/include/cpu_features" ./configure
build_script: build_script:
- make -j $(sysctl -n hw.ncpu || echo 4) -C build - make -j $(sysctl -n hw.ncpu || echo 4) -C build
test_script: test_script:

98
.github/workflows/docker-aio.yml vendored Normal file
View File

@ -0,0 +1,98 @@
name: docker-aio
on:
push:
branches:
- 'master'
tags:
- '*'
pull_request:
workflow_dispatch:
jobs:
docker:
name: docker-aio
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
steps:
-
name: Docker meta vpnserver
id: metavpnserver
uses: docker/metadata-action@v5
with:
images: softethervpn/vpnserver
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
-
name: Docker meta vpnclient
id: metavpnclient
uses: docker/metadata-action@v5
with:
images: softethervpn/vpnclient
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
-
name: Docker meta vpnbridge
id: metavpnbridge
uses: docker/metadata-action@v5
with:
images: softethervpn/vpnbridge
tags: |
type=raw,value=latest,enable={{is_default_branch}}
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
-
name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:qemu-v9.2.0
#
# TODO: unpin qemu version after default is updated
#
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
name: Login to DockerHub
if: ${{ github.event_name != 'pull_request' }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build and push vpnserver
uses: docker/build-push-action@v6
with:
file: ./Dockerfile
target: vpnserver
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
-
name: Build and push vpnclient
uses: docker/build-push-action@v6
with:
file: ./Dockerfile
target: vpnclient
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
-
name: Build and push vpnbridge
uses: docker/build-push-action@v6
with:
file: ./Dockerfile
target: vpnbridge
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View File

@ -26,6 +26,13 @@ jobs:
cd build cd build
cpack -C Release -G DEB cpack -C Release -G DEB
- name: Upload DEB packages as artifacts
if: github.ref == 'refs/heads/master'
uses: actions/upload-artifact@v4
with:
name: deb-packages
path: build/*.deb
- name: Test - name: Test
run: | run: |
.ci/appveyor-deb-install-test.sh .ci/appveyor-deb-install-test.sh

View File

@ -7,7 +7,7 @@ jobs:
build_and_test: build_and_test:
strategy: strategy:
matrix: matrix:
os: [macos-14, macos-13, macos-12] os: [macos-15, macos-14, macos-13]
name: ${{ matrix.os }} name: ${{ matrix.os }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:

104
ContainerREADME.md Normal file
View File

@ -0,0 +1,104 @@
# SoftetherVPN Container images
This container is designed to be as small as possible and host a SoftEther VPN Server, Bridge or Client.
It´s based on Alpine so resulting Image is kept as small as 15MB!
## Not working
* bridging to a physical Ethernet adapter
## working
* OpenVPN
* L2tp
* SSL
* SecureNAT
* Wireguard (not with the "stable" tag)
## Available Tags
|Image|Description|
|---|---|
|softethervpn/vpnserver:stable|Latest stable release from https://github.com/SoftEtherVPN/SoftEtherVPN_Stable|
|softethervpn/vpnserver:v4.39-9772-beta|Tagged build|
|softethervpn/vpnserver:latest|Latest commits from https://github.com/SoftEtherVPN/SoftEtherVPN|
You should always specify your wanted version like `softethervpn/vpnserver:5.02.5180`
## Usage docker run
This will keep your config and Logfiles in the docker volume `softetherdata`
`docker run -d --rm --name softether-vpn-server -v softetherdata:/var/lib/softether -v softetherlogs:/var/log/softether -p 443:443/tcp -p 992:992/tcp -p 1194:1194/udp -p 5555:5555/tcp -p 500:500/udp -p 4500:4500/udp -p 1701:1701/udp --cap-add NET_ADMIN softethervpn/vpnserver:stable`
## Port requirements
As there are different operating modes for SoftetherVPN there is a variety of ports that might or might not be needed.
For operation with Softether Clients at least 443, 992 or 5555 is needed.
See https://www.softether.org/4-docs/1-manual/1/1.6 for reference on the Softether ports.
Others are commented out in the docker-compose example.
## Usage docker-compose
The same command can be achieved by docker-compose, the docker compose file is in the repository.
You can specify the respective docker-compose.yaml like so:
`docker-compose -f docker-compose.vpnclient.yaml up -d`
By default the docker-compose.yaml is used:
```
version: '3'
services:
softether:
image: softethervpn/vpnserver:latest
cap_add:
- NET_ADMIN
restart: always
ports:
#- 53:53 #DNS tunneling
- 443:443 #Management and HTTPS tunneling
#- 992:992 #HTTPS tunneling
#- 1194:1194/udp #OpenVPN
#- 5555:5555 #HTTPS tunneling
#- 500:500/udp #IPsec/L2TP
#- 4500:4500/udp #IPsec/L2TP
#- 1701:1701/udp #IPsec/L2TP
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "/etc/timezone:/etc/timezone:ro"
- "./softether_data:/var/lib/softether"
- "./softether_log:/var/log/softether"
# - "./adminip.txt:/var/lib/softether/adminip.txt:ro"
```
### Use vpncmd
With newer releases vpncmd is directly in the container so you can use it to configure vpn. You can can run it once the container is running :
`docker exec -it softether-vpn-server vpncmd localhost`
example to configure a vpnclient
```
docker exec -it softether-vpn-server vpncmd localhost /client
VPN Client> AccountSet homevpn /SERVER:192.168.1.1:443 /HUB:VPN
VPN Client> AccountPasswordSet homevpn /PASSWORD:verysecurepassword /TYPE:standard
VPN Client> AccountConnect homevpn
#Automatically connect once container starts
VPN Client> AccountStartupSet homevpn
#Checking State
VPN Client> AccountStatusGet homevpn
```
## Building
` docker build --target vpnclient -t softethevpn:latest .`

51
Dockerfile Normal file
View File

@ -0,0 +1,51 @@
FROM alpine AS builder
RUN mkdir /usr/local/src && apk add binutils --no-cache\
linux-headers \
build-base \
readline-dev \
openssl-dev \
ncurses-dev \
git \
cmake \
zlib-dev \
libsodium-dev \
gnu-libiconv
ENV LD_PRELOAD=/usr/lib/preloadable_libiconv.so
ADD ./ /usr/local/src/SoftEtherVPN/
WORKDIR /usr/local/src
ENV USE_MUSL=YES
ENV CMAKE_FLAGS="-DSE_PIDDIR=/run/softether -DSE_LOGDIR=/var/log/softether -DSE_DBDIR=/var/lib/softether"
RUN cd SoftEtherVPN &&\
./configure &&\
make -j $(getconf _NPROCESSORS_ONLN) -C build
FROM alpine AS base
RUN apk add --no-cache readline \
openssl \
libsodium \
gnu-libiconv \
iptables
ENV LD_PRELOAD=/usr/lib/preloadable_libiconv.so
WORKDIR /usr/local/bin
VOLUME /var/log/softether
VOLUME /var/lib/softether
VOLUME /run/softether
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpncmd /usr/local/src/SoftEtherVPN/build/hamcore.se2 ./
COPY --from=builder /usr/local/src/SoftEtherVPN/build/libcedar.so /usr/local/src/SoftEtherVPN/build/libmayaqua.so /usr/local/lib/
FROM base AS vpnserver
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnserver ./
EXPOSE 443/tcp 992/tcp 1194/tcp 1194/udp 5555/tcp 500/udp 4500/udp
CMD ["/usr/local/bin/vpnserver", "execsvc"]
FROM base AS vpnclient
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnclient ./
CMD ["/usr/local/bin/vpnclient", "execsvc"]
FROM base AS vpnbridge
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnbridge ./
CMD ["/usr/local/bin/vpnbridge", "execsvc"]

View File

@ -211,6 +211,10 @@ Also SoftEther VPN [Stable Edition](https://www.freshports.org/security/softethe
Those can be found under https://www.softether-download.com/ Those can be found under https://www.softether-download.com/
There you can also find SoftEtherVPN source code in zip and tar formats. There you can also find SoftEtherVPN source code in zip and tar formats.
## Docker Container Image
Please look at the [ContainerREADME.md](ContainerREADME.md)
## Build from Source code ## Build from Source code
see [BUILD_UNIX](src/BUILD_UNIX.md) or [BUILD_WINDOWS](src/BUILD_WINDOWS.md) see [BUILD_UNIX](src/BUILD_UNIX.md) or [BUILD_WINDOWS](src/BUILD_WINDOWS.md)

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@ -0,0 +1,16 @@
version: '3'
services:
softether:
image: softethervpn/vpnclient:latest
devices:
- /dev/net/tun:/dev/net/tun
cap_add:
- NET_ADMIN
restart: always
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "/etc/timezone:/etc/timezone:ro"
- "./softether_data:/var/lib/softether"
- "./softether_log:/var/log/softether"
# - "./adminip.txt:/var/lib/softether/adminip.txt:ro"

23
docker-compose.yaml Normal file
View File

@ -0,0 +1,23 @@
version: '3'
services:
softether:
image: softethervpn/vpnserver:latest
cap_add:
- NET_ADMIN
restart: always
ports:
#- 53:53 #DNS tunneling
- 443:443 #Management and HTTPS tunneling
- 992:992 #HTTPS tunneling
#- 1194:1194/udp #OpenVPN
#- 5555:5555 #HTTPS tunneling
#- 500:500/udp #IPsec/L2TP
#- 4500:4500/udp #IPsec/L2TP
#- 1701:1701/udp #IPsec/L2TP
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "/etc/timezone:/etc/timezone:ro"
- "./softether_data:/var/lib/softether"
- "./softether_log:/var/log/softether"
# - "./adminip.txt:/var/lib/softether/adminip.txt:ro"

View File

@ -127,6 +127,9 @@ if(UNIX)
if(SE_PIDDIR) if(SE_PIDDIR)
add_definitions(-DSE_PIDDIR="${SE_PIDDIR}") add_definitions(-DSE_PIDDIR="${SE_PIDDIR}")
endif() endif()
# Use system libraries instead of bundled
set(USE_SYSTEM_CPU_FEATURES false CACHE BOOL "Use system cpu_features")
endif() endif()
# Cedar communication module # Cedar communication module

View File

@ -109,8 +109,21 @@ if(UNIX)
$<$<BOOL:${LIB_RT}>:${LIB_RT}> $<$<BOOL:${LIB_RT}>:${LIB_RT}>
) )
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv7l|aarch64|s390x)$" OR NOT HAVE_SYS_AUXV OR SKIP_CPU_FEATURES) if (NOT HAVE_SYS_AUXV OR SKIP_CPU_FEATURES)
add_definitions(-DSKIP_CPU_FEATURES) add_definitions(-DSKIP_CPU_FEATURES)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" AND NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(amd64|i386)")
message("cpu_features is not available on FreeBSD/${CMAKE_SYSTEM_PROCESSOR}")
add_definitions(-DSKIP_CPU_FEATURES)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_NAME MATCHES "^(arm64|x86_64)")
# macOS runs only on Intel or ARM architecrues, should not reach here
add_definitions(-DSKIP_CPU_FEATURES)
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "SunOS" OR ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
message("cpu_features is not available on ${CMAKE_SYSTEM_NAME}")
add_definitions(-DSKIP_CPU_FEATURES)
elseif(USE_SYSTEM_CPU_FEATURES)
CHECK_INCLUDE_FILE(cpu_features_macros.h HAVE_CPU_FEATURES)
message("-- Using system's cpu_features")
target_link_libraries(mayaqua PRIVATE cpu_features)
else() else()
add_subdirectory(3rdparty/cpu_features) add_subdirectory(3rdparty/cpu_features)
set_property(TARGET cpu_features PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET cpu_features PROPERTY POSITION_INDEPENDENT_CODE ON)

View File

@ -4259,7 +4259,7 @@ UINT MsService(char *name, SERVICE_FUNCTION *start, SERVICE_FUNCTION *stop, UINT
if ((mode == SVC_MODE_INSTALL || mode == SVC_MODE_UNINSTALL || mode == SVC_MODE_START || if ((mode == SVC_MODE_INSTALL || mode == SVC_MODE_UNINSTALL || mode == SVC_MODE_START ||
mode == SVC_MODE_STOP || mode == SVC_MODE_SERVICE) && mode == SVC_MODE_STOP || mode == SVC_MODE_SERVICE) &&
(ms->IsNt == false)) (IsNt() == false))
{ {
// Tried to use the command for the NT in non-WindowsNT system // Tried to use the command for the NT in non-WindowsNT system
MsgBox(NULL, MB_ICONSTOP, _UU("SVC_NT_ONLY")); MsgBox(NULL, MB_ICONSTOP, _UU("SVC_NT_ONLY"));

View File

@ -170,7 +170,6 @@ typedef struct MS
{ {
HINSTANCE hInst; HINSTANCE hInst;
HINSTANCE hKernel32; HINSTANCE hKernel32;
bool IsNt;
bool IsAdmin; bool IsAdmin;
HANDLE hCurrentProcess; HANDLE hCurrentProcess;
UINT CurrentProcessId; UINT CurrentProcessId;

View File

@ -60,7 +60,7 @@ struct DYN_VALUE
#define DEFAULT_CIPHER_LIST "ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:ECDHE+AES256:DHE+AES256:RSA+AES" #define DEFAULT_CIPHER_LIST "ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:ECDHE+AES256:DHE+AES256:RSA+AES"
#if OPENSSL_VERSION_NUMBER >= 0x30000000L #if OPENSSL_VERSION_NUMBER >= 0x30000000L
#define PQ_GROUP_LIST "p521_kyber1024:x25519_kyber768:P-521:X25519:P-256" #define PQ_GROUP_LIST "X25519MLKEM768:p521_kyber1024:x25519_kyber768:P-521:X25519:P-256"
#endif #endif
// SSL logging function // SSL logging function

0
src/Mayaqua/Unix.c Executable file → Normal file
View File

View File

@ -6,7 +6,9 @@
// VPN Command Line Management Utility // VPN Command Line Management Utility
#include "Cedar/Cedar.h" #include "Cedar/Cedar.h"
#ifdef OS_WIN32
#include "Cedar/CMInner.h"
#endif
#include "Cedar/Command.h" #include "Cedar/Command.h"
#include "Mayaqua/Internat.h" #include "Mayaqua/Internat.h"
@ -39,6 +41,10 @@ int main(int argc, char *argv[])
#endif #endif
InitCedar(); InitCedar();
#ifdef OS_WIN32
CmExecUiHelperMain();
#endif
s = GetCommandLineUniStr(); s = GetCommandLineUniStr();
if (s == NULL) if (s == NULL)

View File

@ -4,11 +4,8 @@ After=network.target auditd.service
ConditionPathExists=!@DIR@/softether/vpnbridge/do_not_run ConditionPathExists=!@DIR@/softether/vpnbridge/do_not_run
[Service] [Service]
Type=forking Type=exec
EnvironmentFile=-@DIR@/softether/vpnbridge ExecStart=@DIR@/softether/vpnbridge/vpnbridge execsvc
ExecStart=@DIR@/softether/vpnbridge/vpnbridge start
ExecStop=@DIR@/softether/vpnbridge/vpnbridge stop
KillMode=process
Restart=on-failure Restart=on-failure
# Hardening # Hardening

View File

@ -4,11 +4,8 @@ After=network.target auditd.service
ConditionPathExists=!@DIR@/softether/vpnclient/do_not_run ConditionPathExists=!@DIR@/softether/vpnclient/do_not_run
[Service] [Service]
Type=forking Type=exec
EnvironmentFile=-@DIR@/softether/vpnclient ExecStart=@DIR@/softether/vpnclient/vpnclient execsvc
ExecStart=@DIR@/softether/vpnclient/vpnclient start
ExecStop=@DIR@/softether/vpnclient/vpnclient stop
KillMode=process
Restart=on-failure Restart=on-failure
# Hardening # Hardening

View File

@ -4,12 +4,9 @@ After=network.target auditd.service
ConditionPathExists=!@DIR@/softether/vpnserver/do_not_run ConditionPathExists=!@DIR@/softether/vpnserver/do_not_run
[Service] [Service]
Type=forking Type=exec
TasksMax=infinity TasksMax=infinity
EnvironmentFile=-@DIR@/softether/vpnserver ExecStart=@DIR@/softether/vpnserver/vpnserver execsvc
ExecStart=@DIR@/softether/vpnserver/vpnserver start
ExecStop=@DIR@/softether/vpnserver/vpnserver stop
KillMode=process
Restart=on-failure Restart=on-failure
# Hardening # Hardening