Instalare Wireguard si Squid cu Adguard 
=====================
In cadrul acestui tutorial vom seta un server VPN Wireguard, un server PROXY Squid si un server DNS Adguard.
La aceste servere va veti conecta de pe PC-ul cu windows sau linux sau direct pe telefonul cu android, f posibil sa mearga si pe iphone, nu am, nu am cum sa testez.
Ce este important de retinut este faptul ca
toate serviciile sunt criptate cu certificat SSL!
Serverul adguard va avea niste filtre care vor bloca reclamele de pe orice site, mai putin youtube, pt youtube avem alta solutie
aici
Deci indiferent de cum va conectati veti avea totul secure si filtrat prin intermediul Adguard.
In locatia unde instalezi ce se va explica aici (cu docker) trebuie sa ai ip public si un DNS. Ex: example.com
Se forwardeaza din router (sau security group daca e vps in cloud) porturile catre linuxul unde vor rula serviciile:
- 443/tcp (pt nginx)
- 51820/udp (pt wireguard)
- 853/tcp (pt DNS-over-TLS)
- 19504/tcp (pt squid, folosim un port non standard)
De asemeni pt configurare adguard de la zero veti avea nevoie si de 3000. Voi explica mai jos ca puteti folosi adguard-ul meu gata configurat si nu mai este nevoie.
Ca sa functioneze acest setup, va trebui ca pe VPS-ul unde puneti aceste servicii sa schimbati DNS-ul linuxului cu adguard si ca sa fie functional veti avea nevoie de asemeni si de dnsmasq, este obligatoriu.
Eu am pus aceasta solutie pe un server free de la oracle cloud care din pacate este cu arm64 dar e testat si functional. Evident ca merge si pe orice linux x86_64
Pe ubuntu trebuie oprit systemd-resolved.service si dezactivat insa nu de la inceput si cam pe orice linux procedura este similara:
$ systemctl stop systemd-resolved
$ systemctl mask systemd-resolved
Eu am pus totul cu root, recomandat este sa se foloseasca totusi un user separat.
Se da allow din firewall pe masina la aceste porturi (iptables, ufw, depinde ce ai).
Exemplu basic iptables pt custom ports exista
aici
In /root creati urmatoarele 5 foldere:
$ cd /root
$ mkdir dnsmasq adguard squid wg-easy nginx
In fiecare folder va exista un fisier start.sh cu drepturi execute si fisierele si subfoldere aditionale.
Se instaleaza docker pe linuxul respectiv, e mai simplu asa, ce este de explicat aici va fi integral docker:
$ apt install docker.io -y
(deci daca ai ubuntu/debian pachetul este docker.io, daca ai fedora/centos exista repo special pt docker-ce)
O sa luam cele 5 foldere pe rand:
DNSmasq
Va duceti in folder prima data si ramaneti acolo.
In acest folder veti avea nevoie de dnsmasq.conf care se creeaza automat ruland acest fisier:
il puteti crea cu numele generare_conf.sh:
$nano generare_conf.sh
#!/bin/bash
# Output file
output_file="dnsmasq.conf"
echo "" > "$output_file"
echo -e "no-resolv\nserver=127.0.0.1#5353" > "$output_file"
# Get network interfaces
interfaces=$(ip link show | grep -E 'eth[0-9]+|ens[0-9]+|enp[0-9]+|docker[0-9]+|br-'| grep -v veth|awk -F ': ' '{print $2}')
for interface in $interfaces; do
echo "interface=$interface" >> "$output_file"
done
ipuri=$(ip a | grep -E 'eth[0-9]+|ens[0-9]+|enp[0-9]+|docker[0-9]+|br-'| grep -v veth|grep inet|awk '{print $2}'|cut -d/ -f1|tr "\n" ","|sed 's/.$//')
echo "listen-address="$ipuri >> "$output_file"
Il faceti executabil ca dealtfel toate fisierele .sh ce vor urma cu chmod +x generare_conf.sh si il rulati din folderul respectiv adica /root/dnsmasq cu ./generare_conf.sh
Imediat dupa ce l-ati rulat o sa vedeti ca s-a creat fisierul dnsmasq.conf care la mine ca exemplu arata asa:
no-resolv
server=127.0.0.1#5353
interface=enp0s3
interface=docker0
interface=br-f1945aa7d16f
listen-address=10.0.0.112,172.17.0.1,192.168.11.1
Ce face generare_conf.sh, pai citeste numele interfetelor pe care le aveti cu niste conditii si IP-urile care trebuie si le aranjeaza in asa fel in fisierul dnsmasq.conf
astfel incat serverul dnsmasq sa il citeasca corect.
Dupa ce ati oprit serviciul systemd-resolved (am scris mai sus), trebuie sa puneti o singura data in /etc/resolv.conf:
$ cat /etc/resolv.conf
nameserver 127.0.0.1
Fisierul start.sh care apeleaza si generarea dnsmasq.conf de mai sus:
$ nano start.sh
#! /bin/bash
/root/dnsmasq/generare_conf.sh
sleep 5
if test -f /root/dnsmasq/dnsmasq.conf; then
docker run -d --name dnsmasq \
--restart unless-stopped \
--network=host \
--cap-add=NET_ADMIN \
-v /root/dnsmasq/dnsmasq.conf:/config/dnsmasq.conf \
dpvduncan/dnsmasq
fi
Din folderul /root/dnsmasq porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
Adguard
Va duceti in folder prima data si ramaneti acolo.
Creati 2 subfoldere confdir si workdir si apoi start.sh
$ nano start.sh
docker run -d \
--name adguard --dns 1.1.1.1 \
--restart unless-stopped \
-v /root/adguard/workdir:/opt/adguardhome/work \
-v /root/adguard/confdir:/opt/adguardhome/conf \
-v /opt:/etc/ssl \
-p 5353:53/tcp -p 5353:53/udp -p 8080:80/tcp -p 3000:3000/tcp -p 3001:3001/tcp -p 8531:853/tcp \
adguard/adguardhome
Ca sa instalati si sa configurati adguard trebuie sa accesati prima data serverul pe portul 3000 dupa care pe 8080 pt toate setarile care nu sunt putine insa trebuie
sa acceptati din firewall portul 3000, sa accesati si sa configurati manual mai intai.
Pt a evita treaba asta o sa pun o arhiva cu toate folderele inclusiv adguard cu tot ce contine, cu ce upstream DNS folosesc eu, setari, filtre, DNS custom samd si administrarea
se va face pe 8080, ma rog, prin intermediul nginx care se va explica mai jos.
Daca vreti sa folositi cum am setat eu va logati cu user: adguard si parola1234.
Din folderul /root/adguard porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
Inainte de a trece mai departe, avand in vedere ca deja dnsmasq si adguard ruleaza si este configurat indiferent de metoda, ar trebui sa va rezolve DNS-ul
pe host, verificati orice site cu nslookup, ping etc.
Adguard stie si conexiuni
DNS securizate, DoT si DoH, DoT trece prin HAProxy iar DoH prin nginx. Se va explica mai jos la fiecare, care cum si in ce fel.
DoQ nu folosesc, nici nu stiu cum poate fi folosit, am citit teorie ca merge de udp insa practic cum poti beneficia de el nu am inteles...
DNS-over-TLS. Se poate activa si pe telefonul mobil puneti privateDNS si va conectati permanent prin DoT la serverul adguard.
Pur si simplu scrieti FQDN si telefonul se conecteaza by default la server dot prin tcp 853. Exista pe net servere de genul asta la liber de ex one.one.one.one dar nu aveti filtre.
Ca sa activati, nu mai merge cu certificat wildcard ci trebuie generat certificat LetsEncrypt wildcard pt dot plus wildcard pt subdomeniu. securedns.xxx-yyy-zzz.example.com sa zicem.
Generati cu certbot, am mai explicat prin mai multe locuri pe aici, mai spun o data pe scurt si in pagina asta:
certbot certonly --preferred-chain "ISRG Root X1" --manual --preferred-challenges dns --expand \
-d "securedns.xxx-yyy-zzz.example.com" \
-d "*.securedns.xxx-yyy-zzz.example.com"
Va pune sa faceti in zona DNS o inregistrare TXT record. O faceti, va asigurati ca s-a updatat si dati Enter, aia e tot, se genereaza cetificatul pe care il puneti pe host in /opt (deci cele 2 fisiere generate fullchain si privkey).
Va duceti in Adguard la Encryption Settings si completati exact asa:
- Enable Encryption (bifat)
- Enable plain DNS (bifat) trebuie sa ramana bifat pt DNS normal pe udp 53
- Server name: dot.example.com
- Redirect to HTTPS automatically (debifat pt ca se ocupa nginx)
- la porturi DoT si quick trebuie sa ramana 853 tcp insa pt DoH (vezi mai jos) la HTTPS schimbati 443 cu 3001
- Certificates -file path si puneti calea /etc/ssl/fulldot.pem
- Private key -file path si puneti calea /etc/ssl/privdot.pem
Save configuration
La Setings/DNS settings trebuie declarate IP-urile interne de unde dati acces la clienti pe udp 53 si tot acolo trebuie sa declarati clientii care vor folosi pe telefoane dot pe tcp 853.
Eu am pus cam toate clasele de telefonie mobila RO, daca nimereste cineva FQDN nu are ce sa va fure. Recomand la 3 luni cand expira certificatele sa folositi alt FQDN, apropo subdomeniu se poate face cu 63 de caractere: litere, cifre si caracterul minus. dot.example.com era un exemplu, in realitate am FQDN absolut imposibil de retinut de 63 de caractere.
Evident ca va trebui sa declarati si IP-ul public de acasa, vecini, rude samd ca sa va mearga wifi. Pt acasa am un mic script bash care imi schimba IP-ul direct in fisierul de configurare Adguard si da restart automat la container, la altii mai complicat....oricum solutia este foarte solida, eu ma conectez la wifi numai la mine acasa, la altii nu, raman pe netul meu.
Nota: Este mult mai eficient sa declarati clasele de IP-uri acceptate direct din firewall, iar in adguard lasati allow all.
Iata cum am eu pe iptables clasic, pe distributiile moderne este cu nftables sau direct ufw, pt acest tutorial va arat cum se face cu iptables-legacy:
Nota* Pt ca DoT sa functioneze, este nevoie si de HAProxy, explic imediat mai jos ce trebuie facut.
Se poate activa si
DNS-over-HTTPS. Certificatul generat pt DoT merge si pt DoH, este acelasi certificat.
Utilitatea este ca se poate folosi pe windows in browsere, eu folosesc firefox insa se poate folosi si in brave/chrome.
In primul rand veti avea nevoie de un nginx vhost pt treaba asta, spre deosebire de DoT care pur si simplu trece prin haproxy doar cu tcp redirect, nu rupe SSL acolo,
DoH merge prin nginx si tot aici face si SSL Termination.
Mai jos la sectiunea nginx se explica mai multe, includeti si acest fisier doh.conf pe langa ce este explicat acolo
Ca sa va feriti de scanere, puneti alt port in loc de 443 si in URL recomand ceva random dupa /dns-query:
Daca cumva folositi un nume f lung cum am scris mai sus, nginx va da eroare si pt a remedia trebuie in nginx.conf (configul global) urmatoarea directiva:
http {
server_names_hash_bucket_size 128;
........
Deci la sectiunea Encryption Settings in Adguard trebuie sa va asigurati ca aveti exact asa:
Setari Firefox:

about:preferences#privacy
scroll pana la DNS over HTTPS/Max protection/choose provider custom:
https://
securedns.xxx-yyy-zzz.example.com/dns-query/doh
about:networking#dns
vedeti acolo DoH URL si in coloana TRR trebuie sa scrie true in dreptul siteului vizitat.
Setari Chrome:

Settings/Privacy and Security/Security/Select DNS provider/Add custom DNS service provider si pui URL-ul:
https://
securedns.xxx-yyy-zzz.example.com/dns-query/doh
Diferenta fata de squid (ZeroOmega sau foxyproxy) este ca aveti cu ambele resolver Adguard cu filtre dar cu Squid preiei si IP public de la server, cu DoH NU.
HAProxy (pt DoT)
Faceti un folder /root/haproxy ca la restul si in folder trebuie sa aveti astea:
start.sh:
$ docker run -itd --name haproxy --memory="80m" --restart=always \
--user root --privileged --network=host --dns 1.1.1.1 \
-v /root/rtmp/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
-v /root/rtmp/errors:/etc/haproxy/errors \
-v /opt:/etc/ssl \
haproxy:3.2
Fisierul de configurare haproxy.cfg:
Aveti nevoie si de un subfolder errors ca sa functioneze, valabil pt orice haproxy:
$ ls errors
400.http 403.http 408.http 500.http 502.http 503.http 504.http
HAProxy nu are treaba cu SSL termination, doar face redirect si are mici protectii suplimentare care vin peste cele declarate in firewall.
Exista totusi un minus daca folositi haproxy: Nu mai vedeti separat telefoanele care se conecteaza pt ca toate conexiunile vin de la haproxy care nu stie sa parseze headerele mai departe.
Solutia este sa folositi un subdomeniu pt fiecare telefon in parte. Deci in zona DNS trebuie sa creati aceste inregistrari care sa pointeze catre server, logic. Exemplu:
mihai-oneplus11.securedns.xxx-yyy-zzz.example.com
vlad-samsunga57.securedns.xxx-yyy-zzz.example.com
marius-samsungs26ultra.securedns.xxx-yyy-zzz.example.com
alin-oppofindx8.securedns.xxx-yyy-zzz.example.com
De asemeni in adguard la Client settings trebuie sa creati clientii cu acelasi nume: Exemplu:
New Client: Name: [dot] mihai, Tags: (nu umblati), Identifier: mihai-oneplus11
Fiecare client pe telefon va trebui sa puna numele complet la privateDNS cu tot cu prefix de ex: mihai-oneplus11.securedns.xxx-yyy-zzz.example.com, iar varianta FARA prefix securedns.xxx-yyy-zzz.example.com nu trebuie sa mai functioneze, ea ramane valabila strict numai pt DoH.
Scenariu cu mai multe backend-uri Adguard
Eu am 3 servere cu adguard configurate identic si pt redundanta folosesc o masina nanode unde de asemeni am un haproxy, acolo este ultima versiune haproxy 3.4. Este LTS, e bine sa fie cat mai noua.
Sunt diferente mari in config, mult mai complex:
Va fi nevoie si de un fisier txt incarcat de config: dot_clients.txt care trebuie sa contina toti clientii exact asa:
mihai-oneplus11.securedns.xxx-yyy-zzz.example.com
vlad-samsunga57.securedns.xxx-yyy-zzz.example.com
marius-samsungs26ultra.securedns.xxx-yyy-zzz.example.com
alin-oppofindx8.securedns.xxx-yyy-zzz.example.com
Cum vedeti in log:
Deci vedeti IP-ul clientului si se vede clar despre ce client este vorba si de asemeni care dintre cele 3 backend-uri a rezolvat DNS requestul.
Pe baza logului se pot inventa statistici mult mai clare cu acest script de ex:
Il puteti pune in cron sa genereze un fisier txt o data la jumatate de ora si fisierul ala il atasati la un nginx vhost sa il cititi din browser:
1,31 * * * * /usr/bin/flock -n /var/lock/stats.lock /bin/bash /root/haproxy/stats_dot.sh > /root/rtmp/nginx/html/statsdot.log 2>&1
Si vhostul trebuie sa arate ceva de genul, numai de la un trusted IP incarca, de la oricine altcineva e protejat cu .htpasswd:
In felul asta daca VPS nanode e ok si nu pica, chiar este foarte stabil, nu vei avea nicio problema daca un nod din spate pica, ii dai restart, sau ti se schimba IP public samd, totul este deja acoperit.
Deci si daca se schimba IP public de la oricare din nodurile din backend, nu e nevoie de niciun reload la container, se face automat pe baza resolvers mydns.
Conditia pusa numai pe prefix se aplica numai pe acest LB HA, pe haproxy-urile locale nu mai este necesara.
Ce am explicat mai sus legat de firewall cu clasele permise DoT se muta pe VPS, pe noduri nu trebuie decat allow de la IP-ul VPS-ului si atat!
Squid
Va duceti in folder prima data si ramaneti acolo.
Squid se poate restrictiona sa functioneze pe baza de trusted IP insa in situatia aceasta este mai bine
pe baza de htpasswd. Asa va puteti genera continutul fisierului passwords.new cu user si parola criptata:
apt install -y apache2-utils
htpasswd -B -C 12 -c /root/squid/passwords.new gogudelagaze
echo "gogudelagaze parolagenerata" | docker exec -i squid /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords.new
Va sfatuiesc sa folositi o parola cu multe caractere, caractere speciale, cifre etc si cu ultima comanda verificati.
Fisierul de configurare squid.conf care nu necesita nicio modificare decat port daca il rulati cu network host (recomandat pt o performanta mult mai buna):
Creati start.sh
$ nano start.sh
docker run -d \
--name squid --dns 127.0.0.1\
--network=host \
--memory="1g" --restart=always \
-v /root/squid/squid.conf:/etc/squid/squid.conf \
-v /root/squid/squid.pem:/etc/squid/squid.pem \
-v /root/squid/passwords.new:/etc/squid/passwords.new \
-v /root/squid/entrypoint.sh:/entrypoint.sh \
-v /root/squid/run:/run \
squid-ssl:local /entrypoint.sh
Mai trebuie sa creati subfolder run (unde va rula squid.pid) si inca un fisier entrypoint.sh care trebuie sa fie executabil:
$ cat entrypoint.sh
#!/bin/bash
rm -f /run/squid.pid
exec squid -N -f /etc/squid/squid.conf
$ chmod +x /root/squid/entrypoint.sh
Fara schema asta cu entrypoint, la restart containerul squid intra intr-un restart loop si fix-ul asta rezolva.
Observati ca este folosit un certificat. Este certificat LetsEncrypt bundle generat cu lipirea celor 2 fisiere certificat:
$ cat fullchain.pem privkey.pem > /opt/squid.pem
Observati de asemeni si o imagine squid-ssl:local pe care am compilat-o, este ultimul squid 7.7 cu suport full SSL si cu tot ce trebuie.
Fisierul Dockerfile arata exact asa:
Dupa ce aveti fisierul Dockerfile, build-uiti imaginea:
$ docker build -t squid-ssl:local .
Din folderul /root/squid porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
Din pacate acest squid securizat se poate folosi numai in browser (zero omega sau foxyproxy), in orice alta aplicatie nu prea. Nici in TC nu merge pt ca stie doar HTTP connect, nici filezilla client si orice fel de client de orice fel stie proxy dar NU securizat. Deci in squid.conf pe langa 19504 cu certificat am lasat si 19505 http simplu ca nu se stie niciodata cand ai nevoie.
Wireguard
Din pacate wireguard cu docker merge prost, exista wg-easy f cunoscut insa in ultimii 3 ani l-am tot testat, nu e ce trebuie, pierzi viteza, nu e OK.
Chiar si pornit cu network host mi se pare ca nu e la fel de light.
Pe o conexiune gigabit unde la speedtest am la download in jur de 900, 950 mbps, cu wg-easy(docker) am cam 450 mbps iar cu solutia urmatoare chiar depasesc 800 mbps la download.
Cu ultima versiune pornita cu network host atingi si 650, parca nu mai e asa de mare diferenta dar TOT NU E LA FEL!
Se instaleaza wireguard pe linuxul respectiv, deci trebuie sa fie functional, initial fara niciun fisier de configurare dar sa fie instalat.
$ apt install wireguard wireguard-tools
Obligatoriu trebuie iptables, este mai sus un link catre un exemplu.
Trebuie creata o structura de foldere dupa cum urmeaza:
$ mkdir /root/wgfiles
# mkdir /root/wgtest
Se vor folosi mai multe fisiere care trebuie sa se afle in wgfiles. Arhiva cu toate fisierele
aici.
In principiu ca sa faceti cli fisierele sunt gen.sh, del.sh si mai exista si included.sh.
In /root/wgfiles e destul de complicat cu drepturile:
/root/wgtest/sessions chown 82:82 si chmod 700 si fisierele 82:82 600
/root/wgfiles 82:82 755 si fisierele 82:82
seqno.txt 82:82 777
wgui.lock 82:82 666
gen.sh, del.sh 82:82 755
restul fisierelor 82:82 644 (inclusiv peers.conf)
exceptii cu root: mon1,2,3.txt root 644
monitor.sh root 700
server.key root 600
Este foarte important dupa ce puneti gen.sh sa il editati (temporar) si sa editati la inceput LOCK="/usr/share/nginx/html/wgui.lock" in LOCK="/root/wgfiles/wgui.lock" ca sa rulati o data pe host.
Fisierele pe care le va genera le pastrati, nu le suprascrieti cu cele din arhiva. Fisierele sunt urmatoarele:
extnetif.txt, fwtype.txt, intnetaddress.txt, intnetdns.txt, intnetmtu.txt, seqno.txt, wgui.lock, extnetip.txt, intnetallowedips.txt, intnetmask.txt, portno.txt, sysctltype.txt
Dupa generare puneti variabila la loc.
Nota*
In Adguard se trece si IP-ul 192.168.66.1 la lista de IP-uri permise.
De asemeni in dnsmasq.conf (docker) trebuie refacut dnsmasq.conf:
-se adauga interface=wghub si jos la listen-address se pune si 192.168.66.1
si apoi se restarteaza containerul dnsmasq
Pt administrarea asta va trebuie sa puneti un php custom SPECIAL pt treaba asta, daca pe serverul respectiv mai aveti alt php, trebuie sa fie separate. Daca aveti alt nginx, se poate folosi, va contine doar un chost separat.
Explic mai jos cum se pornesc aceste containere.
Pt ca modificrile sa se ia in seama, se face cu systemd watcher, aveti in arhiva subfolderul systemd-system.
Nginx
Va duceti in folderul nginx prima data si ramaneti acolo.
Aici creati subfolderul conf.d in care veti avea 2 fisiere: adguard.conf si wg.conf. Creati de asemeni si subfolder cert.
Aceste 2 vhosturi vor folosi certificate LetEncrypt care se genereaza cu mai multe metode, puteti cauta exemplu
aici
Indiferent de metoda, se vor genera 2 fisiere, recomand sa fie certificat wildcard pt ca aveti nevoie de 2 inregistrari:
A wireguard.example.com 11.22.33.44 #DNS pt servicii aditionale
A adguard.example.com 11.22.33.44 #DNS pt servicii aditionale
Creati vhost-urile care arata cam asa:
In cazul in care folositi wireguard instalat nativ pe baza solutiei prezentate mai sus, vhostul este asta:
Containerul nginx ar trebui sa se porneasca in felul asta:
$ nano start.sh
docker run -itd \
--name nginx \
--restart unless-stopped \
# ce aveati deja aici adica volume samd
# si obligatoriu includeti si folderul asta:
-v /root/wgfiles:/usr/share/nginx/html/wgui:ro \
-v /opt:/etc/ssl \
--network=host \
nginx:1.25.3-alpine
Din acelasi folder /root/nginx porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
-Deschideti in browser
https://adguard.example.com si revizuiti setarile, adaugati custom DNS, adaugati alte liste etc
Am specificat mai sus cum si am pus si credentialele. Vreti de la zero sa configurati, aveti mai sus explicatii.
Trebuie sa aveti mare atentie la Settings/DNS Settings la sectiunea Allowed clients unde trebuie sa adaugati ip-ul de pe VPS si clasa "retea": 192.168.11.0/28! sau 192.168.66.0/24 pt wg nativ
si eventual si clasa network default 172.17.0.0/26 daca mai sunt si alte containere pe masina si vreti sa aiba resolver Adguard-ul.
-Deschideti in browser
https://wireguard.example.com si creati clienti pt utilizare pe android (QR code) sau pe PC (download config file)
-Pt varianta wireguard instalata nativ veti deschide acelasi
https://wireguard.example.com dar ca sa functioneze veti avea nevoie si de un container php:
PHP (pt varianta wireguard fara docker)
Se build-uieste imaginea php cu pachete aditionale, in principiu wireguard-tools si sudo nu cred ca mai sunt necesare, restul insa trebuie.
Creati folderul /root/php daca nu este creat si intrati in el:
$ docker build -t php:1 .
Ramanem in folderul /root/php si cream start.sh
$ nano start.sh
docker run -itd --name phpwg \
--restart unless-stopped \
-v /root/wgfiles:/usr/share/nginx/html \
-v /root/wgtest/php.ini:/usr/local/etc/php/php.ini:ro \
-v /root/wgtest/fpm/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf:ro \
-v /root/wgtest/sessions:/var/lib/php/sessions \
--security-opt seccomp=unconfined \
--network=host \
php:1
Fisierul index.php care se va folosi trebuie pus in /root/wgfiles unde sunt toate fisierele wireguard, php de acolo citeste:
Acest php apeleaza scripturile bash gen.sh si del.sh pt a crea si sterge clienti(peers) direct din pagina web.
Pt download exista si un fisier separat download.php ca sa puteti descarca peername.conf curat:
index.php trebuie sa aiba chown 82 sau www-data daca exista!
Se poate introduce si o pseudo monitorizare care afiseaza dedesubt ce peers sunt activi, IP de la care sunt conectati, iata un mic bash care creaza mon3.txt de asemeni apelat de index.php:
$ nano /root/wg-files/clienti.sh
#!/bin/bash
wg show wghub | \
awk ' \
/peer:/ {pid=$2} \
/endpoint:/ {endpoint=$2} \
/latest handshake:/ {handshake=$3" "$4" "$5" "$6; printf "Client: %s| Endpoint: %s| Latest Handshake: %s\n", substr(allowed, 1, length(allowed)-3), endpoint, handshake} \
/allowed ips:/ {allowed=$3}' > /root/wgfiles/mon1.txt
cat /root/wgfiles/peers.conf | egrep '.conf|AllowedIPs' | grep -v configuration | awk '{print $3}'|cut -d "/" -f1|tr "\n" " "|xargs -n 2 > /root/wgfiles/mon2.txt
#awk '/.conf|AllowedIPs/ && !/configuration/{split($3,a,"/"); printf "%s%s", a[1], (++cnt % 2 ? OFS : ORS)}' /root/wgfiles/peers.conf > /root/wgfiles/mon2.txt
while IFS="|" read -r client endpoint handshake; do
ip=$(echo $client | awk '{print $2}' | cut -d " " -f2)
name=$(grep $ip /root/wgfiles/mon2.txt | awk '{print $1}')
echo "Client: $name, $endpoint, $handshake"
done < /root/wgfiles/mon1.txt > /root/wgfiles/mon3.txt
Nici nu mai e nevoie de chown, mon3.txt poate ramane si cu root
Mai e nevoie si de scriptul asta monitor.sh care este tot in wgfiles:
Se poate updata la 10 secunde de ex dar se complica prea mult partea de cron, la minut este suficient:
* * * * * /bin/bash /root/wgfiles/monitor.sh >/dev/null 2>&1
Pagina nu are autentificare, e simplu de facut insa nu merita efortul momentan. Securizarea consider ca este suficient facuta din nginx cu htpasswd.
Fata de varianta precedenta, wghub.conf nu mai sta in wgfiles adica folderul controlat direct de nginx si php ci sta in /etc/wireguard/wgui/wghub.php
Este nevoie de un serviciu systemd de care am amintit mai sus, este explicat in arhiva de mai sus. O sa pun totusi scriptul controlat de systemd care este responsabil cu rescrierea acestui conf chiar daca la adaugare sau stergere peer NU se opreste/porneste wireguard ci doar se face un reload dynamic. Scriptul este /usr/local/sbin/wgui-apply:
Comparativ cu varianta docker wg-easy ce am facut eu aici e mai minimalist, permite generarea si stergerea clientilor din browser insa are monitorizare precara.
Este destul de greu de setat insa avand in vedere sporul de performanta fata de wg-easy(docker) cu peste 50% in unele cazuri,eu cred ca a meritat tot efortul.
Ca sa faci monitorizare real time nu ai cum cu php, sau nu stiu eu cum, ai nevoie de ceva syncron sa ruleze in continuu asa cum e facut wg-easy, ai nevoie de nodejs.
Clar se poate face si asta insa nu acopera acest tutorial, e suficient si asa cum am facut eu, macar ai link sa verifici IP-ul clientului.
Dupa crearea unui nou client(peer) si scanarea pe telefon, aveti doua metode de restart wireguard ca sa se ia setarile in considerare, ambele functioneaza perfect.
Avand in vedere ca pt monitorizare (daca vreti sa puneti) trebuie cron-ul ala la minut, mai bine va chinuiti cu metoda2 pt restart wireguard, scapati de inca un cron, cum doriti.
Scopul proiectului este sa putem face web management cu docker pt wireguard instalat nativ.
Functionare si Mentenanta
In mod normal un setup cu 5 containere docker se pune cu docker-compose insa eu nu i-am dat de cap. Nu am reusit sa setez docker-compose.yaml sa porneasca in ordine containerele,
nu inteleg ce am gresit, indiferent de ce fac nu am DNS nici in squid nici in wireguard deci nu merge nimic.
Am reusit insa in schimb sa fac un mic script bash care se asigura ca este totul in regula si indiferent de situatie porneste totul corect:
Acest script se poate pune pe linux si in crontab sa ruleze singur o data la o ora sa zicem, cum e ceva in neregula se asigura ca fiecare container este up and running.
Se poate pune si la startup cand se da reboot la masina pt updates, etc. Mare atentie sa scoateti wg-easy din variabila array daca folositi wireguard instalat nativ si sa il inlocuiti cu php!
Aveti aici o arhiva cu toate folderele si fisierele pe care le-am explicat pas cu pas ce face fiecare.
Utilizare clienti
Clientul VPN wireguard se descarca de pe
siteul oficial pt windows si linux iar pe telefoanele cu Android se instaleaza gratis din Google Play.
Dupa cum am explicat mai sus, pe PC se foloseste fisier de configurare iar pe Android se adauga conexiunea pe baza de QR code.
Pt cine vrea sa aiba IP schimbat si aceasta protectie doar in browser, Proxy-ul http squid se poate folosi pe baza unor extensii. Cele mai cunoscute sunt FoxyProxy (PC cam orice browser si Android doar cu firefox)
iar pe PC se mai poate folosi si Switchy Omega, in opinia mea extensie ceva mai buna.
Se poate folosi in browser doar DNS-ul de tip DoH (am explicat mai sus) si diferenta este ca fata de squid, aveti aceeasi protectie Adguard dar fara sa preluati si IP-ul public.
Pt wireguard puteti folosi direct IP, nu e obligatoriu sa folositi domain (unul din cele 2 de sus), wireguard va da direct configul, insa pt squid folositi FQDN pt ca are certificat,port 19504 plus user/pass.
Avantajul folosirii acestei solutii pe PC sau pe telefon este ca aveti IP-ul de unde ruleaza serverul (in cazul meu Oracle Cloud Frankfurt Germania) si ca resolver de DNS aveti Adguard pe baza filtrelor puse de voi.
In afara de youtube, nu va apare nicio reclama pe niciun site in niciun browser, deci nu veti mai fi nevoiti sa instalati adblockere in browsere.
Foarte important este faptul ca nu veti avea DNS leak, sunt o multime de servicii VPN platite prost setate care va dau IP de nush ce tara dar va da de gol DNS-ul.
In cazul nostru pe langa faptul ca nu aveti leak, mai are si acele custom filters pe care le-ati setat in Adguard.
Mai mult, va puteti crea in Adguard inregistrari DNS fake care va merg numai voua, nu sunt publicate in Internet, de la Filters/DNS rewrites.
Un mic detaliu pt cine stie la ce ma refer, cu wireguard nu veti avea nici WebRTC leak, putina lume stie detaliul asta. Sunt unele siteuri care verifica deci pe partea asta squid nu poate ascunde.
Asta e asa un bonus, WebRTC se poate rezolva pe PC in firefox de la
about:config media.peerconnection.enabled false
iar pe orice browser based on chromium cu extensia
asta si in felul asta folositi squid cu incredere, nu va da de gol. De asemeni aveti nevoie de
Canvas si de inca o extensie care va protejeaza Geolocation:
Vytal cu care puteti face spoof la User agent si la Location Data.
Deci pe langa IP aveti nevoie de protectie la
DNS, WebRTC, Canvas fingerprint, Geolocation (timezone) si browser agent.
Pe telefoanele cu android recomand Firefox care permite instalarea de extensii. Eu folosesc uBlock Origin chiar daca oricum nu aveti reclame dar e bine sa fie, Proxy SwitchyOmega3 (ZeroOmega) si f important, Disable WebRTC (asa se numeste extensia). Pe brave din pacate va da de gol WebRTC pe telefon insa cu Firefiox, e rock solid, e ca si cum ati fi conectati la wireguard!
Happy safe browsing the internet!
Last update 2 Nov 2026.