create a wireguard vpn server setup with optional tweaks
This commit is contained in:
commit
e1d11db71e
6 changed files with 251 additions and 0 deletions
3
.env
Normal file
3
.env
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
NODE_HOSTNAME=my.domain.name
|
||||||
|
SERVER_CNAME_NAMESPACE=my.domain.name
|
||||||
|
PEERS=changeme,changeme2
|
||||||
104
README.md
Normal file
104
README.md
Normal file
|
|
@ -0,0 +1,104 @@
|
||||||
|
# Quick Setup Guide
|
||||||
|
|
||||||
|
The following process utilises docker containers to quickly provision a Wireguard VPN server.
|
||||||
|
|
||||||
|
## Information Gathering
|
||||||
|
|
||||||
|
Have the following known before proceeding.
|
||||||
|
|
||||||
|
- User account used to run the server.
|
||||||
|
- List of user(s) which will be VPN users (not essential, however less touches required later).
|
||||||
|
- Domain name DNS record for the server.
|
||||||
|
|
||||||
|
## Basic Setup
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
1. Clone repository at your proposed server location.
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/bodane/vpn-wireguard.git && cd vpn-wireguard
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Run `vanilla-setup.sh`.
|
||||||
|
|
||||||
|
This script will:
|
||||||
|
|
||||||
|
- Create a new user.
|
||||||
|
- User will manage the VPN server components.
|
||||||
|
- Add user to sudo group.
|
||||||
|
- Install git, nano, and Docker
|
||||||
|
- Add user to Docker group.
|
||||||
|
|
||||||
|
1. Create your list of VPN users.
|
||||||
|
|
||||||
|
- Edit your `.env` file.
|
||||||
|
- Update `NODE_HOSTNAME=my.domain.name` and `SERVER_CNAME_NAMESPACE=my.domain.name` with your server DNS record.
|
||||||
|
- Update `PEERS` with your list of users, separated by commas.
|
||||||
|
|
||||||
|
**NOTE**: The user list can be updated later if not known and the container re-created without user impact. Will however disconnect users during this operation.
|
||||||
|
|
||||||
|
1. Build your Wireguard VPN server with one command.
|
||||||
|
|
||||||
|
```
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Add additional VPN users
|
||||||
|
|
||||||
|
1. Edit existing list of VPN users.
|
||||||
|
|
||||||
|
- Update `.env` file with your list of users.
|
||||||
|
- Add or remove users.
|
||||||
|
- All must be separated by commas.
|
||||||
|
|
||||||
|
1. Start up a new container. All past changes will persist due to the docker volumes being used.
|
||||||
|
|
||||||
|
This will setup new user VPN profiles while also leaving any present peers in-place.
|
||||||
|
|
||||||
|
```
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## User Profile Location
|
||||||
|
|
||||||
|
While in the `vpn-wireguard` folder path. The user VPN profiles are located in the `config/` folder path.
|
||||||
|
|
||||||
|
## Optional Improvements
|
||||||
|
|
||||||
|
There are almost an infinite amount of configurations, however one great addition could be that we do block unsafe domains or known malicous domain names being accessed by users.
|
||||||
|
|
||||||
|
The basic script and Corefile included will assist with this configuration. We'll also use a couple of known public threat intel feeds to develop our own blacklist for use locally. How it works is, if the user were to perform a DNS query to resolve an unsafe domain, the CoreDNS server returns a DNS response of `0.0.0.0` back to the user for the target domain. This effectively prevents a request taking place to the remote host.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
1. Run `blacklist.sh` on your server endpoint. A `blacklist.txt` file will be created locally.
|
||||||
|
|
||||||
|
```
|
||||||
|
./optional-config/blacklist.sh
|
||||||
|
cp optional-config/Corefile config/coredns/Corefile
|
||||||
|
cp blacklist.txt config/coredns/blacklist.txt
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Backup your current Corefile, place it in a easy to find path related to CoreDNS, and update the CoreDNS file to reference the newly created `blacklist.txt` file.
|
||||||
|
|
||||||
|
```
|
||||||
|
cp config/coredns/Corefile config/coredns/Corefile.bak
|
||||||
|
cp optional-config/Corefile config/coredns/Corefile
|
||||||
|
cp blacklist.txt config/coredns/blacklist.txt
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Restart your Wireguard VPN server to have the changes all take effect.
|
||||||
|
|
||||||
|
```
|
||||||
|
docker restart lthn-vpn-wireguard-1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Further improvements for consideration.
|
||||||
|
|
||||||
|
- Creating a cron schedule or similar to maintain a better active list of unsafe domains.
|
||||||
|
|
||||||
|
|
||||||
60
docker-compose.yml
Normal file
60
docker-compose.yml
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
version: "3.3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
# Route via Traefik
|
||||||
|
router-traefik:
|
||||||
|
image: "traefik:v2.10"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
command:
|
||||||
|
- "--api.insecure=true"
|
||||||
|
- "--providers.docker=true"
|
||||||
|
- "--providers.docker.exposedbydefault=false"
|
||||||
|
- "--entrypoints.websecure.address=:443"
|
||||||
|
- "--entrypoints.wireguard.address=:51820"
|
||||||
|
- "--certificatesresolvers.exitNode.acme.tlschallenge=true"
|
||||||
|
- "--certificatesresolvers.exitNode.acme.email=devops@lt.hn"
|
||||||
|
- "--certificatesresolvers.exitNode.acme.storage=/letsencrypt/acme.json"
|
||||||
|
- "--experimental.plugins.ldapAuth.modulename=github.com/wiltonsr/ldapAuth"
|
||||||
|
- "--experimental.plugins.ldapAuth.version=v0.0.22"
|
||||||
|
ports:
|
||||||
|
- "443:443"
|
||||||
|
- "80:8080"
|
||||||
|
volumes:
|
||||||
|
- "./letsencrypt:/letsencrypt"
|
||||||
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
|
|
||||||
|
# Wireguard VPN
|
||||||
|
vpn-wireguard:
|
||||||
|
image: linuxserver/wireguard:latest
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- SYS_MODULE #optional
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
- SERVERURL=$NODE_HOSTNAME #optional
|
||||||
|
- SERVERPORT=51820 #optional
|
||||||
|
#- PEERS=1 #uncomment if wishing to not set usernames and only set a random number of peers.
|
||||||
|
- PEERDNS=auto #optional
|
||||||
|
- INTERNAL_SUBNET=10.13.13.0 #optional
|
||||||
|
- ALLOWEDIPS=0.0.0.0/0 #optional
|
||||||
|
- PERSISTENTKEEPALIVE_PEERS= #optional
|
||||||
|
- LOG_CONFS=true #optional
|
||||||
|
volumes:
|
||||||
|
- ./config:/config
|
||||||
|
- /lib/modules:/lib/modules #optional
|
||||||
|
ports:
|
||||||
|
- 51820:51820/udp
|
||||||
|
sysctls:
|
||||||
|
- net.ipv4.conf.all.src_valid_mark=1
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.udp.routers.wireguard.rule=HostRegexp(`${SERVER_CNAME_NAMESPACE}`, `{subdomain:[a-z]+}.${SERVER_CNAME_NAMESPACE}`)"
|
||||||
|
- "traefik.udp.routers.wireguard.entrypoints=wireguard"
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
14
optional-config/Corefile
Normal file
14
optional-config/Corefile
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
. {
|
||||||
|
# CoreDNS standard plugins
|
||||||
|
loop
|
||||||
|
errors
|
||||||
|
health
|
||||||
|
|
||||||
|
# Blocking unsafe domains
|
||||||
|
hosts /config/coredns/blacklist.txt {
|
||||||
|
fallthrough
|
||||||
|
}
|
||||||
|
|
||||||
|
# Forwarding for domains not in blocklists
|
||||||
|
forward . /etc/resolv.conf
|
||||||
|
}
|
||||||
34
optional-config/blacklist.sh
Normal file
34
optional-config/blacklist.sh
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Define the location for the local blacklist file
|
||||||
|
#BLACKLIST_FILE="/config/coredns/blacklist.txt"
|
||||||
|
BLACKLIST_FILE="blacklist.txt"
|
||||||
|
|
||||||
|
# URLs to download blocklists from
|
||||||
|
BLOCKLIST_URLS=(
|
||||||
|
"https://urlhaus.abuse.ch/downloads/text/"
|
||||||
|
"https://big.oisd.nl/domainswild2"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Clear the current blacklist file
|
||||||
|
> $BLACKLIST_FILE
|
||||||
|
|
||||||
|
# Fetch each blocklist and format for CoreDNS
|
||||||
|
for url in "${BLOCKLIST_URLS[@]}"; do
|
||||||
|
# Download each list
|
||||||
|
curl -s "$url" | \
|
||||||
|
# Remove lines with IP addresses (matches any line containing an IP address)
|
||||||
|
grep -Ev '([0-9]{1,3}\.){3}[0-9]{1,3}' | \
|
||||||
|
# Remove lines with domain names containing non-standard ports (matches domains with a port number)
|
||||||
|
grep -Ev ':[0-9]{2,5}' | \
|
||||||
|
# For URLHaus, extract domains from full URLs if needed
|
||||||
|
grep -Eo 'https?://[^/"]+' | sed 's|https\?://||' | \
|
||||||
|
# Filter out comments and empty lines, and format for hosts
|
||||||
|
grep -v '^#' | grep -v '^$' | sed 's/^/0.0.0.0 /' >> $BLACKLIST_FILE
|
||||||
|
done
|
||||||
|
|
||||||
|
# Ensure no duplicate entries in the blacklist file
|
||||||
|
sort -u $BLACKLIST_FILE -o $BLACKLIST_FILE
|
||||||
|
|
||||||
|
# Reload CoreDNS to apply the new blacklist
|
||||||
|
#systemctl reload coredns
|
||||||
36
vanilla-setup.sh
Normal file
36
vanilla-setup.sh
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check if the script is run as root
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "Please run as root or with sudo."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the username as a variable
|
||||||
|
read -p "Enter the username you want to create: " USERNAME
|
||||||
|
|
||||||
|
# Create a new user with a home directory
|
||||||
|
useradd -m -s /bin/bash "$USERNAME"
|
||||||
|
|
||||||
|
# Set a password for the new user
|
||||||
|
passwd "$USERNAME"
|
||||||
|
|
||||||
|
# Give the new user sudo privileges
|
||||||
|
usermod -aG sudo "$USERNAME"
|
||||||
|
|
||||||
|
# Install git and nano
|
||||||
|
apt update
|
||||||
|
apt install -y git nano
|
||||||
|
|
||||||
|
# Install Docker
|
||||||
|
apt install -y apt-transport-https ca-certificates curl software-properties-common
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
|
||||||
|
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
apt update
|
||||||
|
apt install -y docker-ce
|
||||||
|
|
||||||
|
# Add the new user to the Docker group
|
||||||
|
usermod -aG docker "$USERNAME"
|
||||||
|
|
||||||
|
# Display success message
|
||||||
|
echo "User $USERNAME created, added to sudo and docker groups, and git, nano, and Docker installed."
|
||||||
Loading…
Add table
Reference in a new issue