Aufbau eines Routers in SOCKS auf einem Laptop mit Debian 10

Ein ganzes Jahr (oder zwei) habe ich die Veröffentlichung dieses Artikels aus dem Hauptgrund verschoben: Ich hatte bereits zwei Artikel veröffentlicht, in denen ich den Prozess der Erstellung eines Routers in SOCKS von einem ganz gewöhnlichen Laptop mit Debian aus beschrieben habe.

Seitdem jedoch die stabile Version von Debian auf Buster aktualisiert wurde, haben mich ausreichend viele Leute privat kontaktiert und um Hilfe bei der Einrichtung gebeten, was bedeutet, dass meine vorherigen Artikel keinen Anspruch auf Vollständigkeit erheben. Nun, ich selbst habe vermutet, dass die darin beschriebenen Methoden nicht alle Feinheiten der Linux-Einrichtung für das Routing in SOCKS vollständig offenbaren. Darüber hinaus sind sie für Debian Stretch geschrieben, und nach dem Upgrade auf Buster sind mir im Systemd-Init-System kleine Änderungen im Zusammenspiel der Dienste aufgefallen. Und in den Artikeln selbst habe ich systemd-networkd nicht verwendet, obwohl es am besten für komplexe Netzwerkkonfigurationen geeignet ist.

Zusätzlich zu den oben genannten Änderungen wurden meiner Konfiguration folgende Dienste hinzugefügt: Hostapd - Dienst zur Access-Point-Virtualisierung, ntp um die Zeit lokaler Netzwerk-Clients zu synchronisieren, dnscrypt-proxy um Verbindungen über DNS zu verschlüsseln und Werbung auf lokalen Netzwerk-Clients zu deaktivieren, und außerdem, wie ich bereits erwähnt habe, systemd-netzwerkd zum Konfigurieren von Netzwerkschnittstellen.

Hier ist ein einfaches Blockdiagramm der internen Struktur eines solchen Routers.

Aufbau eines Routers in SOCKS auf einem Laptop mit Debian 10

Lassen Sie mich Sie daran erinnern, was die Ziele dieser Artikelserie sind:

  1. Leiten Sie alle Betriebssystemverbindungen sowie Verbindungen von allen Geräten im selben Netzwerk wie der Laptop an SOCKS weiter.
  2. Der Laptop sollte in meinem Fall völlig mobil bleiben. Das heißt, die Möglichkeit zu geben, die Desktop-Umgebung zu nutzen und nicht an einen physischen Standort gebunden zu sein.
  3. Der letzte Punkt impliziert die Verbindung und Weiterleitung nur über die integrierte drahtlose Schnittstelle.
  4. Nun, und natürlich die Erstellung eines umfassenden Leitfadens sowie eine Analyse der relevanten Technologien nach bestem Wissen und Gewissen.

Was wird in diesem Artikel behandelt:

  1. git — Laden Sie Projekt-Repositorys herunter tun2sockserforderlich, um TCP-Verkehr an SOCKS weiterzuleiten, und create_ap — ein Skript zur Automatisierung der Einrichtung eines virtuellen Zugangspunkts Hostapd.
  2. tun2socks – Erstellen und installieren Sie den systemd-Dienst auf dem System.
  3. systemd-netzwerkd – Konfigurieren Sie drahtlose und virtuelle Schnittstellen, statische Routing-Tabellen und Paketumleitung.
  4. create_ap — Installieren Sie den Systemd-Dienst auf dem System, konfigurieren und starten Sie einen virtuellen Zugangspunkt.

Optionale Schritte:

  • ntp — Installieren und konfigurieren Sie einen Server, um die Zeit auf virtuellen Access Point-Clients zu synchronisieren.
  • dnscrypt-proxy — Wir verschlüsseln DNS-Anfragen, leiten sie an SOCKS weiter und deaktivieren Werbedomänen für das lokale Netzwerk.

Warum das alles?

Dies ist eine der Möglichkeiten, TCP-Verbindungen in einem lokalen Netzwerk zu sichern. Der Hauptvorteil besteht darin, dass alle Verbindungen in SOCKS hergestellt werden, es sei denn, für sie wird eine statische Route über das ursprüngliche Gateway erstellt. Das bedeutet, dass Sie weder für einzelne Programme noch für Clients im lokalen Netzwerk SOCKS-Servereinstellungen angeben müssen – alle gehen standardmäßig zu SOCKS, da es das Standard-Gateway ist, bis wir etwas anderes angeben.

Im Wesentlichen fügen wir einen zweiten verschlüsselnden Router als Laptop vor dem ursprünglichen Router hinzu und nutzen die Internetverbindung des ursprünglichen Routers für die bereits verschlüsselten SOCKS-Anfragen des Laptops, der wiederum Anfragen von LAN-Clients weiterleitet und verschlüsselt.

Aus Anbietersicht sind wir ständig mit einem Server mit verschlüsseltem Datenverkehr verbunden.

Dementsprechend sind alle Geräte mit dem virtuellen Zugangspunkt des Laptops verbunden.

Installieren Sie tun2socks auf dem System

Solange Ihr Computer über Internet verfügt, laden Sie alle erforderlichen Tools herunter.

apt update
apt install git make cmake

Laden Sie das badvpn-Paket herunter

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

Auf Ihrem System wird ein Ordner angezeigt badvpn. Erstellen Sie einen separaten Ordner für den Build

mkdir badvpn-build

Gehen Sie dorthin

cd badvpn-build

Sammeln tun2socks

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

Auf dem System installieren

make install
  • Parameter -DBUILD_NOTHING_BY_DEFAULT=1 deaktiviert den Build aller Komponenten des BadVPN-Repositorys.
  • -DBUILD_TUN2SOCKS=1 Fügt eine Komponente in die Baugruppe ein tun2socks.
  • make install – installiert die tun2socks-Binärdatei auf Ihrem System unter /usr/local/bin/badvpn-tun2socks.

Installieren Sie den tun2socks-Dienst in systemd

Erstellen Sie eine Datei /etc/systemd/system/tun2socks.service mit folgendem Inhalt:

[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 – Nimmt den Namen der virtuellen Schnittstelle an, die wir mit systemd-networkd initialisieren.
  • --netif-ipaddr — die Netzwerkadresse des tun2socks-„Routers“, mit dem die virtuelle Schnittstelle verbunden ist. Es ist besser, es getrennt zu machen reserviertes Subnetz.
  • --socks-server-addr - akzeptiert Socket (адрес:порт SOCKS-Server).

Wenn Ihr SOCKS-Server eine Authentifizierung erfordert, können Sie die Parameter angeben --username и --password.

Als nächstes registrieren Sie den Dienst

systemctl daemon-reload

Und schalten Sie es ein

systemctl enable tun2socks

Bevor wir den Dienst starten, stellen wir ihm eine virtuelle Netzwerkschnittstelle zur Verfügung.

Wechsel zu systemd-networkd

Einschalten systemd-networkd:

systemctl enable systemd-networkd

Deaktivieren Sie aktuelle Netzwerkdienste.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-wait-online ist ein Dienst, der auf eine funktionierende Netzwerkverbindung wartet, bevor systemd weitere Dienste startet, die von der Anwesenheit eines Netzwerks abhängig sind. Wir deaktivieren es, wenn wir zum systemd-networkd-Analogon wechseln.

Lassen Sie es uns sofort aktivieren:

systemctl enable systemd-networkd-wait-online

Richten Sie die drahtlose Netzwerkschnittstelle ein

Erstellen Sie eine systemd-networkd-Konfigurationsdatei für die drahtlose Netzwerkschnittstelle /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Name und Vorname ist der Name Ihrer drahtlosen Schnittstelle. Identifizieren Sie es mit dem Befehl ip a.
  • IPForward – eine Direktive, die die Paketumleitung auf einer Netzwerkschnittstelle ermöglicht.
  • Adresse ist für die Zuweisung einer IP-Adresse zur drahtlosen Schnittstelle verantwortlich. Wir geben es statisch an, weil mit der entsprechenden Direktive DHCP=yes, systemd-networkd erstellt ein Standard-Gateway auf dem System. Dann wird der gesamte Datenverkehr über das ursprüngliche Gateway geleitet und nicht über die zukünftige virtuelle Schnittstelle in einem anderen Subnetz. Mit dem Befehl können Sie das aktuelle Standard-Gateway überprüfen ip r

Erstellen Sie eine statische Route für den Remote-SOCKS-Server

Wenn Ihr SOCKS-Server nicht lokal, sondern remote ist, müssen Sie eine statische Route dafür erstellen. Fügen Sie dazu einen Abschnitt hinzu Route bis zum Ende der von Ihnen erstellten Konfigurationsdatei für die drahtlose Schnittstelle mit folgendem Inhalt:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway – Dies ist das Standard-Gateway oder die Adresse Ihres ursprünglichen Zugangspunkts.
  • Destination – SOCKS-Serveradresse.

Konfigurieren Sie wpa_supplicant für systemd-networkd

systemd-networkd verwendet wpa_supplicant, um eine Verbindung zu einem sicheren Zugangspunkt herzustellen. Beim Versuch, die drahtlose Schnittstelle zu „erhöhen“, startet systemd-networkd den Dienst wpa_supplicant@имяWo Name ist der Name der drahtlosen Schnittstelle. Wenn Sie systemd-networkd bis zu diesem Zeitpunkt noch nicht verwendet haben, fehlt dieser Dienst wahrscheinlich auf Ihrem System.

Erstellen Sie es also mit dem Befehl:

systemctl enable wpa_supplicant@wlp6s0

ich benutzte wlp6s0 als Name seiner drahtlosen Schnittstelle. Ihr Name kann anders sein. Sie erkennen es am Befehl ip l.

Nun der erstellte Dienst wpa_supplicant@wlp6s0 wird gestartet, wenn die drahtlose Schnittstelle „hochgefahren“ wird, sucht jedoch wiederum nach den SSID- und Passworteinstellungen des Zugangspunkts in der Datei /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Daher müssen Sie es mit dem Dienstprogramm erstellen wpa_passphrase.

Führen Sie dazu den Befehl aus:

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

wo SSID ist der Name Ihres Zugangspunkts, Passwort ist das Passwort und wlp6s0 – der Name Ihrer drahtlosen Schnittstelle.

Initialisieren Sie die virtuelle Schnittstelle für tun2socks

Erstellen Sie eine Datei, um eine neue virtuelle Schnittstelle im System zu initialisieren/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Name und Vorname ist der Name, den systemd-networkd der zukünftigen virtuellen Schnittstelle bei der Initialisierung zuweist.
  • Art ist eine Art virtuelle Schnittstelle. Anhand des Namens des tun2socks-Dienstes können Sie erraten, dass er eine Schnittstelle wie verwendet tun.
  • netdev ist die Erweiterung von Dateien, die systemd-networkd Wird zum Initialisieren virtueller Netzwerkschnittstellen verwendet. Die Adresse und andere Netzwerkeinstellungen für diese Schnittstellen sind in angegeben .Netzwerk-Dateien.

Erstellen Sie eine Datei wie diese /etc/systemd/network/25-tun2socks.network mit folgendem Inhalt:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name – der Name der virtuellen Schnittstelle, die Sie angegeben haben netdev-Datei.
  • Address – IP-Adresse, die der virtuellen Schnittstelle zugewiesen wird. Muss sich im selben Netzwerk befinden wie die Adresse, die Sie im tun2socks-Dienst angegeben haben
  • Gateway — IP-Adresse des „Routers“ tun2socks, den Sie beim Erstellen des systemd-Dienstes angegeben haben.

Also die Schnittstelle tun2socks hat eine Adresse 172.16.1.2, und der Service tun2socks - 172.16.1.1, das heißt, es ist das Gateway für alle Verbindungen von der virtuellen Schnittstelle.

Richten Sie einen virtuellen Zugangspunkt ein

Abhängigkeiten installieren:

apt install util-linux procps hostapd iw haveged

Laden Sie das Repository herunter create_ap zu Ihrem Auto:

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

Gehen Sie zum Repository-Ordner auf Ihrem Computer:

cd create_ap

Auf dem System installieren:

make install

Auf Ihrem System wird eine Konfiguration angezeigt /etc/create_ap.conf. Hier sind die wichtigsten Bearbeitungsoptionen:

  • GATEWAY=10.0.0.1 — Es ist besser, daraus ein separates reserviertes Subnetz zu machen.
  • NO_DNS=1 - deaktivieren, da dieser Parameter von der virtuellen Schnittstelle systemd-networkd verwaltet wird.
  • NO_DNSMASQ=1 - Aus dem gleichen Grund ausschalten.
  • WIFI_IFACE=wlp6s0 — Drahtlose Laptop-Schnittstelle.
  • INTERNET_IFACE=tun2socks - eine virtuelle Schnittstelle, die für tun2socks erstellt wurde.
  • SSID=hostapd — Name des virtuellen Zugangspunkts.
  • PASSPHRASE=12345678 - Passwort.

Vergessen Sie nicht, den Dienst zu aktivieren:

systemctl enable create_ap

Aktivieren Sie den DHCP-Server in systemd-networkd

Service create_ap initialisiert eine virtuelle Schnittstelle im System ap0. Theoretisch hängt dnsmasq an dieser Schnittstelle, aber warum sollten zusätzliche Dienste installiert werden, wenn systemd-networkd einen integrierten DHCP-Server enthält?

Um es zu aktivieren, definieren wir die Netzwerkeinstellungen für den virtuellen Punkt. Erstellen Sie dazu eine Datei /etc/systemd/network/25-ap0.network mit folgendem Inhalt:

[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

Nachdem der Dienst „create_ap“ die virtuelle Schnittstelle initialisiert hat ap0, systemd-networkd weist ihm automatisch eine IP-Adresse zu und aktiviert den DHCP-Server.

Zeichenketten EmitDNS=yes и DNS=10.0.0.1 Übertragen Sie DNS-Servereinstellungen an Geräte, die mit dem Access Point verbunden sind.

Wenn Sie nicht vorhaben, einen lokalen DNS-Server zu verwenden – in meinem Fall ist es dnscrypt-proxy – können Sie ihn installieren DNS=10.0.0.1 в DNS=192.168.1.1Wo 192.168.1.1 – die Adresse Ihres ursprünglichen Gateways. Dann werden DNS-Anfragen für Ihren Host und Ihr lokales Netzwerk unverschlüsselt über die Server des Anbieters geleitet.

EmitNTP=yes и NTP=192.168.1.1 NTP-Einstellungen übertragen.

Das Gleiche gilt für die Linie NTP=10.0.0.1.

Installieren und konfigurieren Sie den NTP-Server

Auf dem System installieren:

apt install ntp

Bearbeiten Sie die Konfiguration /etc/ntp.conf. Kommentieren Sie die Adressen der Standardpools aus:

#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

Fügen Sie öffentliche Serveradressen hinzu, zum Beispiel Google Public NTP:

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

Ermöglichen Sie Clients in Ihrem Netzwerk Zugriff auf den Server:

restrict 10.0.0.0 mask 255.255.255.0

Aktivieren Sie die Übertragung an Ihr Netzwerk:

broadcast 10.0.0.255

Fügen Sie abschließend die Adressen dieser Server zur statischen Routing-Tabelle hinzu. Öffnen Sie dazu die Konfigurationsdatei der drahtlosen Schnittstelle /etc/systemd/network/25-wlp6s0.network und am Ende des Abschnitts hinzufügen 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

Mit dem Dienstprogramm können Sie die Adressen Ihrer NTP-Server herausfinden host следующим обрахом:

host time1.google.com

Installieren Sie dnscrypt-proxy, entfernen Sie Werbung und verbergen Sie den DNS-Verkehr vor Ihrem Provider

apt install dnscrypt-proxy

Um Host- und lokale Netzwerk-DNS-Abfragen zu bedienen, bearbeiten Sie den Socket /lib/systemd/system/dnscrypt-proxy.socket. Ändern Sie die folgenden Zeilen:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

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

systemctl daemon-reload

Bearbeiten Sie die Konfiguration /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Um DNScrypt-Proxy-Verbindungen über tun2socks weiterzuleiten, fügen Sie Folgendes hinzu:

force_tcp = true

Bearbeiten Sie die Konfiguration /etc/resolv.conf, wodurch der DNS-Server dem Host mitgeteilt wird.

nameserver 127.0.0.1
nameserver 192.168.1.1

Die erste Zeile ermöglicht die Verwendung von dnscrypt-proxy, die zweite Zeile verwendet das ursprüngliche Gateway für den Fall, dass der dnscrypt-proxy-Server nicht verfügbar ist.

Fertig!

Starten Sie die Netzwerkdienste neu oder beenden Sie die Ausführung:

systemctl stop networking NetworkManager NetworkManager-wait-online

Und starten Sie alles Notwendige neu:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Nach einem Neustart oder Neustart verfügen Sie über einen zweiten Zugangspunkt, der den Host und die LAN-Geräte an SOCKS weiterleitet.

So sieht die Ausgabe aus ip a normaler Laptop:

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

Infolgedessen

  1. Der Anbieter sieht nur die verschlüsselte Verbindung zu Ihrem SOCKS-Server, das heißt, er sieht nichts.
  2. Und dennoch sieht es Ihre NTP-Anfragen. Um dies zu verhindern, entfernen Sie statische Routen für NTP-Server. Es ist jedoch nicht sicher, ob Ihr SOCKS-Server das NTP-Protokoll zulässt.

Crutch wurde auf Debain 10 gesichtet

Wenn Sie versuchen, den Netzwerkdienst über die Konsole neu zu starten, schlägt der Vorgang mit einer Fehlermeldung fehl. Dies liegt daran, dass ein Teil davon in Form einer virtuellen Schnittstelle an den Dienst tun2socks gebunden ist, also genutzt wird. Um den Netzwerkdienst neu zu starten, müssen Sie zunächst den tun2socks-Dienst stoppen. Aber ich denke, wenn Sie bis zum Ende lesen, ist das definitiv kein Problem für Sie!

Referenzen

  1. Statisches Routing unter Linux – IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Dieses Skript erstellt einen NAT- oder Bridged-WLAN-Zugangspunkt.
  5. dnscrypt-proxy 2 – Ein flexibler DNS-Proxy mit Unterstützung für verschlüsselte DNS-Protokolle.

Source: habr.com