Wireguard: Δημιουργούμε το δικό μας VPN μέσω Container

Το άρθρο αυτό αποτελεί μέρος της σειράς Raspberry Pi Server, υποστηριζόμενο από την επίσημη αντιπροσωπία του Raspberry Pi στην Ελλάδα, το nettop.gr το οποίο με προμήθευσε με το Raspberry Pi 5 ώστε να δημιουργήσω περισσότερο περιεχόμενο για τις δυνατότητες και τα Project που μπορούν να τρέξουν self-hosted πάνω στο Raspberry Pi στα Ελληνικά. Ευχαριστώ πάρα πολύ το nettop.gr για την υποστήριξη!!!


Wireguard: Δημιουργούμε το δικό μας VPN μέσω Container


Ο οδηγός αυτός λειτουργεί σε όλα τα συστήματα όπου υποστηρίζονται Containers, εκτός των Raspberry Pi;

Φυσικά, μιας και είναι σε μορφή Container, ο οδηγός αυτός μπορεί να εφαρμοστεί σε κάθε υπολογιστή οπού μπορεί να διαχειριστεί containers.


Σε ποια Container Engines ο οδηγός έχει δοκιμαστεί ως προς την συμβατότητά του;

Για όποιον θέλει να μάθει τι είναι το Docker, οπού αποτελεί την μεγάλη “ναυαρχίδα” των Containers, υπάρχει ήδη στο Linux-User.gr ένας πολύ αναλυτικός οδηγός: , οπού εμπεριέχει αναλυτικότερες πληροφορίες σχετικά με τις τεχνολογίες αυτές.

Γιατί να φτιάξω το δικό μου VPN;

  • Διότι μπορούμε να έχουμε πρόσβαση, σαν να είμαστε σπίτι μας, στις υπηρεσίες που τρέχουμε στο home network μας εξαιρετικά εύκολα και με ασφάλεια,
  • Διότι είναι πολύ πιο secure από το να ανοίγουμε πόρτα σε κάποια υπηρεσία απευθείας, καθιστώντας την αναγνωρίσιμη από τον έξω κόσμο και ιδιαίτερα σε botάκια που ενδεχομένως να σαρώνουν το διαδίκτυο στην προσπάθεια τους να αναγνωρίσουν επιθέσεις.
  • Μπορούμε να εκδώσουμε νέα κλειδιά ή να ακυρώσουμε προηγούμενα κλειδιά εξαιρετικά εύκολα,
  • Σε περίπτωση που κρίνουμε πως γίνει leak κάποιο κλειδί, απλά το ακυρώνουμε και συνεχίζουμε ομαλά την ζωή μας.

Ας ξεκινήσουμε:

Η διαδικασία είναι εξαιρετικά πολύ απλή μιας και έχω ετοιμάσει docker-compose.yml αρχείο, όπως είχαμε δει και στο Access Point Docker Container ή στο Jellyfin.

Απλά δημιουργούμε έναν φάκελο, όπου μέσα σε αυτόν δημιουργούμε ένα αρχείο με όνομα docker-compose.yml:

nano docker-compose.yml

Και κάνουμε copy-paste το παρακάτω:

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard #Όνομα του container
    cap_add:
      - NET_ADMIN
      - SYS_MODULE #προαιρετικό
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - SERVERURL=yourdynamicdns.com #Ενδεχομένως εδώ να θέλετε να βάλετε κάποια στατική IP αντί για Dynamic DNS 
      - SERVERPORT=51820 #Η πόρτα στην οποία θα δουλεύει το wireguard, θα πρέπει να βάλετε να κάνετε Port Forward την πόρτα αυτή από τον Router σας
      - PEERS=10 #Πόσους χρήστες θέλετε να δημιουργήσετε, κατά το docker-compose up θα εμφανιστούν όλα τα κλειδιά βάση του αριθμού χρηστών όπου θα οριστεί εδώ.
      - PEERDNS=auto #Προαιρετικό, σε επόμενο οδηγό θα βάλουμε μαζί και pihole ως DNS
      - INTERNAL_SUBNET=10.13.13.0 #Προαιρετικό
      - ALLOWEDIPS=0.0.0.0/0 #Προαιρετικό
      - PERSISTENTKEEPALIVE_PEERS= #Προαιρετικό
      - LOG_CONFS=true #Προαιρετικό
    volumes:
      - .config:/config
      - /lib/modules:/lib/modules #Προαιρετικό
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Kαι δημιουργούμε το container δίνοντας από τερματικό: (ενώ βρισκόμαστε στον φάκελο όπου βρίσκεται το docker-compose.yml):

docker-compose up 

Το wireguard θα ξεκινήσει να τρέχει, αφού πρώτα εμφανίσει ως QR Code τα κλειδιά για όλους τους χρήστες.

Παίρνοντας shell στο Container του wireguard:

Ανοίγουμε ένα τερματικό και δίνουμε:

docker exec -it wireguard /bin/bash

Το συγκεκριμένο container πρακτικά δημιουργεί ένα πολύ απλό και βασικό container με wireguard. Όλη η διαχείριση πραγματοποιείται χρησιμοποιώντας το τερματικό ή αλλαγές στο docker-compose.yml και έπειτα παραδοσιακά τρέχοντας:

docker-compose down
docker-compose up 

Μπορούμε πολύ εύκολα να σαρώσουμε το QR Code, τόσο από τις φορητές μας συσκευές όσο και από κάποιο υπολογιστή, και να περάσουμε το κλειδί στην αντίστοιχη συσκευή.

Port Forward στον Router

Για να λειτουργήσει το wireguard και να μπορούμε να συνδεθούμε σε αυτό εκτός σπιτιού, θα πρέπει να ενεργοποιήσουμε στον router το Port Forward. Το πώς μπορεί να πραγματοποιηθεί αυτό, αλλάζει από router σε router, συνεπώς, προτείνεται να συμβουλευτείτε το user manual του router σας ή να αναζητήσετε στις ρυθμίσεις κάποια η οποία αναγράφει σχετικά με Port Forward.
Η πόρτα όπου θα πρέπει να ανοίξετε θα πρέπει να είναι η ίδια που δηλώθηκε στο παραπάνω Docker Compose (στην περίπτωση μας, η πόρτα 51820).

Dynamic DNS

Είναι γνωστό ότι στις οικιακές συνδέσεις, συνήθως έχουμε δυναμικές IP. Τι σημαίνει αυτό; Σημαίνει ότι έπειτα από κάθε επανεκκίνηση του router, ο πάροχος μας δίνει μία τυχαία IP. Συνεπώς, αν θέλουμε να χρησιμοποιήσουμε το Wireguard ως VPN, είτε θα πρέπει να αγοράσουμε μία στατική IP είτε θα πρέπει να αλλάζουμε χειροκίνητα σε κάθε επανεκκίνηση, την IP από το docker-compose.

Για να αποφύγουμε και τις 2 παραπάνω περιπτώσεις, μπορούμε να χρησιμοποιήσουμε μία υπηρεσία ως Dynamic DNS (DDNS). Τι σημαίνει αυτό;

  • Μία υπηρεσία Dynamic DNS μας αναθέτει ένα DDNS domain, πχ dimitris.ddns.gr
  • Στον server μας τρέχουμε ένα εργαλείο του αντίστοιχου παρόχου DDNS το οποίο ελέγχει αυτόματα αν η public IP μας έχει ενημερωθεί, και πραγματοποιεί αυτόματα την αλλαγή αυτή για εμάς. Με αυτό τον τρόπο, ακόμα και όταν αλλάζει η δυναμική μας IP, το wireguard μας συνεχίζει να παραμένει κανονικά λειτουργικό μιας και ο DDNS έχει ενημερωθεί αυτόματα με την νέα μας δυναμική IP.

Μιά διάσημη δωρεάν υπηρεσία DDNS είναι η noIP (Υ.Γ. δεν έχουμε κάποια συνεργασία), ωστόσο στο free plan θα πρέπει να κάνουμε κάθε 1 μήνα κλικ χειροκίνητα για να ανανεωθεί το domain. Υπάρχουν διάφορες υπηρεσίες παροχής DDNS όπου μπορείτε να βρείτε εκεί έξω.

Ωστόσο αξίζει να επισημανθεί ότι με το DuckDNS δεν κατάφερα να δουλέψω το wireguard. Αν κάποιος δοκιμάσει και αντιμετωπίσει μία διαφορετική εμπειρία, ας ενημερώσει (θα ανέβει σύντομα και container με DuckDNS).

Wireguard Clients ανά Λειτουργικό Σύστημα

Το wireguard υποστηρίζεται από τα περισσότερα Λειτουργικά Συστήματα όπου μπορούμε να βρούμε, συνεπώς, είναι εξαιρετικά χρήσιμο και λειτουργικό παντού.
Ενδεικτικά, παρακάτω θα δούμε Wireguard clients ανά Λειτουργικό Σύστημα:

  • GNU/Linux: Μέσω networkmanager, απλά κάνετε import το κλειδάκι. Για παράδειγμα, στο GNOME θα εμφανίζεται μετά το εξής κουμπάκι:
    Screenshot from 2024-05-08 18-21-33
    Aξίζει να επισημανθεί ότι θα πρέπει ο πυρήνας του Linux να διαθέτει εγκατεστημένα τα απραίτητα modules. 99% δεν θα έχετε πρόβλημα αν τρέχετε μία ενημερωμένη έκδοση κάποιας διανομής GNU/Linux.
  • Android: WireGuard for Android Downloads
  • iOS: ‎WireGuard on the App Store
  • Windows: WireGuard for Windows Downloads
  • Mac OS: ‎WireGuard on the Mac App Store

Στον επόμενο οδηγό, θα τρέξουμε wireguard με web interface αλλά και pihole :) .

Enjoy the freedom

7 «Μου αρέσει»

Και σκεφτόμουν να σηκώσω ένα wg σε docker.

Θα το περάσω όπως είναι το docker-compose στο portainer σε stack να το σηκώσει να κάνω δοκιμές.

Και να σημειωθεί κύριοι, ότι το wireguard ως τώρα είναι το πιο ελαφρύ vpn implementation, πολύ λιγότερους πόρους από άλλα, βλέπε OpenVPN.

2 «Μου αρέσει»

Υπομονή μέχρι την Πέμπτη, πιστεύω ότι το wg-easy+pihole θα σου αρέσει περισσότερο :) (αν κι εγώ το συγκεκριμένο image τρέχω, better safe than sorry, δεν έχω ιδιαίτερη εμπιστοσύνη στα web interfaces, ακόμα και πίσω από reverse proxy για https)

2 «Μου αρέσει»

Ευχαριστούμε για τον οδηγό.
Στο λαπτοπ έχω Ubuntu 22.04.4 LTS και στις ρυθμίσεις δικτύου εμφανίζεται μόνο το εξής


όταν επιλέγω το + στο vpn.

Εγκατέστησα το network manager αλλά δεν υπάρχει σε κάποιο μενού.

Έχεις να προτίνεις γραφικό τρόπο ρυθμίσεων της επικοινωνίας μεταξύ ενός λαπτοπ και ενός ρασμπερρυ με wireguard ; Βλέπω οτι είτε χρειάζεται κάποιο αρχείο είτε κάποια settings. Τα qr δεν είναι πάντα βολικά. Αν μπορούσες να προσθέσεις ένα μέρος στον οδηγό σχετικά με τις επιλογές σύνδεσης me wireguard θα βόλευε.

Ευχαριστώ

1 «Μου αρέσει»

Μπορείς να κάνεις import from file το αρχείο αντί να σαρώσεις του qr code.

Θα ανέβει σύντομα άρθρο με wg-easy.

2 «Μου αρέσει»