Bygga en router i SOCKS på en bärbar dator med Debian 10

Under ett helt år (eller två) sköt jag upp att publicera den här artikeln av huvudorsaken - jag hade redan publicerat två artiklar där jag beskrev processen att skapa en router i SOCKS från en mycket vanlig bärbar dator med Debian.

Men sedan dess har den stabila versionen av Debian uppdaterats till Buster, ett tillräckligt antal personer har kontaktat mig privat och bett om hjälp med installationen, vilket betyder att mina tidigare artiklar inte är uttömmande. Tja, jag gissade själv att metoderna som beskrivs i dem inte helt avslöjar alla krångligheterna med att ställa in Linux för routing i SOCKS. Dessutom är de skrivna för Debian Stretch, och efter att ha uppgraderat till Buster, i systemd init-systemet, märkte jag små förändringar i interaktionen mellan tjänster. Och i själva artiklarna använde jag inte systemd-networkd, även om det är bäst lämpat för komplexa nätverkskonfigurationer.

Utöver ovanstående ändringar har följande tjänster lagts till i min konfiguration: hostapd - tjänst för åtkomstpunktvirtualisering, nTP för att synkronisera tiden för lokala nätverksklienter, dnscrypt-proxy att kryptera anslutningar via DNS och inaktivera annonsering på lokala nätverksklienter, och även, som jag nämnde tidigare, systemd-nätverk för att konfigurera nätverksgränssnitt.

Här är ett enkelt blockschema över den interna strukturen hos en sådan router.

Bygga en router i SOCKS på en bärbar dator med Debian 10

Så låt mig påminna dig om vad målen med den här artikelserien är:

  1. Dirigera alla OS-anslutningar till SOCKS, såväl som anslutningar från alla enheter på samma nätverk som den bärbara datorn.
  2. Den bärbara datorn i mitt fall bör förbli helt mobil. Det vill säga att ge möjlighet att använda skrivbordsmiljön och inte vara bunden till en fysisk plats.
  3. Den sista punkten innebär anslutning och routing endast genom det inbyggda trådlösa gränssnittet.
  4. Tja, och naturligtvis, skapandet av en omfattande guide, samt en analys av relevanta teknologier efter min blygsamma kunskap.

Vad kommer att behandlas i den här artikeln:

  1. — ladda ner projektarkiv tun2sockarkrävs för att dirigera TCP-trafik till SOCKS, och skapa_ap — ett skript för att automatisera installationen av en virtuell åtkomstpunkt med hjälp av hostapd.
  2. tun2sockar — bygga och installera systemd-tjänsten på systemet.
  3. systemd-nätverk — Konfigurera trådlösa och virtuella gränssnitt, statiska routingtabeller och paketomdirigering.
  4. skapa_ap — installera systemd-tjänsten på systemet, konfigurera och starta en virtuell åtkomstpunkt.

Valfria steg:

  • nTP — installera och konfigurera en server för att synkronisera tid på virtuella åtkomstpunktklienter.
  • dnscrypt-proxy — vi kommer att kryptera DNS-förfrågningar, dirigera dem till SOCKS och inaktivera reklamdomäner för det lokala nätverket.

Varför allt detta?

Detta är ett av sätten att säkra TCP-anslutningar på ett lokalt nätverk. Den största fördelen är att alla anslutningar görs i SOCKS, om inte en statisk rutt byggs för dem genom den ursprungliga gatewayen. Det betyder att du inte behöver ange SOCKS-serverinställningar för varken enskilda program eller klienter på det lokala nätverket - de går alla till SOCKS som standard, eftersom det är standardgatewayen tills vi anger något annat.

I huvudsak lägger vi till en andra krypterande router som en bärbar dator framför den ursprungliga routern och använder den ursprungliga routerns Internetanslutning för den bärbara datorns redan krypterade SOCKS-förfrågningar, som i sin tur dirigerar och krypterar förfrågningar från LAN-klienter.

Ur leverantörens synvinkel är vi ständigt anslutna till en server med krypterad trafik.

Följaktligen är alla enheter anslutna till den bärbara datorns virtuella åtkomstpunkt.

Installera tun2socks på systemet

Så länge din maskin har internet, ladda ner alla nödvändiga verktyg.

apt update
apt install git make cmake

Ladda ner badvpn-paketet

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

En mapp kommer att visas på ditt system badvpn. Skapa en separat mapp för bygget

mkdir badvpn-build

Gå till det

cd badvpn-build

Samla tun2socks

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

Installera på systemet

make install
  • Parameter -DBUILD_NOTHING_BY_DEFAULT=1 inaktiverar byggandet av alla komponenter i badvpn-förvaret.
  • -DBUILD_TUN2SOCKS=1 innehåller en komponent i monteringen tun2sockar.
  • make install — kommer att installera tun2socks binär på ditt system på /usr/local/bin/badvpn-tun2socks.

Installera tun2socks-tjänsten i systemd

Skapa en fil /etc/systemd/system/tun2socks.service med följande innehåll:

[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 - tar namnet på det virtuella gränssnittet som vi initierar med systemd-networkd.
  • --netif-ipaddr — nätverksadressen för tun2socks "router" till vilken det virtuella gränssnittet är anslutet. Det är bättre att göra det separat reserverat subnät.
  • --socks-server-addr - accepterar uttag (адрес:порт SOCKS-servrar).

Om din SOCKS-server kräver autentisering kan du ange parametrarna --username и --password.

Registrera sedan tjänsten

systemctl daemon-reload

Och slå på den

systemctl enable tun2socks

Innan vi startar tjänsten kommer vi att förse den med ett virtuellt nätverksgränssnitt.

Byter till systemd-networkd

Sätta på systemd-networkd:

systemctl enable systemd-networkd

Inaktivera nuvarande nätverkstjänster.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-vänta-online är en tjänst som väntar på en fungerande nätverksanslutning innan systemd fortsätter att starta andra tjänster som är beroende av närvaron av ett nätverk. Vi inaktiverar det när vi byter till systemd-networkd-analogen.

Låt oss aktivera det direkt:

systemctl enable systemd-networkd-wait-online

Konfigurera det trådlösa nätverksgränssnittet

Skapa en systemd-networkd-konfigurationsfil för det trådlösa nätverksgränssnittet /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Namn är namnet på ditt trådlösa gränssnitt. Identifiera det med kommandot ip a.
  • IPForward - ett direktiv som möjliggör omdirigering av paket på ett nätverksgränssnitt.
  • Adress ansvarar för att tilldela en IP-adress till det trådlösa gränssnittet. Vi specificerar det statiskt eftersom med motsvarande direktiv DHCP=yes, systemd-networkd skapar en standardgateway på systemet. Då kommer all trafik att gå genom den ursprungliga gatewayen, och inte genom det framtida virtuella gränssnittet på ett annat subnät. Du kan kontrollera den aktuella standardgatewayen med kommandot ip r

Skapa en statisk rutt för fjärrservern SOCKS

Om din SOCKS-server inte är lokal, utan fjärransluten, måste du skapa en statisk rutt för den. För att göra detta, lägg till ett avsnitt Route till slutet av konfigurationsfilen för trådlöst gränssnitt som du skapade med följande innehåll:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — detta är standardgatewayen eller adressen till din ursprungliga åtkomstpunkt.
  • Destination — SOCKS-serveradress.

Konfigurera wpa_supplicant för systemd-networkd

systemd-networkd använder wpa_supplicant för att ansluta till en säker åtkomstpunkt. När man försöker "höja" det trådlösa gränssnittet startar systemd-networkd tjänsten wpa_supplicant@имяvar Namn är namnet på det trådlösa gränssnittet. Om du inte har använt systemd-networkd tidigare, så saknas förmodligen denna tjänst på ditt system.

Så skapa det med kommandot:

systemctl enable wpa_supplicant@wlp6s0

jag använde wlp6s0 som namnet på dess trådlösa gränssnitt. Ditt namn kan vara annorlunda. Du kan känna igen det med kommandot ip l.

Nu skapas tjänsten wpa_supplicant@wlp6s0 kommer att startas när det trådlösa gränssnittet är "höjt", men det kommer i sin tur att leta efter SSID och lösenordsinställningarna för åtkomstpunkten i filen /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Därför måste du skapa den med hjälp av verktyget wpa_passphrase.

För att göra detta, kör kommandot:

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

där SSID är namnet på din åtkomstpunkt, lösenord är lösenordet och wlp6s0 — namnet på ditt trådlösa gränssnitt.

Initiera det virtuella gränssnittet för tun2socks

Skapa en fil för att initiera ett nytt virtuellt gränssnitt i systemet/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Namn är namnet som systemd-networkd kommer att tilldela det framtida virtuella gränssnittet när det initieras.
  • Snäll är en typ av virtuellt gränssnitt. Från namnet på tun2socks-tjänsten kan du gissa att den använder ett gränssnitt som tun.
  • netdev är filtillägget som systemd-networkd Används för att initiera virtuella nätverksgränssnitt. Adressen och andra nätverksinställningar för dessa gränssnitt anges i .nätverk-filer.

Skapa en fil som denna /etc/systemd/network/25-tun2socks.network med följande innehåll:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name — namnet på det virtuella gränssnittet som du angav i netdev-fil.
  • Address — IP-adress som kommer att tilldelas det virtuella gränssnittet. Måste vara på samma nätverk som adressen du angav i tun2socks-tjänsten
  • Gateway — IP-adress för "routern" tun2sockar, som du angav när du skapade systemd-tjänsten.

Alltså gränssnittet tun2sockar har en adress 172.16.1.2, och tjänsten tun2sockar - 172.16.1.1, det vill säga det är gatewayen för alla anslutningar från det virtuella gränssnittet.

Konfigurera en virtuell åtkomstpunkt

Installationsberoenden:

apt install util-linux procps hostapd iw haveged

Ladda ner arkivet skapa_ap till din bil:

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

Gå till arkivmappen på din maskin:

cd create_ap

Installera på systemet:

make install

En konfiguration kommer att visas på ditt system /etc/create_ap.conf. Här är de viktigaste redigeringsalternativen:

  • GATEWAY=10.0.0.1 - det är bättre att göra det till ett separat reserverat undernät.
  • NO_DNS=1 - inaktivera, eftersom denna parameter kommer att hanteras av systemd-networkd virtuella gränssnittet.
  • NO_DNSMASQ=1 - stäng av den av samma anledning.
  • WIFI_IFACE=wlp6s0 — trådlöst gränssnitt för bärbar dator.
  • INTERNET_IFACE=tun2socks - ett virtuellt gränssnitt skapat för tun2socks.
  • SSID=hostapd — Namnet på den virtuella åtkomstpunkten.
  • PASSPHRASE=12345678 - Lösenord.

Glöm inte att aktivera tjänsten:

systemctl enable create_ap

Aktivera DHCP-server i systemd-networkd

office create_ap initierar ett virtuellt gränssnitt i systemet ap0. I teorin hänger dnsmasq på detta gränssnitt, men varför installera extra tjänster om systemd-networkd innehåller en inbyggd DHCP-server?

För att aktivera det kommer vi att definiera nätverksinställningarna för den virtuella punkten. För att göra detta, skapa en fil /etc/systemd/network/25-ap0.network med följande innehåll:

[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

Efter att create_ap-tjänsten initieras det virtuella gränssnittet ap0, kommer systemd-networkd automatiskt att tilldela den en IP-adress och aktivera DHCP-servern.

linjer EmitDNS=yes и DNS=10.0.0.1 överföra DNS-serverinställningar till enheter som är anslutna till åtkomstpunkten.

Om du inte planerar att använda en lokal DNS-server - i mitt fall är det dnscrypt-proxy - kan du installera DNS=10.0.0.1 в DNS=192.168.1.1var 192.168.1.1 — adressen till din ursprungliga gateway. Då kommer DNS-förfrågningar för din värd och ditt lokala nätverk att gå okrypterade via leverantörens servrar.

EmitNTP=yes и NTP=192.168.1.1 överför NTP-inställningar.

Detsamma gäller linjen NTP=10.0.0.1.

Installera och konfigurera NTP-servern

Installera på systemet:

apt install ntp

Redigera konfigurationen /etc/ntp.conf. Kommentera adresserna till standardpooler:

#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

Lägg till offentliga serveradresser, till exempel Google Public NTP:

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

Ge åtkomst till servern till klienter i ditt nätverk:

restrict 10.0.0.0 mask 255.255.255.0

Aktivera sändning till ditt nätverk:

broadcast 10.0.0.255

Lägg slutligen till adresserna för dessa servrar till den statiska routingtabellen. För att göra detta, öppna konfigurationsfilen för det trådlösa gränssnittet /etc/systemd/network/25-wlp6s0.network och lägg till i slutet av avsnittet 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

Du kan ta reda på adresserna till dina NTP-servrar med hjälp av verktyget host enligt följande:

host time1.google.com

Installera dnscrypt-proxy, ta bort annonser och dölj DNS-trafik från din leverantör

apt install dnscrypt-proxy

Redigera socket för att betjäna värd- och lokala nätverks-DNS-frågor /lib/systemd/system/dnscrypt-proxy.socket. Ändra följande rader:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Omstart systemd:

systemctl daemon-reload

Redigera konfigurationen /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

För att dirigera dnscrypt-proxy-anslutningar genom tun2socks, lägg till nedan:

force_tcp = true

Redigera konfigurationen /etc/resolv.conf, som talar om för DNS-servern till värden.

nameserver 127.0.0.1
nameserver 192.168.1.1

Den första raden möjliggör användning av dnscrypt-proxy, den andra raden använder den ursprungliga gatewayen om dnscrypt-proxyservern inte är tillgänglig.

Klart!

Starta om eller sluta köra nätverkstjänster:

systemctl stop networking NetworkManager NetworkManager-wait-online

Och starta om allt som behövs:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Efter en omstart eller omstart kommer du att ha en andra åtkomstpunkt som dirigerar värden och LAN-enheterna till SOCKS.

Så här ser utgången ut ip a vanlig bärbar dator:

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

Som ett resultat,

  1. Leverantören ser bara den krypterade anslutningen till din SOCKS-server, vilket betyder att de inte ser något.
  2. Och ändå ser den dina NTP-förfrågningar, för att förhindra detta, ta bort statiska rutter för NTP-servrar. Det är dock inte säkert att din SOCKS-server tillåter NTP-protokollet.

Krycka upptäckt på Debain 10

Om du försöker starta om nätverkstjänsten från konsolen kommer den att misslyckas med ett fel. Detta beror på att en del av det i form av ett virtuellt gränssnitt är knuten till tun2socks-tjänsten, vilket betyder att den används. För att starta om nätverkstjänsten måste du först stoppa tun2socks-tjänsten. Men jag tror att om du läser till slutet så är detta definitivt inget problem för dig!

referenser

  1. Statisk routing på Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Detta skript skapar en NATed eller Bridged WiFi Access Point.
  5. dnscrypt-proxy 2 — En flexibel DNS-proxy, med stöd för krypterade DNS-protokoll.

Källa: will.com