Construír un enrutador en SOCKS nun portátil con Debian 10

Durante un ano enteiro (ou dous) posterguei a publicación deste artigo polo motivo principal: xa publicara dous artigos nos que describía o proceso de creación dun enrutador en SOCKS desde un portátil moi común con Debian.

Porén, desde entón a versión estable de Debian foi actualizada a Buster, un número suficiente de persoas púxose en contacto comigo de xeito privado para pedir axuda para a configuración, o que significa que os meus artigos anteriores non son exhaustivos. Ben, eu mesmo supuxín que os métodos descritos neles non revelan completamente todas as complejidades de configurar Linux para o enrutamento en SOCKS. Ademais, están escritos para Debian Stretch, e despois de actualizar a Buster, no sistema systemd init, notei pequenos cambios na interacción dos servizos. E nos propios artigos, non usei systemd-networkd, aínda que é o máis adecuado para configuracións de rede complexas.

Ademais dos cambios anteriores, engadíronse os seguintes servizos á miña configuración: hostapd - servizo de virtualización de puntos de acceso, ntp para sincronizar a hora dos clientes da rede local, dnscrypt-proxy para cifrar conexións a través de DNS e desactivar a publicidade nos clientes da rede local, e tamén, como mencionei anteriormente, systemd-networkd para configurar interfaces de rede.

Aquí tes un diagrama de bloques sinxelo da estrutura interna deste enrutador.

Construír un enrutador en SOCKS nun portátil con Debian 10

Entón, permíteme recordar cales son os obxectivos desta serie de artigos:

  1. Encamiña todas as conexións do sistema operativo a SOCKS, así como as conexións de todos os dispositivos da mesma rede que o portátil.
  2. O portátil no meu caso debería permanecer completamente móbil. É dicir, ofrecer a oportunidade de usar o ambiente de escritorio e non estar ligado a unha localización física.
  3. O último punto implica conexión e enrutamento só a través da interface sen fíos integrada.
  4. Ben, e por suposto, a creación dunha guía completa, así como unha análise das tecnoloxías relevantes segundo o meu modesto coñecemento.

O que se tratará neste artigo:

  1. ir - descargar repositorios de proxectos tun2socksnecesario para enrutar o tráfico TCP a SOCKS e crear_ap — un script para automatizar a configuración dun punto de acceso virtual usando hostapd.
  2. tun2socks — construír e instalar o servizo systemd no sistema.
  3. systemd-networkd — configurar interfaces sen fíos e virtuais, táboas de enrutamento estáticas e redirección de paquetes.
  4. crear_ap — instale o servizo systemd no sistema, configure e inicie un punto de acceso virtual.

Pasos opcionais:

  • ntp — instale e configure un servidor para sincronizar o tempo en clientes de puntos de acceso virtuais.
  • dnscrypt-proxy — cifraremos as solicitudes de DNS, encamiñaremos a SOCKS e desactivaremos os dominios publicitarios para a rede local.

Para que serve todo isto?

Esta é unha das formas de protexer as conexións TCP nunha rede local. A principal vantaxe é que todas as conexións fanse en SOCKS, a non ser que se constrúa unha ruta estática para elas a través da pasarela orixinal. Isto significa que non precisa especificar a configuración do servidor SOCKS nin para programas individuais nin para clientes da rede local; todos eles van a SOCKS por defecto, xa que é a pasarela predeterminada ata que indiquemos o contrario.

Esencialmente, engadimos un segundo enrutador de cifrado como un portátil diante do enrutador orixinal e utilizamos a conexión a Internet do enrutador orixinal para as solicitudes SOCKS xa cifradas do portátil, que á súa vez envía e cifra as solicitudes dos clientes LAN.

Desde o punto de vista do provedor, estamos constantemente conectados a un servidor con tráfico cifrado.

En consecuencia, todos os dispositivos están conectados ao punto de acceso virtual do portátil.

Instala tun2socks no sistema

Sempre que a túa máquina teña internet, descarga todas as ferramentas necesarias.

apt update
apt install git make cmake

Descarga o paquete badvpn

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

Aparecerá un cartafol no seu sistema badvpn. Crea un cartafol separado para a compilación

mkdir badvpn-build

Vaia a el

cd badvpn-build

Recoller tun2socks

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

Instalar no sistema

make install
  • Parámetro -DBUILD_NOTHING_BY_DEFAULT=1 desactiva a compilación de todos os compoñentes do repositorio badvpn.
  • -DBUILD_TUN2SOCKS=1 inclúe un compoñente no conxunto tun2socks.
  • make install — instalará o binario tun2socks no seu sistema en /usr/local/bin/badvpn-tun2socks.

Instale o servizo tun2socks en systemd

Crear un ficheiro /etc/systemd/system/tun2socks.service co seguinte contido:

[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 o nome da interface virtual que inicializamos con systemd-networkd.
  • --netif-ipaddr — o enderezo de rede do "router" tun2socks ao que está conectada a interface virtual. É mellor facelo separado subrede reservada.
  • --socks-server-addr - acepta socket (адрес:порт servidores SOCKS).

Se o teu servidor SOCKS require autenticación, podes especificar os parámetros --username и --password.

A continuación, rexistra o servizo

systemctl daemon-reload

E acéndeo

systemctl enable tun2socks

Antes de iniciar o servizo, proporcionarémoslle unha interface de rede virtual.

Cambiando a systemd-networkd

Incluímos systemd-networkd:

systemctl enable systemd-networkd

Desactivar os servizos de rede actuais.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • Network Manager-espera-en liña é un servizo que espera unha conexión de rede que funcione antes de que systemd continúe iniciando outros servizos que dependen da presenza dunha rede. Desactivámolo mentres cambiamos ao analóxico systemd-networkd.

Habilitamos de inmediato:

systemctl enable systemd-networkd-wait-online

Configure a interface de rede sen fíos

Cree un ficheiro de configuración systemd-networkd para a interface de rede sen fíos /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • nome é o nome da súa interface sen fíos. Identifícao co comando ip a.
  • IPForward - unha directiva que permite a redirección de paquetes nunha interface de rede.
  • dirección é responsable de asignar un enderezo IP á interface sen fíos. Especificámolo de forma estática porque coa directiva equivalente DHCP=yes, systemd-networkd crea unha pasarela predeterminada no sistema. Entón todo o tráfico pasará pola pasarela orixinal e non pola futura interface virtual nunha subrede diferente. Podes comprobar a pasarela predeterminada actual co comando ip r

Cree unha ruta estática para o servidor remoto SOCKS

Se o teu servidor SOCKS non é local, senón remoto, debes crear unha ruta estática para el. Para iso, engade unha sección Route ata o final do ficheiro de configuración da interface sen fíos que creou co seguinte contido:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — esta é a pasarela predeterminada ou o enderezo do seu punto de acceso orixinal.
  • Destination — Enderezo do servidor SOCKS.

Configure wpa_supplicant para systemd-networkd

systemd-networkd usa wpa_supplicant para conectarse a un punto de acceso seguro. Ao tentar "elevar" a interface sen fíos, systemd-networkd inicia o servizo wpa_supplicant@имяonde nome é o nome da interface sen fíos. Se non utilizou systemd-networkd antes deste punto, probablemente este servizo falte no seu sistema.

Entón créao co comando:

systemctl enable wpa_supplicant@wlp6s0

usei wlp6s0 como o nome da súa interface sen fíos. O teu nome pode ser diferente. Podes recoñecelo co comando ip l.

Agora o servizo creado wpa_supplicant@wlp6s0 lanzarase cando a interface sen fíos "se eleve", con todo, buscará a configuración do SSID e do contrasinal do punto de acceso no ficheiro /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Polo tanto, cómpre crealo usando a utilidade wpa_passphrase.

Para facelo, execute o comando:

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

onde SSID é o nome do seu punto de acceso, o contrasinal é o contrasinal e wlp6s0 — o nome da súa interface sen fíos.

Inicializa a interface virtual para tun2socks

Crea un ficheiro para inicializar unha nova interface virtual no sistema/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • nome é o nome que systemd-networkd asignará á futura interface virtual cando se inicialice.
  • Neno é un tipo de interface virtual. Polo nome do servizo tun2socks, podes adiviñar que usa unha interface como tun.
  • netdev é a extensión dos ficheiros que systemd-networkd Utilízase para inicializar interfaces de rede virtuais. O enderezo e outros axustes de rede para estas interfaces especifícanse en .red-arquivos.

Crea un ficheiro coma este /etc/systemd/network/25-tun2socks.network co seguinte contido:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name — o nome da interface virtual que especificaches netdev- arquivo.
  • Address — Enderezo IP que se asignará á interface virtual. Debe estar na mesma rede que o enderezo que especificaches no servizo tun2socks
  • Gateway - Enderezo IP do "router" tun2socks, que especificaches ao crear o servizo systemd.

Entón, a interface tun2socks ten un enderezo 172.16.1.2, e o servizo tun2socks - 172.16.1.1, é dicir, é a porta de entrada para todas as conexións desde a interface virtual.

Configurar un punto de acceso virtual

Instalar dependencias:

apt install util-linux procps hostapd iw haveged

Descarga o repositorio crear_ap ao teu coche:

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

Vaia ao cartafol do repositorio da súa máquina:

cd create_ap

Instalar no sistema:

make install

Aparecerá unha configuración no seu sistema /etc/create_ap.conf. Aquí están as principais opcións de edición:

  • GATEWAY=10.0.0.1 — é mellor que sexa unha subrede reservada separada.
  • NO_DNS=1 - desactivar, xa que este parámetro será xestionado pola interface virtual systemd-networkd.
  • NO_DNSMASQ=1 - apágalo polo mesmo motivo.
  • WIFI_IFACE=wlp6s0 - Interface sen fíos do portátil.
  • INTERNET_IFACE=tun2socks - unha interface virtual creada para tun2socks.
  • SSID=hostapd — nome do punto de acceso virtual.
  • PASSPHRASE=12345678 - contrasinal.

Non esquezas activar o servizo:

systemctl enable create_ap

Activa o servidor DHCP en systemd-networkd

Servizo create_ap inicializa unha interface virtual no sistema ap0. En teoría, dnsmasq colócase nesta interface, pero por que instalar servizos adicionais se systemd-networkd contén un servidor DHCP incorporado?

Para habilitalo, definiremos a configuración de rede para o punto virtual. Para iso, cree un ficheiro /etc/systemd/network/25-ap0.network co seguinte contido:

[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

Despois de que o servizo create_ap inicialice a interface virtual ap0, systemd-networkd asignaralle automaticamente un enderezo IP e activará o servidor DHCP.

Cordas EmitDNS=yes и DNS=10.0.0.1 transmitir a configuración do servidor DNS aos dispositivos conectados ao punto de acceso.

Se non pensas usar un servidor DNS local, no meu caso é dnscrypt-proxy, podes instalar DNS=10.0.0.1 в DNS=192.168.1.1onde 192.168.1.1 — o enderezo da súa pasarela orixinal. A continuación, as solicitudes de DNS para o teu anfitrión e rede local non se cifrarán a través dos servidores do provedor.

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

O mesmo pasa coa liña NTP=10.0.0.1.

Instalar e configurar o servidor NTP

Instalar no sistema:

apt install ntp

Edita a configuración /etc/ntp.conf. Comenta os enderezos dos 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

Engade enderezos de servidor público, por exemplo 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 ao servidor aos clientes da súa rede:

restrict 10.0.0.0 mask 255.255.255.0

Activa a transmisión á túa rede:

broadcast 10.0.0.255

Finalmente, engade os enderezos destes servidores á táboa de enrutamento estático. Para iso, abra o ficheiro de configuración da interface sen fíos /etc/systemd/network/25-wlp6s0.network e engadir ao final da 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

Podes descubrir os enderezos dos teus servidores NTP usando a utilidade host do seguinte xeito:

host time1.google.com

Instala dnscrypt-proxy, elimina anuncios e oculta o tráfico DNS do teu provedor

apt install dnscrypt-proxy

Para atender consultas DNS do host e da rede local, edite o socket /lib/systemd/system/dnscrypt-proxy.socket. Cambia as seguintes liñas:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Reiniciar systemd:

systemctl daemon-reload

Edita a configuración /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Para enrutar as conexións dnscrypt-proxy a través de tun2socks, engade a continuación:

force_tcp = true

Edita a configuración /etc/resolv.conf, que lle indica ao servidor DNS ao servidor.

nameserver 127.0.0.1
nameserver 192.168.1.1

A primeira liña permite o uso de dnscrypt-proxy, a segunda liña usa a pasarela orixinal no caso de que o servidor dnscrypt-proxy non estea dispoñible.

Feito!

Reinicie ou deixe de executar os servizos de rede:

systemctl stop networking NetworkManager NetworkManager-wait-online

E reinicia todo o necesario:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Despois dun reinicio ou reinicio, terá un segundo punto de acceso que encamiña o host e os dispositivos LAN a SOCKS.

Este é o aspecto da saída 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

Como resultado,

  1. O provedor só ve a conexión cifrada co teu servidor SOCKS, o que significa que non ve nada.
  2. E aínda así ve as túas solicitudes NTP, para evitar isto, elimina as rutas estáticas para os servidores NTP. Non obstante, non é seguro que o seu servidor SOCKS permita o protocolo NTP.

Muleta vista en Debain 10

Se tentas reiniciar o servizo de rede desde a consola, fallará cun erro. Isto débese a que parte dela en forma de interface virtual está ligada ao servizo tun2socks, o que significa que se usa. Para reiniciar o servizo de rede, primeiro debes deter o servizo tun2socks. Pero, creo que, se le ata o final, definitivamente non é un problema para ti!

referencias

  1. Enrutamento estático en Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: este script crea un punto de acceso WiFi NATed ou Bridged.
  5. dnscrypt-proxy 2 — Un proxy DNS flexible, con soporte para protocolos DNS cifrados.

Fonte: www.habr.com