Costruire un router in SOCKS su un laptop con Debian 10

Per un anno intero (o due) ho rimandato la pubblicazione di questo articolo per il motivo principale: avevo già pubblicato due articoli in cui descrivevo il processo di creazione di un router in SOCKS da un laptop molto comune con Debian.

Tuttavia, da allora la versione stabile di Debian è stata aggiornata a Buster, un numero sufficiente di persone mi ha contattato in privato chiedendo aiuto con la configurazione, il che significa che i miei articoli precedenti non sono esaustivi. Bene, io stesso ho intuito che i metodi in essi delineati non rivelano completamente tutte le complessità della configurazione di Linux per il routing in SOCKS. Inoltre, sono scritti per Debian Stretch e, dopo l'aggiornamento a Buster, nel sistema systemd init, ho notato piccoli cambiamenti nell'interazione dei servizi. E negli articoli stessi non ho utilizzato systemd-networkd, sebbene sia più adatto per configurazioni di rete complesse.

Oltre alle modifiche di cui sopra, alla mia configurazione sono stati aggiunti i seguenti servizi: hostapd - servizio per la virtualizzazione dei punti di accesso, ntp per sincronizzare l'ora dei client della rete locale, dnscrypt-proxy per crittografare le connessioni tramite DNS e disattivare la pubblicità sui client della rete locale e inoltre, come ho detto prima, systemd-networkd per la configurazione delle interfacce di rete.

Ecco un semplice diagramma a blocchi della struttura interna di tale router.

Costruire un router in SOCKS su un laptop con Debian 10

Permettetemi quindi di ricordarvi quali sono gli obiettivi di questa serie di articoli:

  1. Instrada tutte le connessioni del sistema operativo a SOCKS, nonché le connessioni da tutti i dispositivi sulla stessa rete del laptop.
  2. Il laptop nel mio caso dovrebbe rimanere completamente mobile. Cioè, per dare la possibilità di utilizzare l'ambiente desktop e non essere vincolati ad una posizione fisica.
  3. L'ultimo punto implica la connessione e il routing solo tramite l'interfaccia wireless integrata.
  4. Bene, e, naturalmente, la creazione di una guida completa, nonché un'analisi delle tecnologie pertinenti al meglio delle mie modeste conoscenze.

Cosa verrà trattato in questo articolo:

  1. git - scarica i repository di progetto tun2socksnecessario per instradare il traffico TCP a SOCKS e crea_ap — uno script per automatizzare la configurazione di un punto di accesso virtuale utilizzando hostapd.
  2. tun2socks — crea e installa il servizio systemd sul sistema.
  3. systemd-networkd — configurare interfacce wireless e virtuali, tabelle di routing statiche e reindirizzamento dei pacchetti.
  4. crea_ap — installa il servizio systemd sul sistema, configura e avvia un punto di accesso virtuale.

Passaggi facoltativi:

  • ntp — installare e configurare un server per sincronizzare l'ora sui client del punto di accesso virtuale.
  • dnscrypt-proxy — crittograferemo le richieste DNS, le instraderemo a SOCKS e disabiliteremo i domini pubblicitari per la rete locale.

Perché tutto questo?

Questo è uno dei modi per proteggere le connessioni TCP su una rete locale. Il vantaggio principale è che tutte le connessioni vengono effettuate in SOCKS, a meno che non venga creata una route statica attraverso il gateway originale. Ciò significa che non è necessario specificare le impostazioni del server SOCKS per singoli programmi o client sulla rete locale: vanno tutti su SOCKS per impostazione predefinita, poiché è il gateway predefinito finché non indichiamo diversamente.

Essenzialmente aggiungiamo un secondo router di crittografia come laptop davanti al router originale e utilizziamo la connessione Internet del router originale per le richieste SOCKS già crittografate del laptop, che a sua volta instrada e crittografa le richieste dai client LAN.

Dal punto di vista del provider siamo costantemente connessi ad un server con traffico crittografato.

Di conseguenza, tutti i dispositivi sono collegati al punto di accesso virtuale del laptop.

Installa tun2socks sul sistema

Finché la tua macchina ha Internet, scarica tutti gli strumenti necessari.

apt update
apt install git make cmake

Scarica il pacchetto badvpn

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

Apparirà una cartella sul tuo sistema badvpn. Crea una cartella separata per il build

mkdir badvpn-build

Vai ad esso

cd badvpn-build

Raccogliere tun2socks

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

Installare sul sistema

make install
  • Parametro -DBUILD_NOTHING_BY_DEFAULT=1 disabilita la compilazione di tutti i componenti del repository badvpn.
  • -DBUILD_TUN2SOCKS=1 include un componente nell'assieme tun2socks.
  • make install — installerà il binario tun2socks sul tuo sistema all'indirizzo /usr/local/bin/badvpn-tun2socks.

Installa il servizio tun2socks in systemd

Crea un file /etc/systemd/system/tun2socks.service con il seguente contenuto:

[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 - prende il nome dell'interfaccia virtuale che inizializziamo con systemd-networkd.
  • --netif-ipaddr — l'indirizzo di rete del “router” tun2socks a cui è connessa l'interfaccia virtuale. È meglio renderlo separato sottorete riservata.
  • --socks-server-addr - accetta presa (адрес:порт server SOCKS).

Se il tuo server SOCKS richiede l'autenticazione, puoi specificare i parametri --username и --password.

Successivamente, registra il servizio

systemctl daemon-reload

E accendilo

systemctl enable tun2socks

Prima di avviare il servizio, gli forniremo un'interfaccia di rete virtuale.

Passaggio a systemd-networkd

Includiamo systemd-networkd:

systemctl enable systemd-networkd

Disabilita i servizi di rete correnti.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-aspetta-online è un servizio che attende una connessione di rete funzionante prima che systemd continui ad avviare altri servizi che dipendono dalla presenza di una rete. Lo disabiliteremo mentre passiamo all'analogo systemd-networkd.

Abilitiamolo subito:

systemctl enable systemd-networkd-wait-online

Configurare l'interfaccia di rete wireless

Crea un file di configurazione systemd-networkd per l'interfaccia di rete wireless /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Nome è il nome dell'interfaccia wireless. Identificatelo con il comando ip a.
  • IPForward - una direttiva che abilita il reindirizzamento dei pacchetti su un'interfaccia di rete.
  • Indirizzo è responsabile dell'assegnazione di un indirizzo IP all'interfaccia wireless. Lo specifichiamo staticamente perché con la direttiva equivalente DHCP=yes, systemd-networkd crea un gateway predefinito sul sistema. Quindi tutto il traffico passerà attraverso il gateway originale e non attraverso la futura interfaccia virtuale su una sottorete diversa. Puoi controllare il gateway predefinito corrente con il comando ip r

Crea un percorso statico per il server SOCKS remoto

Se il tuo server SOCKS non è locale, ma remoto, devi creare un percorso statico per esso. Per fare ciò, aggiungi una sezione Route alla fine del file di configurazione dell'interfaccia wireless creato con il seguente contenuto:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — questo è il gateway predefinito o l'indirizzo del punto di accesso originale.
  • Destination — Indirizzo del server SOCKS.

Configura wpa_supplicant per systemd-networkd

systemd-networkd utilizza wpa_supplicant per connettersi a un punto di accesso sicuro. Quando si tenta di "alzare" l'interfaccia wireless, systemd-networkd avvia il servizio wpa_supplicant@имяDove nome è il nome dell'interfaccia wireless. Se non hai utilizzato systemd-networkd prima di questo punto, probabilmente questo servizio non è presente nel tuo sistema.

Quindi crealo con il comando:

systemctl enable wpa_supplicant@wlp6s0

ero solito wlp6s0 come nome della sua interfaccia wireless. Il tuo nome potrebbe essere diverso. Puoi riconoscerlo con il comando ip l.

Ora il servizio creato wpa_supplicant@wlp6s0 verrà avviato quando l'interfaccia wireless viene “sollevata”, tuttavia, cercherà a sua volta le impostazioni SSID e password del punto di accesso nel file /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Pertanto, è necessario crearlo utilizzando l'utilità wpa_passphrase.

Per fare ciò, esegui il comando:

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

dove SSID è il nome del punto di accesso, password è la password e wlp6s0 — il nome dell'interfaccia wireless.

Inizializza l'interfaccia virtuale per tun2socks

Creare un file per inizializzare una nuova interfaccia virtuale nel sistema/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Nome è il nome che systemd-networkd assegnerà alla futura interfaccia virtuale quando verrà inizializzata.
  • Genere è un tipo di interfaccia virtuale. Dal nome del servizio tun2socks, puoi intuire che utilizza un'interfaccia simile tun.
  • netdev è l'estensione dei file that systemd-networkd Utilizza per inizializzare le interfacce di rete virtuale. L'indirizzo e altre impostazioni di rete per queste interfacce sono specificati in .Rete-File.

Crea un file come questo /etc/systemd/network/25-tun2socks.network con il seguente contenuto:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name - il nome dell'interfaccia virtuale che hai specificato netdev-file.
  • Address — Indirizzo IP che verrà assegnato all'interfaccia virtuale. Deve trovarsi sulla stessa rete dell'indirizzo specificato nel servizio tun2socks
  • Gateway — Indirizzo IP del “router” tun2socks, che hai specificato durante la creazione del servizio systemd.

Quindi l'interfaccia tun2socks ha un indirizzo 172.16.1.2e il servizio tun2socks - 172.16.1.1, ovvero è il gateway per tutte le connessioni dall'interfaccia virtuale.

Configura un punto di accesso virtuale

Installa le dipendenze:

apt install util-linux procps hostapd iw haveged

Scarica l'archivio crea_ap alla tua macchina:

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

Vai alla cartella del repository sul tuo computer:

cd create_ap

Installa sul sistema:

make install

Apparirà una configurazione sul tuo sistema /etc/create_ap.conf. Ecco le principali opzioni di modifica:

  • GATEWAY=10.0.0.1 — è meglio renderlo una sottorete riservata separata.
  • NO_DNS=1 - disabilitare, poiché questo parametro sarà gestito dall'interfaccia virtuale systemd-networkd.
  • NO_DNSMASQ=1 - spegnerlo per lo stesso motivo.
  • WIFI_IFACE=wlp6s0 — interfaccia wireless per laptop.
  • INTERNET_IFACE=tun2socks - un'interfaccia virtuale creata per tun2socks.
  • SSID=hostapd — nome del punto di accesso virtuale.
  • PASSPHRASE=12345678 - parola d'ordine.

Non dimenticare di abilitare il servizio:

systemctl enable create_ap

Abilita il server DHCP in systemd-networkd

ufficio create_ap inizializza un'interfaccia virtuale nel sistema ap0. In teoria, dnsmasq si blocca su questa interfaccia, ma perché installare servizi aggiuntivi se systemd-networkd contiene un server DHCP integrato?

Per abilitarlo, definiremo le impostazioni di rete per il punto virtuale. Per fare ciò, crea un file /etc/systemd/network/25-ap0.network con il seguente contenuto:

[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

Dopo che il servizio create_ap inizializza l'interfaccia virtuale ap0, systemd-networkd gli assegnerà automaticamente un indirizzo IP e abiliterà il server DHCP.

stringhe EmitDNS=yes и DNS=10.0.0.1 trasmettere le impostazioni del server DNS ai dispositivi collegati al punto di accesso.

Se non prevedi di utilizzare un server DNS locale, nel mio caso è dnscrypt-proxy, puoi installarlo DNS=10.0.0.1 в DNS=192.168.1.1Dove 192.168.1.1 — l'indirizzo del gateway originale. Quindi le richieste DNS per il tuo host e la rete locale verranno non crittografate attraverso i server del provider.

EmitNTP=yes и NTP=192.168.1.1 trasferire le impostazioni NTP.

Lo stesso vale per la linea NTP=10.0.0.1.

Installa e configura il server NTP

Installa sul sistema:

apt install ntp

Modifica la configurazione /etc/ntp.conf. Commentare gli indirizzi dei pool 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

Aggiungi indirizzi di server pubblici, ad esempio Google Public NTP:

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

Fornisci l'accesso al server ai client sulla tua rete:

restrict 10.0.0.0 mask 255.255.255.0

Abilita la trasmissione sulla tua rete:

broadcast 10.0.0.255

Infine, aggiungi gli indirizzi di questi server alla tabella di routing statica. Per fare ciò, aprire il file di configurazione dell'interfaccia wireless /etc/systemd/network/25-wlp6s0.network e aggiungi alla fine della sezione 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

Puoi scoprire gli indirizzi dei tuoi server NTP utilizzando l'utilità host следующим обрахом:

host time1.google.com

Installa dnscrypt-proxy, rimuovi gli annunci pubblicitari e nascondi il traffico DNS dal tuo provider

apt install dnscrypt-proxy

Per servire le query DNS dell'host e della rete locale, modificare il socket /lib/systemd/system/dnscrypt-proxy.socket. Modificare le seguenti righe:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

ерезапустите systemd:

systemctl daemon-reload

Modifica la configurazione /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Per instradare le connessioni proxy dnscrypt tramite tun2socks, aggiungere di seguito:

force_tcp = true

Modifica la configurazione /etc/resolv.conf, che comunica al server DNS l'host.

nameserver 127.0.0.1
nameserver 192.168.1.1

La prima riga abilita l'uso di dnscrypt-proxy, la seconda riga utilizza il gateway originale nel caso in cui il server dnscrypt-proxy non sia disponibile.

Fatto!

Riavvia o interrompi l'esecuzione dei servizi di rete:

systemctl stop networking NetworkManager NetworkManager-wait-online

E riavvia tutto il necessario:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Dopo un riavvio o un riavvio, avrai un secondo punto di accesso che instrada l'host e i dispositivi LAN a SOCKS.

Questo è l'aspetto dell'output ip a portatile normale:

1: lo: <LOOPBACK,UP,LOWER_UP> 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: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> 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: <NO-CARRIER,BROADCAST,MULTICAST,UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

Come risultato,

  1. Il provider vede solo la connessione crittografata al tuo server SOCKS, il che significa che non vede nulla.
  2. Eppure vede le tue richieste NTP, per evitarlo, rimuovi i percorsi statici per i server NTP. Tuttavia, non è sicuro che il tuo server SOCKS consenta il protocollo NTP.

Stampella avvistata su Debain 10

Se provi a riavviare il servizio di rete dalla console, l'operazione fallirà e verrà visualizzato un errore. Ciò è dovuto al fatto che una parte di essa sotto forma di interfaccia virtuale è legata al servizio tun2socks e quindi viene utilizzata. Per riavviare il servizio di rete, è necessario prima arrestare il servizio tun2socks. Ma penso che se leggi fino alla fine, questo non sarà sicuramente un problema per te!

riferimenti

  1. Routing statico su Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: questo script crea un punto di accesso WiFi NATed o Bridged.
  5. dnscrypt-proxy 2 — Un proxy DNS flessibile, con supporto per protocolli DNS crittografati.

Fonte: habr.com