Een router bouwen in SOCKS op een laptop met Debian 10

Een heel jaar (of twee) heb ik het publiceren van dit artikel uitgesteld om één belangrijke reden — ik had al twee artikelen gepubliceerd waarin ik het proces beschreef om een router in SOCKS te maken van een gewone laptop met Debian.

Echter, sindsdien is de stabiele versie van Debian bijgewerkt naar Buster, en verschillende mensen hebben me persoonlijk benaderd met het verzoek om te helpen met de configuratie, wat betekent dat mijn eerdere artikelen niet voldoende zijn. Ik vermoedde al dat de methoden die ik in hen beschreef niet alle nuances van het configureren van Linux voor SOCKS-routing volledig behandelen. Bovendien zijn ze geschreven voor Debian Stretch, en na de update naar Buster, op het systeem met systemd, merkte ik enkele kleine veranderingen in de interactie tussen de diensten. En in de artikelen zelf heb ik systemd-networkd niet gebruikt, hoewel dit het beste past bij complexe netwerkconfiguraties.

Naast de eerder genoemde veranderingen, heb ik de volgende diensten aan mijn configuratie toegevoegd: hostapd — een dienst voor het virtualiseren van een toegangspunt, ntp voor het synchroniseren van de tijd van clients in het lokale netwerk, dnscrypt-proxy voor het versleutelen van verbindingen via DNS en het blokkeren van advertenties voor clients in het lokale netwerk, en zoals ik eerder al noemde, systemd-networkd voor de configuratie van netwerkinterfaces.

Hier is een eenvoudige stroomdiagram van de interne structuur van zo'n router.

Een router bouwen in SOCKS op een laptop met Debian 10

Ik herinner me nog even de doelstellingen van deze reeks artikelen:

  1. Router al het verkeer van het besturingssysteem naar SOCKS, evenals het verkeer van alle apparaten in hetzelfde netwerk als de laptop.
  2. De laptop moet in mijn geval volledig mobiel blijven. Dat wil zeggen, in staat zijn om een werkplekomgeving te gebruiken en niet gebonden te zijn aan een fysieke locatie.
  3. Laatste punt houdt in dat het alleen mogelijk is om verbinding te maken en te routeren via de ingebouwde draadloze interface.
  4. En natuurlijk, het creëren van een uitgebreid handboek, evenals het analyseren van de juiste technologieën in de mate van mijn bescheiden kennis.

Wat zal in dit artikel worden behandeld:

  1. git — we downloaden de repositories van de projecten tun2socks, welke nodig zijn voor het routeren van TCP-verkeer in SOCKS, en create_ap — een script voor het automatiseren van de configuratie van een virtueel toegangspunt met behulp van hostapd.
  2. tun2socks — we bouwen en installeren de systemd-dienst in het systeem.
  3. systemd-networkd — we configureren draadloze en virtuele interfaces, statische routeringstabellen en pakketdoorsturen.
  4. create_ap — we installeren de systemd service in het systeem, configureren en starten het virtuele toegangspunt.

Optionele stappen:

  • ntp — we installeren en configureren een server voor tijdssynchronisatie op de clients van het virtuele toegangspunt.
  • dnscrypt-proxy — we versleutelen DNS-verzoeken, routeren ze via SOCKS en schakelen reclame-domeinen voor het lokale netwerk uit.

Waarom dit alles?

Dit is een van de manieren om TCP-verbindingen van een lokaal netwerk te beveiligen. Het grootste voordeel is dat alle verbindingen via SOCKS lopen, tenzij er een statische route naar de originele gateway is ingesteld. Dit betekent dat je geen SOCKS-serverinstellingen hoeft op te geven voor afzonderlijke programma's of clients in het lokale netwerk — ze gaan standaard naar SOCKS, aangezien het de standaard gateway is, totdat we het tegendeel aangeven.

In feite voegen we een tweede versleutelde router toe in de vorm van een laptop voor de originele router en gebruiken we de internetverbinding van de originele router voor de al versleutelde SOCKS-verzoeken van de laptop, die op zijn beurt de verzoeken van de clients in het lokale netwerk routeret en versleutelt.

Vanuit het perspectief van de provider zijn we constant verbonden met één server met versleuteld verkeer.

Dientengevolge zijn alle apparaten verbonden met het virtuele toegangspunt van de laptop.

Installeer tun2socks in het systeem

Zolang je machine internet heeft, download je alle benodigde tools.

apt update
apt install git make cmake

Download het badvpn-pakket

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

Er verschijnt een map in jouw systeem badvpn. Maak een aparte map voor de build

mkdir badvpn-build

Ga erheen

cd badvpn-build

Bouw het tun2socks

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

Installeer in het systeem

make install
  • Parameter -DBUILD_NOTHING_BY_DEFAULT=1 schakelt de bouw van alle componenten van de badvpn-repository uit.
  • —DBUILD_TUN2SOCKS=1 voegt de component toe aan de build tun2socks.
  • make install — installeert het binaire bestand tun2socks in jouw systeem op het adres /usr/local/bin/badvpn-tun2socks.

Installeer de tun2socks service in systemd

Maak een bestand aan /etc/systemd/system/tun2socks.service met de volgende inhoud:

[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 — accepteert de naam van de virtuele interface die we initialiseren met systemd-networkd.
  • --netif-ipaddr — netwerkadres van de «router» tun2socks, waaraan de virtuele interface wordt gekoppeld. Het is beter om een aparte gereserveerd subnet.
  • --socks-server-addr — neemt een socket aan (adres:poort van de SOCKS-server).

Als uw SOCKS-server authenticatie vereist, kunt u de parameters opgeven --username en --password.

Registreer vervolgens de dienst

systemctl daemon-reload

En activeer

systemctl enable tun2socks

Voordat we de dienst starten, zorgen we ervoor dat deze een virtuele netwerkinterface heeft.

Ga naar systemd-networkd

Activeer systemd-networkd:

systemctl enable systemd-networkd

Schakel de huidige netwerkdiensten uit.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-wait-online — dit is een dienst die wacht op een actieve netwerkverbinding voordat systemd andere diensten start die afhankelijk zijn van het netwerk. We schakelen deze uit, omdat we zullen overschakelen naar de equivalent van systemd-networkd.

Laten we deze meteen inschakelen:

systemctl enable systemd-networkd-wait-online

Configureer de draadloze netwerkinterface

Maak een configuratiebestand voor systemd-networkd voor de draadloze netwerkinterface /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Naam — dit is de naam van uw draadloze interface. Identificeer deze met het commando ip a.
  • IPForward — is een richtlijn die het doorsturen van pakketten op de netwerkinterface inschakelt.
  • Address verantwoordelijk voor het toewijzen van een IP-adres aan de draadloze interface. We geven dit statisch op omdat bij een gelijkwaardige richtlijn DHCP=yes, systemd-networkd creëert een standaard gateway in het systeem. Dan gaat al het verkeer via de oorspronkelijke gateway en niet via de toekomstige virtuele interface in een ander subnet. U kunt de huidige standaard gateway controleren met het commando ip r

Maak een statische route voor de externe SOCKS-server

Als uw SOCKS-server niet lokaal is, maar extern, moet u een statische route voor deze maken. Voeg hiertoe een sectie toe Route aan het einde van het door u gemaakte configuratiebestand voor de draadloze interface met de volgende inhoud:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — dit is de standaard gateway of het adres van uw oorspronkelijke toegangspunt.
  • Destination — adres van de SOCKS-server.

Configureer wpa_supplicant voor systemd-networkd

systemd-networkd gebruikt wpa_supplicant om verbinding te maken met een beveiligd toegangspunt. Bij het 'opstarten' van de draadloze interface start systemd-networkd de dienst wpa_supplicant@naam, waar naam — is de naam van de draadloze interface. Als je systemd-networkd tot nu toe niet hebt gebruikt, dan is deze service waarschijnlijk niet op jouw systeem aanwezig.

Maak het daarom aan met het commando:

systemctl enable wpa_supplicant@wlp6s0

Ik heb gebruikt wlp6s0 als de naam van mijn draadloze interface. Deze naam kan bij jou anders zijn. Je kunt het te weten komen met het commando ip l.

Nu wordt de aangemaakte service wpa_supplicant@wlp6s0 gestart wanneer de draadloze interface wordt 'opgestart', maar deze zal op zijn beurt de instellingen voor SSID en wachtwoord van het toegangspunt zoeken in het bestand /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Daarom moet je het aanmaken met behulp van de tool wpa_passphrase.

Voer hiervoor het commando uit:

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

waar SSID is de naam van jouw toegangspunt, password is het wachtwoord, en wlp6s0 is de naam van jouw draadloze interface.

Initialiseer de virtuele interface voor tun2socks

Maak een bestand aan voor het initialiseren van de nieuwe virtuele interface in het systeem/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Naam is de naam die systemd-networkd zal toekennen aan de toekomstige virtuele interface bij zijn initialisatie.
  • Kind is het type van de virtuele interface. Gezien de naam van de service tun2socks, kun je raden dat het een interface van het type tun.
  • netdev is de extensie van de bestanden die systemd-networkd worden gebruikt voor het initialiseren van virtuele netwerkinterfaces. Adres en andere netwerkinstellingen voor deze interfaces worden aangegeven in .network-bestanden.

Maak zo'n bestand aan /etc/systemd/network/25-tun2socks.network met de volgende inhoud:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Naam is de naam van de virtuele interface die je hebt opgegeven in netdev-bestand.
  • Address is het IP-adres dat aan de virtuele interface zal worden toegewezen. Dit moet in hetzelfde netwerk liggen als het adres dat je hebt opgegeven in de tun2socks-service
  • Gateway is het IP-adres van de 'router' tun2socks, dat je hebt opgegeven bij het aanmaken van de systemd-service.

Zo heeft de interface tun2socks het adres 172.16.1.2, en de service tun2socks — 172.16.1.1, dat wil zeggen dat het een gateway is voor alle verbindingen van de virtuele interface.

Configureer de virtuele toegangspunt

Installeer de afhankelijkheden:

apt install util-linux procps hostapd iw haveged

Download de repository create_ap op jouw machine:

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

Ga naar de map van de repository op jouw machine:

cd create_ap

Installeer het in het systeem:

make install

Er verschijnt een configuratie in jouw systeem /etc/create_ap.conf. Hier zijn de belangrijkste opties om te bewerken:

  • GATEWAY=10.0.0.1 is beter om een aparte gereserveerde subnetwork te maken.
  • NO_DNS=1 schakel deze uit, aangezien deze parameter zal worden beheerd door de virtuele interface systemd-networkd.
  • NO_DNSMASQ=1 — uitschakelen om dezelfde reden.
  • WIFI_IFACE=wlp6s0 — draadloze interface van de laptop.
  • INTERNET_IFACE=tun2socks — virtuele interface, gemaakt voor tun2socks.
  • SSID=hostapd — naam van het virtuele toegangspunt.
  • PASSPHRASE=12345678 — wachtwoord.

Vergeet niet de dienst in te schakelen:

systemctl enable create_ap

Schakel de DHCP-server in in systemd-networkd

De dienst create_ap initialiseert het virtuele interface in het systeem ap0. In principe hangt dnsmasq aan deze interface, maar waarom extra diensten installeren als systemd-networkd een ingebouwde DHCP-server heeft?

Om deze in te schakelen, definiëren we de netwerkconfiguratie voor het virtuele toegangspunt. Maak hiervoor een bestand aan /etc/systemd/network/25-ap0.network met de volgende inhoud:

[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

Nadat de dienst create_ap het virtuele interface heeft geïnitialiseerd ap0, zal systemd-networkd automatisch een IP-adres toewijzen en de DHCP-server inschakelen.

De regels EmitDNS=yes en DNS=10.0.0.1 sturen de DNS-serverinstellingen naar de apparaten die verbonden zijn met het toegangspunt.

Als je geen lokale DNS-server wilt gebruiken — in mijn geval is dat dnscrypt-proxy — kun je DNS=10.0.0.1 in DNS=192.168.1.1, waar 192.168.1.1 — het adres van je originele gateway. Dan zullen de DNS-verzoeken van je host en lokale netwerk onbeveiligd via de servers van de provider gaan.

EmitNTP=yes en NTP=192.168.1.1 sturen de NTP-instellingen.

Hetzelfde geldt voor de regel NTP=10.0.0.1.

Installeer en configureer de NTP-server

Installeer het in het systeem:

apt install ntp

Pas de configuratie aan. /etc/ntp.confBecommentarieer de adressen van de standaard pools:

#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

Voeg adressen van publieke servers toe, zoals Google Public NTP:

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

Geef toegang tot de server voor de clients in je netwerk:

restrict 10.0.0.0 mask 255.255.255.0

Schakel broadcasting naar je netwerk in:

broadcast 10.0.0.255

Voeg tenslotte de adressen van deze servers toe aan de statische routeringstabel. Open hiervoor het configuratiebestand van de draadloze interface /etc/systemd/network/25-wlp6s0.network en voeg aan het einde van de sectie toe 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

Je kunt de adressen van je NTP-servers achterhalen met de tool host het als volgt:

host time1.google.com

Installeer dnscrypt-proxy, verwijder advertenties en verberg DNS-verkeer voor de provider

apt install dnscrypt-proxy

Om DNS-verzoeken van de host en het lokale netwerk te bedienen, pas de socket aan. /lib/systemd/system/dnscrypt-proxy.socketVerander de volgende regels:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Herstart systemd:

systemctl daemon-reload

Pas de configuratie aan. /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Om dnscrypt-proxy via tun2socks te leiden, voeg je het volgende toe:

force_tcp = true

Pas de configuratie aan. /etc/resolv.conf, wat de DNS-server aan de host meldt.

nameserver 127.0.0.1
nameserver 192.168.1.1

De eerste regel schakelt het gebruik van dnscrypt-proxy in, de tweede gebruikt de originele gateway, voor het geval de dnscrypt-proxy server niet beschikbaar is.

Klaar!

Herstart of stop actieve netwerkservices:

systemctl stop networking NetworkManager NetworkManager-wait-online

En herstart alle benodigde:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Na herstart of opnieuw opstarten krijg je een tweede toegangspunt dat de host en lokale netwerkapparaten via SOCKS routeert.

Zo ziet de uitvoer eruit ip a van een gewone laptop:

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

Uiteindelijk

  1. De provider ziet alleen een versleutelde verbinding met je SOCKS-server, wat betekent dat ze niets zien.
  2. En toch zien ze je NTP-verzoeken, om dit te voorkomen, verwijder je de statische routes voor NTP-servers. Echter, het is niet zeker dat je SOCKS-server het NTP-protocol toestaat.

Een workaround, opgemerkt op Debian 10

Als je probeert de netwerksdienst vanuit de console opnieuw op te starten, crasht deze met een foutmelding. Dit komt omdat een deel daarvan als virtuele interface is gebonden aan de tun2socks-service, wat betekent dat het in gebruik is. Om de netwerksdienst opnieuw te starten, moet je eerst de tun2socks-dienst stoppen. Maar ik denk dat als je tot hier gekomen bent, dit voor jou zeker geen probleem is!

Links

  1. Statische routering in Linux — IBM
  2. systemd-networkd.service — Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Dit script creëert een NATed of Bridged WiFi-toegangspunt.
  5. dnscrypt-proxy 2 — Een flexibele DNS-proxy, met ondersteuning voor versleutelde DNS-protocollen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster