Construyendo un enrutador en SOCKS en una computadora portátil con Debian 10

Durante un año (o dos) pospuse la publicación de este artículo por la razón principal: ya había publicado dos artículos en los que describía el proceso de creación de un enrutador en SOCKS desde una computadora portátil muy común con Debian.

Sin embargo, desde entonces la versión estable de Debian se actualizó a Buster, un número suficiente de personas se han puesto en contacto conmigo en privado para pedirme ayuda con la configuración, lo que significa que mis artículos anteriores no son exhaustivos. Bueno, yo mismo supuse que los métodos descritos en ellos no revelan completamente todas las complejidades de configurar Linux para enrutar en SOCKS. Además, están escritos para Debian Stretch y, después de actualizar a Buster, noté pequeños cambios en la interacción de los servicios en el sistema de inicio systemd. Y en los artículos mismos no utilicé systemd-networkd, aunque es más adecuado para configuraciones de red complejas.

Además de los cambios anteriores, se agregaron los siguientes servicios a mi configuración: hostapd - servicio de virtualización de puntos de acceso, ntp para sincronizar la hora de los clientes de la red local, proxy-dnscrypt para cifrar conexiones a través de DNS y deshabilitar la publicidad en los clientes de la red local, y también, como mencioné anteriormente, systemd-red para configurar interfaces de red.

A continuación se muestra un diagrama de bloques simple de la estructura interna de dicho enrutador.

Construyendo un enrutador en SOCKS en una computadora portátil con Debian 10

Entonces, déjame recordarte cuáles son los objetivos de esta serie de artículos:

  1. Enrute todas las conexiones del sistema operativo a SOCKS, así como las conexiones de todos los dispositivos en la misma red que la computadora portátil.
  2. En mi caso, el portátil debería seguir siendo completamente móvil. Es decir, brindar la oportunidad de utilizar el entorno de escritorio y no estar atado a una ubicación física.
  3. El último punto implica conexión y enrutamiento únicamente a través de la interfaz inalámbrica incorporada.
  4. Bueno, y por supuesto, la creación de una guía completa, así como un análisis de las tecnologías relevantes según mis modestos conocimientos.

Qué se cubrirá en este artículo:

  1. git — descargar repositorios de proyectos tun2calcetinesrequerido para enrutar el tráfico TCP a SOCKS, y crear_ap — un script para automatizar la configuración de un punto de acceso virtual usando hostapd.
  2. tun2calcetines — compila e instala el servicio systemd en el sistema.
  3. systemd-red — configurar interfaces inalámbricas y virtuales, tablas de enrutamiento estático y redireccionamiento de paquetes.
  4. crear_ap — instale el servicio systemd en el sistema, configure e inicie un punto de acceso virtual.

Pasos opcionales:

  • ntp — instalar y configurar un servidor para sincronizar la hora en clientes de puntos de acceso virtuales.
  • proxy-dnscrypt — cifraremos las solicitudes de DNS, las enrutaremos a SOCKS y desactivaremos los dominios publicitarios para la red local.

¿Por qué todo esto?

Esta es una de las formas de proteger las conexiones TCP en una red local. La principal ventaja es que todas las conexiones se realizan en SOCKS, a menos que se cree una ruta estática para ellas a través de la puerta de enlace original. Esto significa que no necesita especificar la configuración del servidor SOCKS ni para programas individuales ni para clientes en la red local; todos van a SOCKS de forma predeterminada, ya que es la puerta de enlace predeterminada hasta que indiquemos lo contrario.

Básicamente, agregamos un segundo enrutador de cifrado como una computadora portátil frente al enrutador original y utilizamos la conexión a Internet del enrutador original para las solicitudes SOCKS ya cifradas de la computadora portátil, que a su vez enruta y cifra las solicitudes de los clientes de LAN.

Desde el punto de vista del proveedor, estamos constantemente conectados a un servidor con tráfico cifrado.

En consecuencia, todos los dispositivos están conectados al punto de acceso virtual de la computadora portátil.

Instalar tun2socks en el sistema

Siempre que su máquina tenga internet, descargue todas las herramientas necesarias.

apt update
apt install git make cmake

Descargue el paquete badvpn

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

Aparecerá una carpeta en su sistema. badvpn. Crea una carpeta separada para la compilación.

mkdir badvpn-build

Ve hacia eso

cd badvpn-build

Recoger tun2socks

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

Instalar en el sistema

make install
  • Parámetro -DBUILD_NOTHING_BY_DEFAULT=1 deshabilita la compilación de todos los componentes del repositorio badvpn.
  • -DBUILD_TUN2SOCKS=1 incluye un componente en el ensamblaje tun2calcetines.
  • make install — instalará el binario tun2socks en su sistema en /usr/local/bin/badvpn-tun2socks.

Instale el servicio tun2socks en systemd

Crear un archivo /etc/systemd/system/tun2socks.service con el siguiente contenido:

[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 - toma el nombre de la interfaz virtual que inicializamos con systemd-networkd.
  • --netif-ipaddr — la dirección de red del “enrutador” tun2socks al que está conectada la interfaz virtual. Es mejor hacerlo por separado. subred reservada.
  • --socks-server-addr - acepta socket (адрес:порт servidores SOCKS).

Si su servidor SOCKS requiere autenticación, puede especificar los parámetros --username и --password.

A continuación, registre el servicio.

systemctl daemon-reload

Y enciéndelo

systemctl enable tun2socks

Antes de iniciar el servicio, le proporcionaremos una interfaz de red virtual.

Cambiar a systemd-networkd

Encender systemd-networkd:

systemctl enable systemd-networkd

Desactive los servicios de red actuales.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-espera-en línea es un servicio que espera una conexión de red que funcione antes de que systemd continúe iniciando otros servicios que dependen de la presencia de una red. Lo estamos deshabilitando mientras cambiamos al análogo systemd-networkd.

Habilitémoslo de inmediato:

systemctl enable systemd-networkd-wait-online

Configurar la interfaz de red inalámbrica

Cree un archivo de configuración systemd-networkd para la interfaz de red inalámbrica /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Nombre es el nombre de su interfaz inalámbrica. Identificarlo con el comando ip a.
  • IPAdelante - una directiva que permite la redirección de paquetes en una interfaz de red.
  • Dirección es responsable de asignar una dirección IP a la interfaz inalámbrica. Lo especificamos estáticamente porque con la directiva equivalente DHCP=yes, systemd-networkd crea una puerta de enlace predeterminada en el sistema. Entonces todo el tráfico pasará por la puerta de enlace original y no por la futura interfaz virtual en una subred diferente. Puede verificar la puerta de enlace predeterminada actual con el comando ip r

Cree una ruta estática para el servidor SOCKS remoto

Si su servidor SOCKS no es local, sino remoto, entonces necesita crear una ruta estática para él. Para hacer esto, agregue una sección Route hasta el final del archivo de configuración de la interfaz inalámbrica que creó con el siguiente contenido:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — esta es la puerta de enlace predeterminada o la dirección de su punto de acceso original.
  • Destination — Dirección del servidor SOCKS.

Configurar wpa_supplicant para systemd-networkd

systemd-networkd usa wpa_supplicant para conectarse a un punto de acceso seguro. Al intentar "elevar" la interfaz inalámbrica, systemd-networkd inicia el servicio wpa_supplicant@имяDonde nombre es el nombre de la interfaz inalámbrica. Si no ha utilizado systemd-networkd antes de este punto, es probable que este servicio no esté disponible en su sistema.

Así que créelo con el comando:

systemctl enable wpa_supplicant@wlp6s0

solía wlp6s0 como nombre de su interfaz inalámbrica. Tu nombre puede ser diferente. Puedes reconocerlo con el comando. ip l.

Ahora el servicio creado. wpa_supplicant@wlp6s0 se iniciará cuando se "levante" la interfaz inalámbrica, sin embargo, a su vez, buscará la configuración de SSID y contraseña del punto de acceso en el archivo /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Por lo tanto, debes crearlo usando la utilidad. wpa_passphrase.

Para hacer esto, ejecute el comando:

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

donde SSID es el nombre de su punto de acceso, contraseña es la contraseña y wlp6s0 — el nombre de su interfaz inalámbrica.

Inicialice la interfaz virtual para tun2socks

Cree un archivo para inicializar una nueva interfaz virtual en el sistema/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Nombre es el nombre que systemd-networkd asignará a la futura interfaz virtual cuando se inicialice.
  • Tipo es un tipo de interfaz virtual. Por el nombre del servicio tun2socks, puedes adivinar que utiliza una interfaz como tun.
  • netdev es la extensión de los archivos que systemd-networkd Se utiliza para inicializar interfaces de red virtuales. La dirección y otras configuraciones de red para estas interfaces se especifican en .red-archivos.

Crea un archivo como este /etc/systemd/network/25-tun2socks.network con el siguiente contenido:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name — el nombre de la interfaz virtual que especificó en netdev-archivo.
  • Address — Dirección IP que se asignará a la interfaz virtual. Debe estar en la misma red que la dirección que especificaste en el servicio tun2socks
  • Gateway — Dirección IP del “enrutador” tun2calcetines, que especificó al crear el servicio systemd.

Entonces la interfaz tun2calcetines tiene una dirección 172.16.1.2, y el servicio tun2calcetines - 172.16.1.1, es decir, es la puerta de entrada para todas las conexiones desde la interfaz virtual.

Configurar un punto de acceso virtual

Instalar dependencias:

apt install util-linux procps hostapd iw haveged

Descargar el repositorio crear_ap a tu coche:

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

Vaya a la carpeta del repositorio en su máquina:

cd create_ap

Instalar en el sistema:

make install

Aparecerá una configuración en su sistema. /etc/create_ap.conf. Estas son las principales opciones de edición:

  • GATEWAY=10.0.0.1 – es mejor convertirla en una subred reservada separada.
  • NO_DNS=1 - deshabilitar, ya que este parámetro será administrado por la interfaz virtual systemd-networkd.
  • NO_DNSMASQ=1 - apágalo por el mismo motivo.
  • WIFI_IFACE=wlp6s0 — interfaz inalámbrica para ordenador portátil.
  • INTERNET_IFACE=tun2socks - una interfaz virtual creada para tun2socks.
  • SSID=hostapd — nombre del punto de acceso virtual.
  • PASSPHRASE=12345678 - contraseña.

No olvides habilitar el servicio:

systemctl enable create_ap

Habilite el servidor DHCP en systemd-networkd

Oficina create_ap Inicializa una interfaz virtual en el sistema. ap0. En teoría, dnsmasq se bloquea en esta interfaz, pero ¿por qué instalar servicios adicionales si systemd-networkd contiene un servidor DHCP integrado?

Para habilitarlo definiremos la configuración de red del punto virtual. Para hacer esto, cree un archivo /etc/systemd/network/25-ap0.network con el siguiente contenido:

[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

Después de que el servicio create_ap inicializa la interfaz virtual ap0, systemd-networkd le asignará automáticamente una dirección IP y habilitará el servidor DHCP.

Cuerdas EmitDNS=yes и DNS=10.0.0.1 transmitir la configuración del servidor DNS a los dispositivos conectados al punto de acceso.

Si no planea utilizar un servidor DNS local (en mi caso es dnscrypt-proxy), puede instalar DNS=10.0.0.1 в DNS=192.168.1.1Donde 192.168.1.1 — la dirección de su puerta de enlace original. Luego, las solicitudes de DNS para su host y red local pasarán sin cifrar a través de los servidores del proveedor.

EmitNTP=yes и NTP=192.168.1.1 transferir la configuración NTP.

Lo mismo ocurre con la línea NTP=10.0.0.1.

Instalar y configurar el servidor NTP

Instalar en el sistema:

apt install ntp

Editar la configuración /etc/ntp.conf. Comente las direcciones de los grupos estándar:

#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

Agregue direcciones de servidores públicos, por ejemplo Google Public NTP:

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

Proporcione acceso al servidor a los clientes de su red:

restrict 10.0.0.0 mask 255.255.255.0

Habilite la transmisión a su red:

broadcast 10.0.0.255

Finalmente, agregue las direcciones de estos servidores a la tabla de enrutamiento estático. Para hacer esto, abra el archivo de configuración de la interfaz inalámbrica. /etc/systemd/network/25-wlp6s0.network y agregar al final de la sección 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

Puede averiguar las direcciones de sus servidores NTP utilizando la utilidad host следующим обрахом:

host time1.google.com

Instale dnscrypt-proxy, elimine anuncios y oculte el tráfico DNS de su proveedor

apt install dnscrypt-proxy

Para atender consultas DNS del host y de la red local, edite el socket /lib/systemd/system/dnscrypt-proxy.socket. Cambie las siguientes líneas:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Reiniciar systemd:

systemctl daemon-reload

Editar la configuración /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Para enrutar conexiones dnscrypt-proxy a través de tun2socks, agregue lo siguiente:

force_tcp = true

Editar la configuración /etc/resolv.conf, que le dice al servidor DNS al host.

nameserver 127.0.0.1
nameserver 192.168.1.1

La primera línea permite el uso de dnscrypt-proxy, la segunda línea usa la puerta de enlace original en caso de que el servidor dnscrypt-proxy no esté disponible.

¡Ya está!

Reinicie o deje de ejecutar los servicios de red:

systemctl stop networking NetworkManager NetworkManager-wait-online

Y reinicie todo lo necesario:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Después de reiniciar o reiniciar, tendrá un segundo punto de acceso que enruta el host y los dispositivos LAN a SOCKS.

Así es como se ve la salida ip a computadora portátil normal:

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

Como resultado,

  1. El proveedor solo ve la conexión cifrada a su servidor SOCKS, lo que significa que no ve nada.
  2. Y, sin embargo, ve sus solicitudes NTP; para evitarlo, elimine las rutas estáticas para los servidores NTP. Sin embargo, no es seguro que su servidor SOCKS admita el protocolo NTP.

Muleta vista en Debain 10

Si intenta reiniciar el servicio de red desde la consola, fallará con un error. Esto se debe al hecho de que parte de él en forma de interfaz virtual está vinculado al servicio tun2socks, lo que significa que se utiliza. Para reiniciar el servicio de red, primero debe detener el servicio tun2socks. Pero creo que si lees hasta el final, ¡definitivamente esto no será un problema para ti!

referencias

  1. Enrutamiento estático en Linux - IBM
  2. systemd-networkd.servicio - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: este script crea un punto de acceso WiFi con puente o NAT.
  5. dnscrypt-proxy 2: un proxy DNS flexible, compatible con protocolos DNS cifrados.

Fuente: habr.com