Construim un router SOCKS pe laptop cu Debian 10

Un an (sau două) de zile am amânat publicarea acestui articol dintr-un motiv principal — publicasem deja două articole în care am descris procesul de creare a unui router SOCKS dintr-un laptop obișnuit cu Debian.

Cu toate acestea, între timp versiunea stabilă a Debian-ului s-a actualizat la Buster, iar un număr suficient de mare de persoane m-au contactat pentru ajutor în configurare, ceea ce înseamnă că articolele mele anterioare nu sunt exhaustive. Ei bine, mă gândeam deja că metodele expuse în ele nu dezvăluie pe deplin toate nuanțele configurării Linux pentru rutarea în SOCKS. În plus, acestea sunt scrise pentru Debian Stretch, iar după actualizarea la Buster, în sistemul de inițializare systemd, am observat mici schimbări în interacțiunea serviciilor. De asemenea, în articolele mele nu am folosit systemd-networkd, deși este cea mai potrivită pentru configurații de rețea complexe.

În plus față de schimbările menționate mai sus, în configurația mea s-au adăugat următoarele servicii: hostapd — un serviciu pentru virtualizarea punctelor de acces, ntp pentru sincronizarea timpului clienților din rețeaua locală, dnscrypt-proxy pentru criptarea conexiunilor prin protocolul DNS și blocarea publicității pe clienții din rețeaua locală, precum și, așa cum am menționat anterior, systemd-networkd pentru configurarea interfețelor de rețea.

Iată o diagramă simplă a structurii interne a unui astfel de router.

Construim un router SOCKS pe laptop cu Debian 10

Așadar, vă reamintesc care sunt obiectivele acestui ciclu de articole:

  1. A ruga toate conexiunile OS prin SOCKS, precum și conexiunile tuturor dispozitivelor din aceeași rețea cu laptopul.
  2. Laptopul meu, în acest caz, trebuie să rămână complet mobil. Asta înseamnă că trebuie să permită utilizarea unui mediu desktop și să nu fie legat de o locație fizică.
  3. Ultimul punct implică conectarea și rutarea doar prin intermediul interfeței wireless integrate.
  4. Și, bineînțeles, crearea unui ghid cuprinzător, precum și analiza tehnologiilor corespunzătoare în măsura cunoștințelor mele modeste.

Ce va fi discutat în acest articol:

  1. git — vom descărca repositoarele proiectelor tun2socks, necesar pentru rutarea traficului TCP în SOCKS, și create_ap — un script pentru automatizarea configurării punctului de acces virtual utilizând hostapd.
  2. tun2socks — vom construi și instala serviciul systemd în sistem.
  3. systemd-networkd — vom configura interfețele wireless și virtuale, tabelele de rutare statică și redirecționarea pachetelor.
  4. create_ap — vom instala serviciul systemd în sistem, vom configura și vom lansa punctul de acces virtual.

Pași opționali:

  • ntp — vom instala și configura un server pentru sincronizarea timpului la clienții punctului de acces virtual.
  • dnscrypt-proxy — vom cripta cererile DNS, le vom ruga în SOCKS și vom dezactiva domeniile publicitare pentru rețeaua locală.

De ce toate acestea?

Aceasta este una dintre modalitățile de organizare a protecției conexiunilor TCP ale rețelei locale. Principalul avantaj este că toate conexiunile trec prin SOCKS, dacă pentru ele nu a fost construit un traseu static prin gateway-ul original. Asta înseamnă că nu trebuie să configurăm setările serverului SOCKS nici pentru programele individuale, nici pentru clienții din rețeaua locală — toate merg în SOCKS implicit, deoarece acesta este gateway-ul implicit, până când specificăm altul.

Practic, adăugăm un al doilea router de criptare sub forma unui laptop înaintea routerului original și folosim conexiunea de internet a routerului original pentru cererile SOCKS deja criptate ale laptopului, care, la rândul său, rutează și criptează cererile clienților din rețeaua locală.

Din punctul de vedere al furnizorului, suntem conectați constant la un singur server cu trafic criptat.

Prin urmare, toate dispozitivele se conectează la punctul de acces virtual al laptopului.

Instalați tun2socks în sistem

Atâta timp cât mașina dvs. are internet, descărcați toate uneltele necesare.

apt update
apt install git make cmake

Descărcați pachetul badvpn

git clone https://github.com/ambrop72/badvpn

Va apărea un folder în sistemul dumneavoastră badvpn. Creați un folder separat pentru compilare

mkdir badvpn-build

Accesați-l

cd badvpn-build

Compilați tun2socks

cmake ../badvpn -DBUILD_NOTHING_BY_DEFAULT=1 -DBUILD_TUN2SOCKS=1

Instalați în sistem

make install
  • Parametru -DBUILD_NOTHING_BY_DEFAULT=1 dezactivează compilarea tuturor componentelor din repository-ul badvpn.
  • —DBUILD_TUN2SOCKS=1 includează componenta în compilare tun2socks.
  • make install — va instala binarul tun2socks în sistemul dumneavoastră la adresă /usr/local/bin/badvpn-tun2socks.

Instalați serviciul tun2socks în systemd

Creați un fișier /etc/systemd/system/tun2socks.service cu următorul conținut:

[Unit]
Description=SOCKS TCP Relay

[Service]
ExecStart=/usr/local/bin/badvpn-tun2socks --tundev tun2socks --netif-ipaddr 172.16.1.1 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:9050

[Install]
WantedBy=multi-user.target
  • --tundev — primește numele interfeței virtuale, pe care o inițializăm cu systemd-networkd.
  • --netif-ipaddr — adresa de rețea a „routerului” tun2socks, la care se conectează interfața virtuală. Este mai bine să fie un subrețea rezervată separată subrețea rezervată.
  • --socks-server-addr — acceptă un socket (adresă:port al serverului SOCKS).

Dacă serverul dumneavoastră SOCKS necesită autentificare, puteți specifica parametrii --username și --password.

În continuare, înregistrați serviciul

systemctl daemon-reload

Și activați

systemctl enable tun2socks

Înainte de a porni serviciul, asigurăm o interfață de rețea virtuală pentru acesta.

Trecem la systemd-networkd

Activăm systemd-networkd:

systemctl enable systemd-networkd

Dezactivăm serviciile de rețea curente.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-wait-online — este un serviciu care așteaptă existența unei conexiuni de rețea funcționale înainte ca systemd să continue să pornească alte servicii care depind de existența rețelei. Îl dezactivăm, deoarece vom trece la echivalentul systemd-networkd.

Să-l activăm imediat:

systemctl enable systemd-networkd-wait-online

Configurați interfața de rețea wireless

Creați un fișier de configurare systemd-networkd pentru interfața de rețea wireless /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Name — acesta este numele interfeței dumneavoastră wireless. Identificați-l cu comanda ip a.
  • IPForward — directiva care activează redirecționarea pachetelor pe interfața de rețea.
  • Address răspunde de atribuirea adresei IP interfeței wireless. O specificăm static, deoarece în cazul directivei echivalente DHCP=yes, systemd-networkd creează în sistem o poartă implicită. Atunci tot traficul va merge prin poarta originală, și nu prin viitoarea interfață virtuală dintr-o subrețea diferită. Puteți verifica poarta implicită curentă cu comanda ip r

Creați o rută statică pentru serverul SOCKS la distanță

Dacă serverul dumneavoastră SOCKS nu este local, ci la distanță, va trebui să creați o rută statică pentru acesta. În acest scop, adăugați o secțiune Route la finalul fișierului de configurare a interfeței wireless creat de dumneavoastră cu următorul conținut:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — aceasta este poarta implicită sau adresa punctului de acces original.
  • Destination — adresa serverului SOCKS.

Configurați wpa_supplicant pentru systemd-networkd

systemd-networkd folosește wpa_supplicant pentru a se conecta la un punct de acces securizat. Atunci când încearcă să „ridice” interfața wireless, systemd-networkd pornește serviciul wpa_supplicant@nume, unde nume — este numele interfeței wireless. Dacă nu ați folosit systemd-networkd până acum, este probabil ca acest serviciu să nu fie disponibil în sistemul dvs.

Prin urmare, creați-l cu comanda:

systemctl enable wpa_supplicant@wlp6s0

Am folosit wlp6s0 ca nume al interfeței dvs. wireless. Acest nume poate diferi. Îl puteți afla cu comanda ip l.

Acum, serviciul creat wpa_supplicant@wlp6s0 va porni la activarea interfeței wireless, însă, la rândul său, va căuta setările SSID și parola punctului de acces în fișierul /etc/wpa_supplicant/wpa_supplicant-wlp6s0. De aceea, este necesar să-l creați folosind utilitarul wpa_passphrase.

Pentru aceasta, rulați comanda:

wpa_passphrase SSID password>\/etc\/wpa_supplicant\/wpa_supplicant-wlp6s0.conf

unde SSID — este numele punctului dvs. de acces, password — parola, iar wlp6s0 — este numele interfeței dvs. wireless.

Inițializați interfața virtuală pentru tun2socks

Creați un fișier pentru inițializarea noii interfețe virtuale în sistem/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Name — acesta este numele pe care systemd-networkd îl va atribui viitoarei interfețe virtuale la inițializare.
  • Kind — este tipul interfeței virtuale. Din denumirea serviciului tun2socks, puteți deduce că folosește interfața de tip tun.
  • netdev — este extensia fișierelor pe care systemd-networkd le folosește pentru a inițializa interfețele de rețea virtuale. Adresa și alte setări de rețea pentru aceste interfețe sunt specificate în .network-fișiere.

Creați un astfel de fișier /etc/systemd/network/25-tun2socks.network cu următorul conținut:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2\/24
Gateway=172.16.1.1
  • Name — numele interfeței virtuale pe care l-ați specificat în netdev-fișier.
  • Address — adresa IP care va fi atribuită interfeței virtuale. Trebuie să fie în aceeași rețea cu adresa pe care ați specificat-o în serviciul tun2socks
  • Gateway — adresa IP a «routerului» tun2socks, pe care ați specificat-o la crearea serviciului systemd.

Astfel, interfața tun2socks are adresa 172.16.1.2, iar serviciul tun2socks — 172.16.1.1, adică este gateway pentru toate conexiunile de la interfața virtuală.

Configurați punctul de acces virtual

Instalați dependențele:

apt install util-linux procps hostapd iw haveged

Descărcați repository-ul create_ap pe mașina dvs.:

git clone https:\/\/github.com\/oblique\/create_ap

Navigați în folderul repository-ului pe mașina dvs.:

cd create_ap

Instalați-l în sistem:

make install

În sistemul dvs. va apărea un fișier de configurare /etc/create_ap.conf. Iată opțiunile principale pentru modificare:

  • GATEWAY=10.0.0.1 — ar fi mai bine să creați o subrețea rezervată separată.
  • NO_DNS=1 — dezactivați-l, deoarece acest parametru va fi gestionat de interfața virtuală systemd-networkd.
  • NO_DNSMASQ=1 — dezactivați din același motiv.
  • WIFI_IFACE=wlp6s0 — interfața wireless a laptopului.
  • INTERNET_IFACE=tun2socks — interfața virtuală creată pentru tun2socks.
  • SSID=hostapd — numele punctului de acces virtual.
  • PASSPHRASE=12345678 — parola.

Nu uitați să activați serviciul:

systemctl enable create_ap

Activați serverul DHCP în systemd-networkd

Serviciul create_ap inițiază în sistem interfața virtuală ap0. Teoretic, pe această interfață trebuie să ruleze dnsmasq, dar de ce să instalăm servicii suplimentare, când systemd-networkd are un server DHCP încorporat?

Pentru a-l activa, vom defini setările de rețea pentru punctul de acces virtual. Pentru aceasta, creați un fișier /etc/systemd/network/25-ap0.network cu următorul conținut:

[Match]
Name=ap0

[Network]
Address=10.0.0.1/24
DHCPServer=yes

[DHCPServer]
EmitDNS=yes
DNS=10.0.0.1
EmitNTP=yes
NTP=10.0.0.1

După ce serviciul create_ap inițiază interfața virtuală ap0, systemd-networkd îi va asigna automat o adresă IP și va activa serverul DHCP.

Liniile EmitDNS=yes și DNS=10.0.0.1 transmit setările serverului DNS dispozitivelor conectate la punctul de acces.

Dacă nu intenționați să folosiți un server DNS local — în cazul meu, acesta este dnscrypt-proxy — puteți seta DNS=10.0.0.1 în DNS=192.168.1.1, unde 192.168.1.1 — adresa gateway-ului original. Atunci, cererile DNS ale gazdei și ale rețelei locale vor trece în mod necriptat prin serverele furnizorului.

EmitNTP=yes și NTP=192.168.1.1 transmit setările NTP.

Același lucru este valabil și pentru linia NTP=10.0.0.1.

Instalați și configurați serverul NTP

Instalați-l în sistem:

apt install ntp

Editați configurația /etc/ntp.conf. Comentați adresele pool-urilor standard:

#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst

Adăugați adresele serverelor publice, de exemplu, NTP Public de la Google:

server time1.google.com iburst
server time2.google.com iburst
server time3.google.com iburst
server time4.google.com iburst

Oferiți acces la server clienților din rețeaua dvs.:

restrict 10.0.0.0 mask 255.255.255.0

Activați difuzarea în rețeaua dvs.:

broadcast 10.0.0.255

În cele din urmă, adăugați adresele acestor servere în tabelul de rutare statică. Pentru aceasta, deschideți fișierul de configurare al interfeței wireless /etc/systemd/network/25-wlp6s0.network și adăugați la sfârșitul secțiunii Route.

[Route]
Gateway=192.168.1.1
Destination=216.239.35.0

[Route]
Gateway=192.168.1.1
Destination=216.239.35.4

[Route]
Gateway=192.168.1.1
Destination=216.239.35.8

[Route]
Gateway=192.168.1.1
Destination=216.239.35.12

Puteți afla adresele serverelor dvs. NTP folosind utilitarul host în următorul mod:

host time1.google.com

Instalați dnscrypt-proxy, eliminați reclamele și ascundeți traficul DNS de la furnizor

apt install dnscrypt-proxy

Pentru a gestiona cererile DNS ale gazdei și ale rețelei locale, editați socket-ul /lib/systemd/system/dnscrypt-proxy.socket. Modificați următoarele linii:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Repornți systemd:

systemctl daemon-reload

Editați configurația /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Pentru a redirecționa conexiunile dnscrypt-proxy prin tun2socks, adăugați mai jos:

force_tcp = true

Editați configurația /etc/resolv.conf, care informează serverul DNS gazdă.

nameserver 127.0.0.1
nameserver 192.168.1.1

Prima linie include utilizarea dnscrypt-proxy, iar a doua folosește gateway-ul original, în cazul în care serverul dnscrypt-proxy nu este disponibil.

Gata!

Reporniți sau opriți serviciile de rețea active:

systemctl stop networking NetworkManager NetworkManager-wait-online

Și reporniți toate cele necesare:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

După repornire sau restart, veți avea un al doilea punct de acces, care va dirija gazda și dispozitivele din rețeaua locală către SOCKS.

Iată cum arată ieșirea ip a pentru un laptop obișnuit:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: tun2socks:  mtu 1500 qdisc pfifo_fast state UP group default qlen 500
    link/none 
    inet 172.16.1.2/24 brd 172.16.1.255 scope global tun2socks
       valid_lft forever preferred_lft forever
    inet6 fe80::122b:260:6590:1b0e/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
3: enp4s0:  mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether e8:11:32:0e:01:50 brd ff:ff:ff:ff:ff:ff
4: wlp6s0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4c:ed:de:cb:cf:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global wlp6s0
       valid_lft forever preferred_lft forever
    inet6 fe80::4eed:deff:fecb:cf85/64 scope link 
       valid_lft forever preferred_lft forever
5: ap0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4c:ed:de:cb:cf:86 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global ap0
       valid_lft forever preferred_lft forever
    inet6 fe80::4eed:deff:fecb:cf86/64 scope link 
       valid_lft forever preferred_lft forever

În concluzie

  1. Providerul vede doar conexiunea criptată către serverul dvs. SOCKS, deci nu vede nimic.
  2. Cu toate acestea, el vede solicitările dvs. NTP, pentru a preveni acest lucru, eliminați rutele statice pentru serverele NTP. Totuși, nu este sigur că serverul dvs. SOCKS permite protocolul NTP.

Soluție observată pe Debain 10

Dacă încercați să reporniți serviciul de rețea din consolă, acesta va cădea cu o eroare. Acest lucru se datorează faptului că o parte din el, sub formă de interfață virtuală, este legată de serviciul tun2socks, deci este utilizată. Pentru a reporni serviciul de rețea, trebuie mai întâi să opriți serviciul tun2socks. Dar, cred că dacă ați citit până aici, aceasta nu va fi o problemă pentru dvs.!

Linkuri

  1. Rutare statică în Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Acest script creează un punct de acces WiFi NATat sau Bridged.
  5. dnscrypt-proxy 2 — Un proxy DNS flexibil, cu suport pentru protocoale DNS criptate.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster