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.
Serverul adguard va avea niste filtre care vor bloca reclamele de pe orice site, mai putin youtube, pt youtube avem alta solutie
aici
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 adguard)
- 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.
Creare retea docker
- Pt urmatoarele 3 containere va trebui creata o retea docker speciala care va fi folosita de adguard, squid si wg-easy:
$ docker network create --driver=bridge --subnet=192.168.11.0/28 retea
$ docker network ls|grep retea
f1945aa7d16f retea bridge local
O mica mentiune, aceste 3 containere folosesc docker network "retea" creeata aici iar dnsmasq si nginx folosesc docker network host!!
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 \
--network=retea --link dnsmasq --restart unless-stopped \
-v /root/adguard/workdir:/opt/adguardhome/work \
-v /root/adguard/confdir:/opt/adguardhome/conf \
-p 5353:53/tcp -p 5353:53/udp -p 8080:80/tcp -p 3000:3000/tcp -p 853: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.
Squid
Va duceti in folder prima data si ramaneti acolo.
O sa gasiti toate fisierele in arhiva pe langa start.sh: squid.conf si password. Squid se poate restrictiona sa functioneze pe baza de trusted IP insa in situatia aceasta este mai bine
pe baza de htpasswd.
Aici va puteti genera continutul fisierului password cu user si parola criptata.
Va sfatuiesc sa folositi o parola cu multe caractere, caractere speciale, cifre etc
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 10.0.0.112 \ #aici puneti IP-ul vostru
--network=host \
--memory="1g" --restart=always \
-v /root/squid/squid.conf:/etc/squid/squid.conf \
-v /root/squid/passwords:/etc/squid/passwords \
ubuntu/squid
Din folderul /root/squid porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
Creare forward pe host
Inainte de a porni wirequard (wg-easy) pe host trebuie activat port forward la nivel de kernel:
$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
Verificare:
$ /sbin/sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Wireguard
Va duceti in folderul wg-easy prima data si ramaneti acolo.
Creati aici subfolderul care se va numi tot wg-easy cu mkdir wg-easy
Creati start.sh
$ nano start.sh
docker run -d \
--name=wg-easy \
--network=retea \
--restart unless-stopped \
--link adguard \
-e WG_HOST=11.22.33.44 \ #Aici puneti ip-ul public chiar daca pe VPS aveti ip de retea
-e PASSWORD=parola_administrare \
-e WG_DEFAULT_DNS=192.168.11.1 \ #Asta asa ramane pt ca asta e GW-ul de la reteaua docker "retea"
-v /root/wg-easy/wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy
Din acelasi folder /root/wg-easy porniti containerul cu ./start.sh si ulterior verificati daca a pornit containerul, loguri samd.
Wireguard este dificil de setat fara aceasta interfata web (wg-easy) care are in spate nodejs din ce am citit, este f profesional facut, totul intr-un singur container.
Dupa ce o sa accesati mai jos in browser interfata wg-easy veti observa in subfolderul wg-easy fisierele de configurare.
Ca si curiozitate puteti observa de asemeni si cum este setat iptables in container, este nevoie de forward si postrouting pt a primi IP-ul pe partea de client:
Configurarea wireguard pe host fara acest wg-easy este destul de complicata si ar fi necesitat foarte multe explicatii mai ales pe parte de firewall,
generare si imperechere a keylor de criptate server/client samd. Solutia wg-easy este exceptionala, repet.
Nota* Din pacate aceasta solutie cu docker dpdv performanta pierde pana la 50% din viteza up/down comparativ cu wireguard instalat nativ.
wg-easy se poate instala si nativ insa necesita sa instalezi si nodejs. Se bazeaza de asemeni pe wireguard instalat nativ insa nu am testat, totul se face pe host.
-------------------------------------------------------------------------------------------------------------------------------------------------
Alternativa server wireguard fara docker, mai rapida cu pana la ~ 50% cu management ce ruleaza docker
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 750 mbps la download.
Asigurati-va ca este oprit containerul wg-easy si ca nu porneste accidental, foarte important!
Se instaleaza wireguard pe linuxul respectiv, deci trebuie sa fie functional, initial fara niciun fisier de configurare dar sa fie instalat.
$ apt install wireguard
$ apt-get install -y qrencode
Obligatoriu trebuie iptables, este mai sus un link catre un exemplu.
$ mkdir /root/easy-wg-quick
$ chmod 777 /root/easy-wg-quick #php-ul va avea nevoie de 777 in acest folder ca sa poata scrie
$ cd /root/easy-wg-quick #(si ramanem aici)
$ wget https://git.io/fjb5R -O gen.sh
$ chmod +x gen.sh
Se editeaza fisierul gen.sh in mai multe locuri, fisierul arata asa dupa modificari:
Se ruleaza gen.sh si genereaza toate fisierele necesare si totodata se creeaza si primul client (client1) dupa care se restarteaza serverul:
$ ./gensh client1
Listati cu ls sa vedeti ca a creat niste fisiere, nu voi explica ce face fiecare, doar pt client1 sunt 3 fisiere la numar.
In momentul asta wireguard ar trebui sa fie deja pornit si se verifica ca s-a ridicat:
$ wg
Nota*
In Adguard se trece si IP-ul 10.88.188.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 10.88.188.1
si apoi se restarteaza containerul dnsmasq
Pt generarea urmatorilor clienti. de ex client2 sau cum vreti sa il denumiti ca sa stiti cine il foloseste:
$ ./gensh client2
Cu comanda asta se genereaza cele 3 fisiere pt client2, adauga automat index nou in fisierul seqno.txt si de asemeni adauga noul client(peer) in server wghub.conf. Comanda nu mai modifica/adauga nimic altceva!
Ca sa stergeti un client (peer) rulati acest script si va sterge peer-ul din wghub.conf si sterge cele 3 fisiere client.
Fisierul il aveti dedesubt si il rulati cu:
$ ./del.sh clientx.
Daca ati scris gresit numele clientului scriptul de opreste, nu are sens sa restarteze wireguard degeaba.
Observam ca exista si un fisier inclus included.sh, acest fisier mai verifica inca o data seqno.txt si elimina liniile goale inutile din fisierul wghub.conf care mai apar la rularea gen.sh sau del.sh:
Cam atat, scripturile functioneaza daca se face administrarea ssh insa
scopul este sa facem management web ca sa nu intram ssh de fiecare data.
Ca sa fie clar, toate fisierele trebuie sa fie in /root/easy-wg-quick: del.sh, gen.sh, included.sh, index.php, qrcode.png, wireguard.png plus ce se genereaza ulterior.
Doar primele 3 va trebuie daca ramaneti la ssh!
Pt management web este relativ complicat de setat, o sa incerc sa explic aici cum am reusit:
Dupa ce este pus si php-ul (vedeti mai jos cum) testati din browser adaugarea unui peer si ar trebui sa va genereze 3 fisiere noi si sa modifice si continutul fisierului wghub.conf
Din cauza containerului php, fisierele se creaza cu alt owner, in cazul meu 82 (pt ca userul www-data din container are uid 82) si ca atare tot folderul /root/easy-wg-quick trebuie sa aiba chown 82:82
cu tot cu fisierele din interior. Puteti crea manual pe host www-data cu id 82 sau daca exista deja doar ii schimbati id cu usermod si o sa va arate frumos fisierele cu www-data insa sincer nu ajuta la nimic.
Acelasi folder /root/easy-wg-quick are chmod 777, din pacate nu merge altfel. Deci la un ls in folder, totul trebuie sa fie cu 82 (user si group) sau www-data daca ati facut ce am scris si de asemeni toate fisierele trebuie sa aiba chmod 644 cel putin.
Fisierul seqno.txt trebuie sa aiba 777 iar cele sh 755 (execute) altfel nu merge nimic. Pe alocuri se mai strica permisiunile si am pus niste comenzi chmod si chown prin scripturile sh.
Daca sunt indeplinite toate conditiile puteti genera si sterge clienti din pagina web, adica pe partea de fisiere e totul ok insa din browser nu se poate da restart la wireguard ca
sa le mai si ia in considerare. Comanda de restart este inclusa in gen.sh si del.sh dar merge numai daca scriptul este executat din consola, nu din php!
Tot din cauza userului www-data, in momentul in care ajunge sa execute comanda wg-quick down/up, (wireguard-tools si sudo de asemeni instalate in container) nu are cum sa execute pe host din lipsa de drepturi.
Am incercat tot felul de workaround-uri inclusiv sa schimb uid in container din 82 in 1000, nu are niciun efect.
Culmea este ca in container functioneaza comanda wg-quick, nu mai da nici o eroare in loguri dar totusi nu restarteaza.
Intr-un final am renuntat, posibil sa se poata faca insa probabil s-ar crea niste gauride securitate dupa cum am citit, nu prea avea rost si pe cale de consecinta am comentat comanda de reload wg de la
sfarsitul scripturilor gen.sh si del.sh, nu isi mai are rostul.
Asadar pt restart wireguard ca sa se ia in considerare modificarile fisierelor facute din browser, aveti doua metode:
Metoda 1. cro.sh pe care il puneti pe host direct in /root/ nu in subfolderul easy-wg-quick care ruleaza in crontab la 2 minute si verifica cand s-a modificat ultima data wghub.conf.
Daca e mai nou de 1.99 min (aprox 119 secunde) atunci da restart la wireguard, daca nu, nu pt ca nu are sens:
#!/bin/bash
fisier="/root/easy-wg-quick/wghub.conf"
if find "$fisier" -mmin -1.99 | grep -q '.'; then
#/bin/bash -c 'exec /usr/bin/wg syncconf wghub <(exec /usr/bin/wg-quick strip wghub)'
wg-quick down $fisier
wg-quick up $fisier
fi
Crontab-ul:
$ crontab -l
*/2 * * * * /bin/bash /root/cro.sh
Metoda 2. Cream in systemd un serviciu wgui.service si un fisier path wgui.path cu care se monitorizeaza fisierul wghub.conf si da restart wireguard cand acesta s-a modificat.
Nu sunt mare fan systemd, e prima data cand am testat scenariul asta:
Nu dati enable la serviciul asta wgui pt ca va porni la reboot si o sa dea eroare pt ca el se astepta ca interfata wghub sa fie up.
Trebuie sa dati si un systemctl daemon-reload dupa ce creati astea 2 fisiere systemd:
$ systemctl daemon-reload
$ wg-quick up /root/easy-wg-quick/wghub.conf
$ systemctl restart wgui.{path,service}
De asemeni mai trebuie inca un fisier sa zicem /root/easy-wg-quick/restartwg.sh apelat de wgui.service care e la fel ca si fisierul cro.sh dar fara niciun fel de conditie:
#!/bin/bash
/usr/bin/wg-quick down /root/easy-wg-quick/wghub.conf
/usr/bin/wg-quick up /root/easy-wg-quick/wghub.conf
Nu sunt fan systemd, serviciul wireguardului nu il manage-uiesc cu systemctl, nu merge niciodata cum trebuie insa artificul cu acest wgui isi face treaba.
Nu garantez ca va functiona din prima, trebuie monitorizate logurile de la containerul php in caz ca nu merge ceva, am facut asa de multe incercari si modificari incat nu stiu daca e totul acoperit aici,
din pacate le-am bajbait si eu intr-un mare fel pana a iesit...
A doua metoda
modifica instant, practic este un fel de reload, face fix acelasi lucru.
Singurul avantaj e ca face instant insa necesita un serviciu aditional, chestie de gust.
Aceasta solutie de deasupra are management web docker (nginx+php) facut de mine si wireguard instalat nativ pe host.
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 pt wg se schimba si va functiona in tandem cu un alt container php:
Dupa ce aveti vhost-urile si certificatele puse in foldere, creati start.sh
$ nano start.sh
docker run -itd \
--name nginx \
--restart unless-stopped \
-v /root/nginx/cert:/etc/ssl \
-v /root/nginx/conf.d/wg.conf:/etc/nginx/conf.d/wg.conf \
-v /root/nginx/conf.d/adguard.conf:/etc/nginx/conf.d/adguard.conf \
-v /root/easy-wg-quick:/usr/share/nginx/html \
--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 10.88.188.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 php \
-v /root/easy-wg-quick:/usr/share/nginx/html \
-v /root/php/php.ini:/usr/local/etc/php/php.ini \
--privileged --network=host \
php:1
Fisierul index.php care se va folosi trebuie pus in /root/easy-wg-quick unde sunt toate fisierele wireguard, php de acolo citeste: