mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-04-03 18:00:08 +03:00
Compare commits
13 Commits
c8d2fff2dc
...
ea0302cb2c
Author | SHA1 | Date | |
---|---|---|---|
|
ea0302cb2c | ||
|
48042cfbc1 | ||
|
a7a7eef82b | ||
|
a4c3713f4b | ||
|
abc516757e | ||
|
3fee01e1cf | ||
|
b3dfdc2ad0 | ||
|
8d06ac3348 | ||
|
9d1c3306e0 | ||
|
7729966c50 | ||
|
591cf0e9b9 | ||
|
39996ab0a2 | ||
|
a366bdbf02 |
@ -11,7 +11,7 @@ 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 $SSL
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
|
98
.github/workflows/docker-aio.yml
vendored
Normal file
98
.github/workflows/docker-aio.yml
vendored
Normal 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: ${{ github.repository_owner }}/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: ${{ github.repository_owner }}/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: ${{ github.repository_owner }}/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.metavpnserver.outputs.tags }}
|
||||||
|
labels: ${{ steps.metavpnserver.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.metavpnclient.outputs.tags }}
|
||||||
|
labels: ${{ steps.metavpnclient.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.metavpnbridge.outputs.tags }}
|
||||||
|
labels: ${{ steps.metavpnbridge.outputs.labels }}
|
59
.github/workflows/docker-vpnbridge.yml
vendored
59
.github/workflows/docker-vpnbridge.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: docker-vpnbridge
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docker-vpnbridge:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
variant: [
|
|
||||||
{ name: amd64, platform: "linux/amd64", repo: "softethervpn/vpnbridge" },
|
|
||||||
{ name: arm64, platform: "linux/arm64", repo: "softethervpn/vpnbridge-arm64" }
|
|
||||||
]
|
|
||||||
name: vpnbridge/${{ matrix.variant.name }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
|
|
||||||
steps:
|
|
||||||
-
|
|
||||||
name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ matrix.variant.repo }}
|
|
||||||
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
|
|
||||||
-
|
|
||||||
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
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
file: ./Dockerfile
|
|
||||||
target: vpnbridge
|
|
||||||
platforms: ${{ matrix.variant.platform }}
|
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
59
.github/workflows/docker-vpnclient.yml
vendored
59
.github/workflows/docker-vpnclient.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: docker-vpnclient
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docker-vpnclient:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
variant: [
|
|
||||||
{ name: amd64, platform: "linux/amd64", repo: "softethervpn/vpnclient" },
|
|
||||||
{ name: arm64, platform: "linux/arm64", repo: "softethervpn/vpnclient-arm64" }
|
|
||||||
]
|
|
||||||
name: vpnclient/${{ matrix.variant.name }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
|
|
||||||
steps:
|
|
||||||
-
|
|
||||||
name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ matrix.variant.repo }}
|
|
||||||
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
|
|
||||||
-
|
|
||||||
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
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
file: ./Dockerfile
|
|
||||||
target: vpnclient
|
|
||||||
platforms: ${{ matrix.variant.platform }}
|
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
59
.github/workflows/docker-vpnserver.yml
vendored
59
.github/workflows/docker-vpnserver.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: docker-vpnserver
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
tags:
|
|
||||||
- '*'
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docker:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
variant: [
|
|
||||||
{ name: amd64, platform: "linux/amd64", repo: "softethervpn/vpnserver" },
|
|
||||||
{ name: arm64, platform: "linux/arm64", repo: "softethervpn/vpnserver-arm64" }
|
|
||||||
]
|
|
||||||
name: vpnserver/${{ matrix.variant.name }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
|
|
||||||
steps:
|
|
||||||
-
|
|
||||||
name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ matrix.variant.repo }}
|
|
||||||
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
|
|
||||||
-
|
|
||||||
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
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
file: ./Dockerfile
|
|
||||||
target: vpnserver
|
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
|
||||||
platforms: ${{ matrix.variant.platform }}
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
104
ContainerREADME.md
Normal file
104
ContainerREADME.md
Normal 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 .`
|
@ -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)
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.</li>
|
<li>Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.</li>
|
||||||
<li>If you want to completely disable the JSON-RPC on your VPN Server, set the <code>DisableJsonRpcWebApi</code> variable to <code>true</code> on the <code>vpn_server.config</code>.</li>
|
<li>If you want to completely disable the JSON-RPC on your VPN Server, set the <code>DisableJsonRpcWebApi</code> variable to <code>true</code> on the <code>vpn_server.config</code>.</li>
|
||||||
|
<li>You may also restrict access to JSON-RPC API to a specific subnet, e.g. your internal network, by setting the <code>JsonRpcWebApiAllowedSubnet</code> variable to, for example, <code>192.168.0.0/16</code>.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3 id="json-rpc-specification">JSON-RPC specification</h3>
|
<h3 id="json-rpc-specification">JSON-RPC specification</h3>
|
||||||
<p>You must use HTTPS 1.1 <code>POST</code> method to call each of JSON-RPC APIs.<br />
|
<p>You must use HTTPS 1.1 <code>POST</code> method to call each of JSON-RPC APIs.<br />
|
||||||
|
@ -25,6 +25,7 @@ https://<vpn_server_hostname>:<port>/api/
|
|||||||
|
|
||||||
- Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
|
- Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
|
||||||
- If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`.
|
- If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`.
|
||||||
|
- You may also restrict access to JSON-RPC API to a specific subnet, e.g. your internal network, by setting the `JsonRpcWebApiAllowedSubnet` variable to, for example, `192.168.0.0/16`.
|
||||||
|
|
||||||
|
|
||||||
### JSON-RPC specification
|
### JSON-RPC specification
|
||||||
|
@ -25,6 +25,7 @@ https://<vpn_server_hostname>:<port>/api/
|
|||||||
|
|
||||||
- Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
|
- Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
|
||||||
- If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`.
|
- If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`.
|
||||||
|
- You may also restrict access to JSON-RPC API to a specific subnet, e.g. your internal network, by setting the `JsonRpcWebApiAllowedSubnet` variable to, for example, `192.168.0.0/16`.
|
||||||
|
|
||||||
|
|
||||||
### JSON-RPC specification
|
### JSON-RPC specification
|
||||||
|
@ -5740,6 +5740,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
UINT num = 0, max = 19;
|
UINT num = 0, max = 19;
|
||||||
SERVER *server;
|
SERVER *server;
|
||||||
char *vpn_http_target = HTTP_VPN_TARGET2;
|
char *vpn_http_target = HTTP_VPN_TARGET2;
|
||||||
|
bool disableJsonRpcWebApi;
|
||||||
// Validate arguments
|
// Validate arguments
|
||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
{
|
{
|
||||||
@ -5750,6 +5751,15 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
|
|
||||||
s = c->FirstSock;
|
s = c->FirstSock;
|
||||||
|
|
||||||
|
disableJsonRpcWebApi = server->DisableJsonRpcWebApi;
|
||||||
|
if (!disableJsonRpcWebApi && !IsZeroIP(&server->JsonRpcWebApiAllowedSubnetAddr)
|
||||||
|
&& !IsZeroIP(&server->JsonRpcWebApiAllowedSubnetMask)) {
|
||||||
|
// restrict JSON-RPC Web API to specified subnet only
|
||||||
|
if (!IsInSameNetwork(&s->RemoteIP, &server->JsonRpcWebApiAllowedSubnetAddr, &server->JsonRpcWebApiAllowedSubnetMask)) {
|
||||||
|
disableJsonRpcWebApi = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
bool not_found_error = false;
|
bool not_found_error = false;
|
||||||
@ -5782,7 +5792,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
// Receive the data since it's POST
|
// Receive the data since it's POST
|
||||||
data_size = GetContentLength(h);
|
data_size = GetContentLength(h);
|
||||||
|
|
||||||
if (server->DisableJsonRpcWebApi == false)
|
if (disableJsonRpcWebApi == false)
|
||||||
{
|
{
|
||||||
if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0)
|
if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0)
|
||||||
{
|
{
|
||||||
@ -5868,7 +5878,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
}
|
}
|
||||||
else if (StrCmpi(h->Method, "OPTIONS") == 0)
|
else if (StrCmpi(h->Method, "OPTIONS") == 0)
|
||||||
{
|
{
|
||||||
if (server->DisableJsonRpcWebApi == false)
|
if (disableJsonRpcWebApi == false)
|
||||||
{
|
{
|
||||||
if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0 || StartWith(h->Target, "/admin"))
|
if (StrCmpi(h->Target, "/api") == 0 || StrCmpi(h->Target, "/api/") == 0 || StartWith(h->Target, "/admin"))
|
||||||
{
|
{
|
||||||
@ -5939,7 +5949,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
BUF *b = NULL;
|
BUF *b = NULL;
|
||||||
*error_detail_str = "HTTP_ROOT";
|
*error_detail_str = "HTTP_ROOT";
|
||||||
|
|
||||||
if (server->DisableJsonRpcWebApi == false)
|
if (disableJsonRpcWebApi == false)
|
||||||
{
|
{
|
||||||
b = ReadDump("|wwwroot/index.html");
|
b = ReadDump("|wwwroot/index.html");
|
||||||
}
|
}
|
||||||
@ -6019,7 +6029,7 @@ bool ServerDownloadSignature(CONNECTION *c, char **error_detail_str)
|
|||||||
|
|
||||||
if (b == false)
|
if (b == false)
|
||||||
{
|
{
|
||||||
if (server->DisableJsonRpcWebApi == false)
|
if (disableJsonRpcWebApi == false)
|
||||||
{
|
{
|
||||||
if (StartWith(h->Target, "/api?") || StartWith(h->Target, "/api/") || StrCmpi(h->Target, "/api") == 0)
|
if (StartWith(h->Target, "/api?") || StartWith(h->Target, "/api/") || StrCmpi(h->Target, "/api") == 0)
|
||||||
{
|
{
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "Mayaqua/Internat.h"
|
#include "Mayaqua/Internat.h"
|
||||||
#include "Mayaqua/Memory.h"
|
#include "Mayaqua/Memory.h"
|
||||||
#include "Mayaqua/Microsoft.h"
|
#include "Mayaqua/Microsoft.h"
|
||||||
|
#include "Mayaqua/Network.h"
|
||||||
#include "Mayaqua/Object.h"
|
#include "Mayaqua/Object.h"
|
||||||
#include "Mayaqua/OS.h"
|
#include "Mayaqua/OS.h"
|
||||||
#include "Mayaqua/Pack.h"
|
#include "Mayaqua/Pack.h"
|
||||||
@ -6032,6 +6033,15 @@ void SiLoadServerCfg(SERVER *s, FOLDER *f)
|
|||||||
// Disable JSON-RPC Web API
|
// Disable JSON-RPC Web API
|
||||||
s->DisableJsonRpcWebApi = CfgGetBool(f, "DisableJsonRpcWebApi");
|
s->DisableJsonRpcWebApi = CfgGetBool(f, "DisableJsonRpcWebApi");
|
||||||
|
|
||||||
|
char tmpaddr[MAX_PATH];
|
||||||
|
if (CfgGetStr(f, "JsonRpcWebApiAllowedSubnet", tmpaddr, sizeof(tmpaddr))) {
|
||||||
|
IP _subnet, _mask;
|
||||||
|
if (ParseIpAndMask46(tmpaddr, &_subnet, &_mask)) {
|
||||||
|
s->JsonRpcWebApiAllowedSubnetAddr = _subnet;
|
||||||
|
s->JsonRpcWebApiAllowedSubnetMask = _mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Bits of Diffie-Hellman parameters
|
// Bits of Diffie-Hellman parameters
|
||||||
c->DhParamBits = CfgGetInt(f, "DhParamBits");
|
c->DhParamBits = CfgGetInt(f, "DhParamBits");
|
||||||
if (c->DhParamBits == 0)
|
if (c->DhParamBits == 0)
|
||||||
@ -6365,6 +6375,11 @@ void SiWriteServerCfg(FOLDER *f, SERVER *s)
|
|||||||
|
|
||||||
// Disable JSON-RPC Web API
|
// Disable JSON-RPC Web API
|
||||||
CfgAddBool(f, "DisableJsonRpcWebApi", s->DisableJsonRpcWebApi);
|
CfgAddBool(f, "DisableJsonRpcWebApi", s->DisableJsonRpcWebApi);
|
||||||
|
|
||||||
|
char tmpaddr[MAX_PATH];
|
||||||
|
IPAndMaskToStr(tmpaddr, sizeof(tmpaddr),
|
||||||
|
&s->JsonRpcWebApiAllowedSubnetAddr, &s->JsonRpcWebApiAllowedSubnetMask);
|
||||||
|
CfgAddStr(f, "JsonRpcWebApiAllowedSubnet", tmpaddr);
|
||||||
}
|
}
|
||||||
Unlock(c->lock);
|
Unlock(c->lock);
|
||||||
}
|
}
|
||||||
|
@ -276,6 +276,9 @@ struct SERVER
|
|||||||
IP ListenIP; // Listen IP
|
IP ListenIP; // Listen IP
|
||||||
bool StrictSyslogDatetimeFormat; // Make syslog datetime format strict RFC3164
|
bool StrictSyslogDatetimeFormat; // Make syslog datetime format strict RFC3164
|
||||||
bool DisableJsonRpcWebApi; // Disable JSON-RPC Web API
|
bool DisableJsonRpcWebApi; // Disable JSON-RPC Web API
|
||||||
|
|
||||||
|
IP JsonRpcWebApiAllowedSubnetAddr; // If set, allow access to JSON-RPC Web API from
|
||||||
|
IP JsonRpcWebApiAllowedSubnetMask; // this subnet only
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -6993,6 +6993,18 @@ void IPToStr6Inner(char *str, IP *ip)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format IP and subnet mask as "<ip>/<masksize>"
|
||||||
|
void IPAndMaskToStr(char *str, UINT size, IP *ip, IP *subnet)
|
||||||
|
{
|
||||||
|
int iplen;
|
||||||
|
UINT masksize;
|
||||||
|
|
||||||
|
IPToStr(str, size, ip);
|
||||||
|
iplen = StrLen(str);
|
||||||
|
masksize = SubnetMaskToInt(subnet);
|
||||||
|
Format(str + iplen, size - iplen, "/%d", masksize);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert the string to an IP address
|
// Convert the string to an IP address
|
||||||
bool StrToIP6(IP *ip, char *str)
|
bool StrToIP6(IP *ip, char *str)
|
||||||
{
|
{
|
||||||
|
@ -1293,6 +1293,7 @@ void IPToStr6(char *str, UINT size, IP *ip);
|
|||||||
void IP6AddrToStr(char *str, UINT size, IPV6_ADDR *addr);
|
void IP6AddrToStr(char *str, UINT size, IPV6_ADDR *addr);
|
||||||
void IPToStr6Array(char *str, UINT size, UCHAR *bytes);
|
void IPToStr6Array(char *str, UINT size, UCHAR *bytes);
|
||||||
void IPToStr6Inner(char *str, IP *ip);
|
void IPToStr6Inner(char *str, IP *ip);
|
||||||
|
void IPAndMaskToStr(char *str, UINT size, IP *ip, IP *subnet);
|
||||||
void IntToSubnetMask6(IP *ip, UINT i);
|
void IntToSubnetMask6(IP *ip, UINT i);
|
||||||
void IPAnd6(IP *dst, IP *a, IP *b);
|
void IPAnd6(IP *dst, IP *a, IP *b);
|
||||||
void GetAllRouterMulticastAddress6(IP *ip);
|
void GetAllRouterMulticastAddress6(IP *ip);
|
||||||
|
Loading…
Reference in New Issue
Block a user