From 68d0ae40027d4cee1fc4bd73eca76ea0a67aec0a Mon Sep 17 00:00:00 2001 From: Dselen Date: Tue, 20 Aug 2024 13:54:49 -0500 Subject: [PATCH] Added context and refined code. --- docker/Dockerfile | 2 +- docker/README.md | 53 ++++++++++++++++++++++++++++++-------------- docker/compose.yaml | 4 ++-- docker/entrypoint.sh | 16 ++++++------- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index dda699b..03b6775 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -10,7 +10,7 @@ ENV wg_net="10.0.0.1" ENV tz="Europe/Amsterdam" ENV global_dns="1.1.1.1" ENV enable="none" -ENV isolate="none" +ENV isolate="wg0" ENV public_ip="0.0.0.0" # Doing basic system maintenance. Change the timezone to the desired timezone. diff --git a/docker/README.md b/docker/README.md index dd7bfe8..7da87cd 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,20 +1,20 @@ -# WG-Dashboard Docker Explanation: +# WGDashboard Docker Explanation: Author: DaanSelen
-This document delves into how the WG-Dashboard Docker container has been built.
+This document delves into how the WGDashboard Docker container has been built.
Of course there are two stages, one before run-time and one at/after run-time.
The `Dockerfile` describes how the container image is made, and the `entrypoint.sh` is executed after running the container.
-In this example, WireGuard is integrated into the container itself, so it should be a run-and-go.
+In this example, WireGuard is integrated into the container itself, so it should be a run-and-go/out-of-the-box.
For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments. -I have tried to embed some new features such as `isolated_peers` and interface startup on container-start (through `enable_wg0`). +I have tried to embed some new features such as `isolate` and interface startup on container-start (through `enable`). I hope you enjoy! -WG-Dashboard Logo +WG-Dashboard Logo ## Getting the container running: -To get the container running you either pull the image from the repository, at the moment: `repo.nerthus.nl/app/wireguard-dashboard:latest`.
+To get the container running you either pull the image from the repository, `dselen/wgdashboard:latest`.
From there either use the environment variables describe below as parameters or use the Docker Compose file: `compose.yaml`. An example of a simple command to get the container running is show below:
@@ -28,7 +28,7 @@ docker run -d \ -p 10086:10086/tcp \ -p 51820:51820/udp \ --cap-add NET_ADMIN \ - repo.nerthus.nl/app/wireguard-dashboard:latest + dselen/wgdashboard:latest ```
If you want to use Compose instead of a raw Docker command, refer to the example in the `compose.yaml` or the one pasted below: @@ -37,14 +37,14 @@ If you want to use Compose instead of a raw Docker command, refer to the example ```yaml services: wireguard-dashboard: - image: repo.nerthus.nl/app/wireguard-dashboard:latest + image: dselen/wgdashboard:latest restart: unless-stopped container_name: wire-dash environment: #- tz= #- global_dns= - - enable_wg0=true - - isolated_peers=false + - enable=none + - isolate=wg0 #- public_ip= ports: - 10086:10086/tcp @@ -69,14 +69,33 @@ This setup is just generic and will use the Docker volumes. Once the container is running, the installation process is essentially the same as running it on bare-metal.
So go to the assign TCP port in this case HTTP, like the default 10086 one in the example and log into the WEB-GUI.
-| Environment variable | Accepted arguments | Default value | Verbose | -| -------------- | ------- | ------- | ------- | -| tz | Europe/Amsterdam or any confirming timezone notation. | Europe/Amsterdam | Sets the timezone of the Docker container. This is to timesync the container to any other processes which would need it. | -| global_dns | Any IPv4 address, such as my personal recommendation: 9.9.9.9 (QUAD9) | 1.1.1.1 | Set the default DNS given to clients once they connect to the WireGuard tunnel (VPN). -| enable_wg0 | `true` or `false` | `false` | Enables or disables the starting of the WireGuard interface on container 'boot-up'. -| isolated_peers | `true` or `false` | `true` | For security the default is true, and it disables peers to ping or reach eachother, the WireGuard interface IS able to reach the peers (Done through `iptables`). -| public_ip | Any IPv4 (public recommended) address, such as the one returned by default | Default uses the return of `curl ifconfig.me` | To reach your VPN from outside your own network, you need WG-Dashboard to know what your public IP-address is, otherwise it will generate faulty config files for clients. +| Environment variable | Accepted arguments | Default value | Example value | Verbose | +| -------------- | ------- | ------- | ------- | ------- | +| tz | Europe/Amsterdam or any confirming timezone notation. | `Europe/Amsterdam` | `America/New_York` | Sets the timezone of the Docker container. This is to timesync the container to any other processes which would need it. | +| global_dns | Any IPv4 address, such as my personal recommendation: 9.9.9.9 (QUAD9). | `1.1.1.1` | `8.8.8.8` or any IP-Address that resolves DNS-names, and of course is reachable | Set the default DNS given to clients once they connect to the WireGuard tunnel, and for new peers, set to Cloudflare DNS for reliability. +| enable | Anything, preferably an existing WireGuard interface name. | `none` | `wg0,wg2,wg13` | Enables or disables the starting of the WireGuard interface on container 'boot-up'. +| isolate | Anything, preferably an existing WireGuard interface name. | `wg0` | `wg1,wg0` | For security premade `wg0` interface comes with this feature enabled by default. Declaring `isolate=` in the Docker Compose file will remove this. The WireGuard interface itself IS able to reach the peers (Done through the `iptables` package). +| public_ip | Any IPv4 (public recommended) address, such as the one returned by default | Default uses the return of `curl ifconfig.me` | `23.50.131.156` | To reach your VPN from outside your own network, you need WG-Dashboard to know what your public IP-address is, otherwise it will generate faulty config files for clients. This happends because it is inside a Docker/Kubernetes container. In or outside of NAT is not relevant as long as the given IP-address is reachable from the internet or the target network. + +## Be careful with: + +When you are going to work with multiple WireGuard interfaces, you need to also open them up to the Docker host. This done by either adding the port mappings like: `51821:51821/udp` in the Docker Compose file, or to open a range like: `51820-51830:51820-51830/udp`
+The latter opens up UDP ports from 51820 to 51830, so all ports in between as well! Be careful, it is good security practise to open only needed ports! + +## Building the image yourself: + +To build the image yourself, you need to do a couple things:
+1. Clone the Github repository containing the source code of WGDashboard including the docker directory. For example do: `git clone https://github.com/donaldzou/WGDashboard.git` +1. Navigate into the docker directory. +1. (Make sure you have Docker correctly installed, if not: [Click here](https://docs.docker.com/engine/install/)) and run: `docker build . -t :` as an example: `docker build . -t dselen/wgdashboard:latest`.
This will make Docker compile the image from the resources in the directory you mention, in this case the current one. Let it compile, it takes about a minute or maximally two. +1. If all went well, see your image with `docker images`. Example below: +``` +dselen@dev-mach:~/development/WGDashboard/docker$ docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +dselen/wgdashboard dev c96fd96ee3b3 42 minutes ago 314MB +``` ## Closing remarks: +Excuse the large image size, whoops! Debian's big... sometimes.
For feedback please submit an issue to the repository. Or message dselen@nerthus.nl. diff --git a/docker/compose.yaml b/docker/compose.yaml index ba429f2..83f86b7 100644 --- a/docker/compose.yaml +++ b/docker/compose.yaml @@ -6,8 +6,8 @@ services: environment: #- tz= # <--- Set container timezone, default: Europe/Amsterdam. #- global_dns= # <--- Set global DNS address, default: 1.1.1.1. - - enable=wg0,wg1 # <--- Set the interfaces that will be enabled on startup, default: none. The option "off" is also allowed. - - isolate=wg0 # <--- When set to true, it disallows peers to talk to eachother, setting to false, allows it, default: true. + - enable=wg0,wg2 # <--- Set the interfaces that will be enabled on startup, default: none. The option "off" is also allowed. + - isolate=wg0,wg1 # <--- When set to true, it disallows peers to talk to eachother, setting to false, allows it, default: true. #- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me. ports: - 10086:10086/tcp diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index e6d48c0..84b9f7f 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -26,6 +26,9 @@ clean_up() { else echo "No pycaches found, continuing." fi + + echo "Setting permissions to not be world-accesible." + chmod 640 /etc/wireguard/* } # === CORE SERVICES === @@ -45,7 +48,7 @@ start_core() { cd "${WGDASH}"/src || return # If changing the directory fails (permission or presence error), then bash will exist this function, causing the WireGuard Dashboard to not be succesfully launched. bash wgd.sh start - # Isolated peers + # Isolated peers feature: local configurations=(/etc/wireguard/*) IFS=',' read -r -a do_isolate <<< "${isolate}" non_isolate=() @@ -64,9 +67,6 @@ start_core() { fi done - echo "Isolate configurations: ${do_isolate[@]}" - echo "Non-Isolate configurations: ${non_isolate[@]}" - for interface in "${do_isolate[@]}"; do if [ -f "/etc/wireguard/${interface}.conf" ]; then echo "Isolating:" $interface @@ -84,7 +84,7 @@ start_core() { for interface in "${non_isolate[@]}"; do if [ -f "/etc/wireguard/${interface}.conf" ]; then - echo "Removing Isolation for:" $interface + echo "Removing Isolation if present for:" $interface sed -i "/PostUp = iptables -I FORWARD -i ${interface} -o ${interface} -j DROP/d" /etc/wireguard/${interface}.conf sed -i "/PreDown = iptables -D FORWARD -i ${interface} -o ${interface} -j DROP/d" /etc/wireguard/${interface}.conf else @@ -108,8 +108,7 @@ start_core() { # === SET ENV VARS === set_envvars() { - echo "------------------------------------------------------------" - echo "Setting relevant variables for operation." + echo "------------- SETTING ENVIRONMENT VARIABLES ----------------" # If the timezone is different, for example in North-America or Asia. if [ "${tz}" != "$(cat /etc/timezone)" ]; then @@ -142,7 +141,7 @@ set_envvars() { # === CLEAN UP === ensure_blocking() { - echo "------------------------------------------------------------" + echo "-------------- ENSURING CONTAINER CONTINUATION -------------" sleep 1s echo "Ensuring container continuation." @@ -159,6 +158,7 @@ ensure_blocking() { # Execute functions for the WireGuard Dashboard services, then set the environment variables clean_up +repair start_core set_envvars ensure_blocking \ No newline at end of file