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

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

Sin embargo, desde entonces la versión estable de Debian se ha actualizado a Buster, un número suficiente de personas me ha enviado una solicitud personal para ayudar 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 revelaban completamente todas las complejidades de la configuración de Linux para el enrutamiento en SOSKS. Además, están escritos para Debian Stretch, y después de actualizar a Buster, en el sistema de inicialización systemd, noté pequeños cambios en la interacción de los servicios. Sí, y en los artículos mismos, no utilicé systemd-networkd, aunque es el más adecuado para configuraciones de red complejas.

Además de los cambios anteriores, se agregaron servicios como hostapd a mi configuración : un servicio para la virtualización del punto de acceso, ntp para sincronizar la hora de los clientes de la red local, dnscrypt-proxy para encriptar las conexiones DNS y deshabilitar la publicidad en los clientes de la red local, así como, como mencioné anteriormente, systemd-networkd para configurar interfaces de red.

Aquí está el diagrama de bloques más simple de la estructura interna de dicho enrutador.



Entonces, les recuerdo cuáles son los objetivos del ciclo de estos artículos:

  1. Enrute todas las conexiones del sistema operativo a SOCKS, así como las conexiones de todos los dispositivos que están en la misma red que la computadora portátil.
  2. La computadora portátil en mi caso debe permanecer completamente móvil. Es decir, para dar la oportunidad de usar el entorno de escritorio y no estar atado a una ubicación física.
  3. El último punto implica la conexión y el enrutamiento solo a través de la interfaz inalámbrica incorporada.
  4. Bueno, por supuesto, la creación de una guía exhaustiva, así como el análisis de tecnologías apropiadas a lo mejor de mi modesto conocimiento.

Lo que se considerará en este artículo:

  1. git : descargue los repositorios de proyectos tun2socks necesarios para enrutar el tráfico TCP a SOCKS, y create_ap , un script para automatizar la configuración de un punto de acceso virtual usando hostapd .
  2. tun2socks : crea e instala el servicio systemd en el sistema .
  3. systemd-networkd : configura interfaces inalámbricas y virtuales, tablas de enrutamiento estático y reenvío de paquetes.
  4. create_ap : instala el servicio systemd en el sistema, configura e inicia el punto de acceso virtual.

Pasos opcionales:

  • ntp : instala y configura el servidor para sincronizar la hora en los clientes del punto de acceso virtual.
  • dnscrypt-proxy : encripta las consultas DNS, las enruta a SOCKS y deshabilita los dominios publicitarios para la red local.

¿Por qué todo esto?


Esta es una forma de proteger las conexiones TCP en una red local. La principal ventaja es que todas las conexiones van a SOCKS si no se crea una ruta estática a través de la puerta de enlace original. Esto significa que no es necesario prescribir la configuración del servidor SOCKS a programas individuales o clientes en la red local; todos van a SOCKS de forma predeterminada, ya que es la puerta de enlace predeterminada hasta que especifiquemos lo contrario.

De hecho, agregamos el segundo enrutador de encriptación como una computadora portátil frente al enrutador original y usamos la conexión a Internet del enrutador original para las solicitudes SOCKS ya encriptadas de la computadora portátil, que, a su vez, enruta y encripta las solicitudes de los clientes de la red local.

Desde el punto de vista del proveedor, estamos constantemente conectados al mismo servidor con tráfico encriptado.

En consecuencia, todos los dispositivos se conectan al punto de acceso virtual de una computadora portátil.

Antes de que empieces


Casi todas las configuraciones están disponibles en el repositorio .

Instale tun2socks en el sistema


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

apt update

apt install git make cmake

Descargue el paquete badvpn
git clone https://github.com/ambrop72/badvpn

La carpeta badvpn aparecerá en su sistema . Crear una carpeta de compilación separada

mkdir badvpn-build

Ve a ella

cd badvpn-build

Construir tun2socks

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

Instalar en el sistema

make install

  • El parámetro -DBUILD_NOTHING_BY_DEFAULT = 1 deshabilita el ensamblaje de todos los componentes del repositorio de badvpn .
  • DBUILD_TUN2SOCKS = 1 incluye componentes tun2socks en el ensamblaje .
  • make install : instala el binario tun2socks en su sistema en / usr / local / bin / badvpn-tun2socks.

Instalar el servicio tun2socks en systemd


Cree el 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 : acepta el nombre de la interfaz virtual que inicializamos con systemd-networkd .
  • --netif-ipaddr : dirección de red de los Tun2socks "enrutadores" a los que está conectada la interfaz virtual. Es mejor hacer una subred reservada separada .
  • --socks-server-addr - acepta un socket ( dirección: puerto del servidor SOCKS).

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

Luego, registre el servicio

systemctl daemon-reload

Y enciende

systemctl enable tun2socks

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

Ir a systemd-networkd


Encienda systemd-networkd :

systemctl enable systemd-networkd

Deshabilitar los servicios de red actuales.

systemctl disable networking NetworkManager NetworkManager-wait-online

  • NetworkManager-wait-online es un servicio que espera una conexión de red en funcionamiento antes de que systemd continúe iniciando otros servicios dependiendo de la disponibilidad de la red. Lo deshabilitamos, ya que cambiamos al sistema analógico systemd-networkd .

Vamos a encenderlo de inmediato:

systemctl enable systemd-networkd-wait-online

Configurar una 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
IPMasquerade=yes

  • Nombre es el nombre de su interfaz inalámbrica. Identifíquelo con el comando ip a .
  • IPMasquerade es una directiva que incluye enmascaramiento y reenvío de paquetes en una interfaz de red.
  • La 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. Luego, todo el tráfico pasará por la puerta de enlace original, y no a través de la interfaz virtual futura en una subred excelente. Puede verificar la puerta de enlace predeterminada actual con el comando
    ip r

Cree una ruta estática para el servidor remoto SOCKS


Si su servidor SOCKS no es local, sino remoto, entonces necesita crear una ruta estática para él. Para hacer esto, agregue la sección Ruta al final del archivo de configuración inalámbrica que creó con los siguientes contenidos:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0

  • Gateway es la puerta de enlace o dirección predeterminada de su punto de acceso original.
  • Destino : dirección del servidor SOCKS.

Configure wpa_supplicant para systemd-networkd


systemd-networkd usa wpa_supplicant para conectarse a un punto de acceso seguro. Cuando intenta "elevar" la interfaz inalámbrica, systemd-networkd inicia el servicio wpa_supplicant @ name , donde nombre es el nombre de la interfaz inalámbrica. Si no ha utilizado systemd-networkd antes de este punto, entonces con seguridad este servicio no está disponible en su sistema.

Por lo tanto, créelo con el comando:

systemctl enable wpa_supplicant@wlp6s0

Solía wlp6s0 como el nombre de mi interfaz inalámbrica. Tu nombre puede ser diferente. Puedes averiguarlo por su equipo
ip l
.

Ahora, el servicio creado wpa_supplicant @ wlp6s0 se iniciará cuando la interfaz inalámbrica se "levante", 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, debe crearlo utilizando 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 es el nombre de su interfaz inalámbrica.

Inicializar 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.
  • El tipo es un tipo de interfaz virtual. Según el nombre del servicio tun2socks , puede adivinar que usa una interfaz como tun .
  • netdev es la extensión de archivo que systemd-networkd usa para inicializar las interfaces de red virtuales. La dirección y otras configuraciones de red para estas interfaces se especifican en archivos .network .

Cree un archivo /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

  • Nombre : el nombre de la interfaz virtual que especificó en el archivo netdev .
  • Dirección : dirección IP que se asignará a la interfaz virtual. Debe estar en la misma red que la dirección que especificó en tun2socks
  • Gateway : la dirección IP de los Tun2socks "enrutadores" que especificó al crear el servicio systemd .

Por lo tanto, la interfaz tun2socks tiene la dirección 172.16.1.2 , y el servicio tun2socks es 172.16.1.1 , es decir, es la puerta de enlace para todas las conexiones desde la interfaz virtual.

Configurar un punto de acceso virtual


Instalar las dependencias:

apt install util-linux procps hostapd iw haveged

Descargue el repositorio create_ap en su máquina:

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

La configuración /etc/create_ap.conf aparecerá en su sistema . Estas son las principales opciones para editar:

  • GATEWAY = 10.0.0.1 : es mejor hacer una subred reservada separada.
  • NO_DNS = 1 - apague, ya que este parámetro será controlado por la interfaz virtual systemd-networkd.
  • NO_DNSMASQ = 1 - apague por la misma razón.
  • WIFI_IFACE = wlp6s0 : interfaz inalámbrica de la computadora portátil.
  • INTERNET_IFACE = tun2socks> : interfaz virtual creada para tun2socks .
  • SSID = hostapd - nombre del punto de acceso virtual.
  • CONTRASEÑA = 12345678 - contraseña.

Recuerde habilitar el servicio:

systemctl enable create_ap

Habilitar el servidor DHCP en systemd-networkd


El servicio create_ap inicializa la interfaz virtual ap0 en el sistema . En teoría, dnsmasq se cuelga de esta interfaz , pero ¿por qué instalar servicios adicionales si systemd-networkd contiene un servidor DHCP incorporado?

Para habilitarlo, defina la configuración de red para el punto virtual. Para hacer esto, cree el archivo /etc/systemd/network/25-ap0.network con los siguientes contenidos:

[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 sreate_ap inicialice la interfaz virtual Ap0 , systemd-NetworkD asigna automáticamente una dirección IP y habilita el servidor DHCP.

Las líneas EmitDNS = yes y DNS = 10.0.0.1 pasan la configuración del servidor DNS a los dispositivos conectados al punto de acceso.

Si no planea usar un servidor DNS local, en mi caso es dnscrypt-proxy , puede configurar DNS = 10.0.0.1 a DNS = 192.168.1.1 , donde 192.168.1.1 es la dirección de su puerta de enlace original. Luego, las consultas DNS de su host y red local no se cifrarán a través de los servidores del proveedor.

EmitNTP = síy NTP = 192.168.1.1 transmiten la configuración de 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

Edite 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 las 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

Otorgue acceso al servidor a los clientes de su red:

restrict 10.0.0.0 mask 255.255.255.0

Convierta la transmisión en 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 inalámbrica /etc/systemd/network/25-wlp6s0.network y agregue la sección Ruta al final .

[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 encontrar las direcciones de sus servidores NTP utilizando la utilidad host de la siguiente manera:

host time1.google.com

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


apt install dnscrypt-proxy

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

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Reiniciar systemd:

systemctl daemon-reload

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

server_names = ['adguard-dns']

Para enrutar conexiones dnscrypt-proxy a través de tun2socks , agregue a continuación:

force_tcp = true

Edite 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 incluye el uso de dnscrypt-proxy , la segunda usa la puerta de enlace original, en caso de que el servidor dnscrypt-proxy no esté disponible.

¡Hecho!


Reinicie o detenga los servicios de red existentes:

systemctl stop networking NetworkManager NetworkManager-wait-online

Y reinicie todos los necesarios:

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
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

Finalmente


  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 evitar esto, elimine las rutas estáticas para los servidores NTP. Sin embargo, no es un hecho que su servidor SOCKS permita 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 ella en forma de interfaz virtual está vinculada al servicio tun2socks , lo que significa que se utiliza. Para reiniciar el servicio de red, primero debe detener el servicio tun2socks . Pero, creo, si lees hasta el final, ¡para ti definitivamente no es un problema!

Referencias


  1. Enrutamiento estático en Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks ambrop72 / badvpn wiki github
  4. oblicuo / create_ap: este script crea un punto de acceso WiFi NATed o Bridged.
  5. dnscrypt-proxy 2: un proxy DNS flexible, compatible con protocolos DNS cifrados.

All Articles