Construindo um roteador em SOCKS em um laptop com Debian 10

Por um ano (ou dois) adiei a publicação deste artigo pelo motivo principal - já havia publicado dois artigos nos quais descrevia o processo de criação de um roteador em SOCKS a partir de um laptop muito comum com Debian.

No entanto, desde então a versão estável do Debian foi atualizada para Buster, um número suficiente de pessoas me contatou em particular pedindo ajuda com a configuração, o que significa que meus artigos anteriores não são exaustivos. Bem, eu mesmo adivinhei que os métodos descritos neles não revelam totalmente todos os meandros da configuração do Linux para roteamento em SOCKS. Além disso, eles foram escritos para Debian Stretch, e após atualizar para Buster, no sistema init do systemd, notei pequenas mudanças na interação dos serviços. E nos próprios artigos não usei o systemd-networkd, embora seja mais adequado para configurações de rede complexas.

Além das alterações acima, os seguintes serviços foram adicionados à minha configuração: hostapd - serviço para virtualização de pontos de acesso, ntp para sincronizar a hora dos clientes da rede local, proxy dnscrypt criptografar conexões via DNS e desabilitar publicidade em clientes da rede local, e também, como mencionei anteriormente, Systemd-Networkd para configurar interfaces de rede.

Aqui está um diagrama de blocos simples da estrutura interna desse roteador.

Construindo um roteador em SOCKS em um laptop com Debian 10

Então, deixe-me lembrá-lo quais são os objetivos desta série de artigos:

  1. Roteie todas as conexões do sistema operacional para SOCKS, bem como conexões de todos os dispositivos na mesma rede que o laptop.
  2. O laptop, no meu caso, deve permanecer totalmente móvel. Ou seja, dar a oportunidade de utilizar o ambiente desktop e não ficar preso a um local físico.
  3. O último ponto implica conexão e roteamento apenas através da interface sem fio integrada.
  4. Bem, e claro, a criação de um guia completo, bem como uma análise das tecnologias relevantes, com o melhor do meu modesto conhecimento.

O que será abordado neste artigo:

  1. git - baixar repositórios de projetos tun2socksnecessário para rotear o tráfego TCP para SOCKS, e criar_ap — um script para automatizar a configuração de um ponto de acesso virtual usando hostapd.
  2. tun2socks — crie e instale o serviço systemd no sistema.
  3. Systemd-Networkd — configurar interfaces virtuais e sem fio, tabelas de roteamento estático e redirecionamento de pacotes.
  4. criar_ap — instale o serviço systemd no sistema, configure e inicie um ponto de acesso virtual.

Etapas opcionais:

  • ntp — instalar e configurar um servidor para sincronizar a hora em clientes de ponto de acesso virtual.
  • proxy dnscrypt — criptografaremos as solicitações de DNS, encaminharemos para SOCKS e desabilitaremos domínios de publicidade para a rede local.

Por que tudo isso?

Esta é uma das maneiras de proteger conexões TCP em uma rede local. A principal vantagem é que todas as conexões são feitas em SOCKS, a menos que uma rota estática seja construída para elas através do gateway original. Isso significa que você não precisa especificar as configurações do servidor SOCKS para programas individuais ou clientes na rede local - todos eles vão para o SOCKS por padrão, já que é o gateway padrão até que indiquemos o contrário.

Essencialmente, adicionamos um segundo roteador de criptografia como um laptop na frente do roteador original e usamos a conexão de Internet do roteador original para as solicitações SOCKS já criptografadas do laptop, que por sua vez roteia e criptografa as solicitações dos clientes da LAN.

Do ponto de vista do provedor, estamos constantemente conectados a um servidor com tráfego criptografado.

Assim, todos os dispositivos estão conectados ao ponto de acesso virtual do laptop.

Instale tun2socks no sistema

Desde que sua máquina tenha internet, baixe todas as ferramentas necessárias.

apt update
apt install git make cmake

Baixe o pacote badvpn

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

Uma pasta aparecerá em seu sistema badvpn. Crie uma pasta separada para a compilação

mkdir badvpn-build

cd badvpn-build

Colete tun2socks

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

Instalar no sistema

make install
  • Parâmetro -DBUILD_NOTHING_BY_DEFAULT=1 desativa a construção de todos os componentes do repositório badvpn.
  • -DBUILD_TUN2SOCKS=1 inclui um componente na montagem tun2socks.
  • make install — instalará o binário tun2socks em seu sistema em /usr/local/bin/badvpn-tun2socks.

Instale o serviço tun2socks no systemd

Crie um arquivo /etc/systemd/system/tun2socks.service com o seguinte conteúdo:

[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 - leva o nome da interface virtual que inicializamos com systemd-networkd.
  • --netif-ipaddr — o endereço de rede do “roteador” tun2socks ao qual a interface virtual está conectada. É melhor separar sub-rede reservada.
  • --socks-server-addr - aceita soquete (адрес:порт servidores SOCKS).

Se o seu servidor SOCKS exigir autenticação, você poderá especificar os parâmetros --username и --password.

Em seguida, registre o serviço

systemctl daemon-reload

E ligue-o

systemctl enable tun2socks

Antes de iniciar o serviço, iremos fornecer-lhe uma interface de rede virtual.

Mudando para systemd-networkd

Ligar systemd-networkd:

systemctl enable systemd-networkd

Desative os serviços de rede atuais.

systemctl disable networking NetworkManager NetworkManager-wait-online
  • NetworkManager-espera-online é um serviço que espera por uma conexão de rede funcional antes que o systemd continue a iniciar outros serviços que dependem da presença de uma rede. Estamos desabilitando-o quando mudamos para o análogo systemd-networkd.

Vamos habilitá-lo imediatamente:

systemctl enable systemd-networkd-wait-online

Configure a interface de rede sem fio

Crie um arquivo de configuração systemd-networkd para a interface de rede sem fio /etc/systemd/network/25-wlp6s0.network.

[Match]
Name=wlp6s0

[Network]
Address=192.168.1.2/24
IPForward=yes
  • Nome é o nome da sua interface sem fio. Identifique-o com o comando ip a.
  • IPForward - uma diretiva que permite o redirecionamento de pacotes em uma interface de rede.
  • Endereço é responsável por atribuir um endereço IP à interface sem fio. Nós especificamos isso estaticamente porque com a diretiva equivalente DHCP=yes, systemd-networkd cria um gateway padrão no sistema. Assim, todo o tráfego passará pelo gateway original e não pela futura interface virtual em uma sub-rede diferente. Você pode verificar o gateway padrão atual com o comando ip r

Crie uma rota estática para o servidor SOCKS remoto

Se o seu servidor SOCKS não for local, mas remoto, você precisará criar uma rota estática para ele. Para fazer isso, adicione uma seção Route ao final do arquivo de configuração da interface sem fio que você criou com o seguinte conteúdo:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
  • Gateway — este é o gateway padrão ou o endereço do seu ponto de acesso original.
  • Destination — Endereço do servidor SOCKS.

Configure wpa_supplicant para systemd-networkd

systemd-networkd usa wpa_supplicant para conectar-se a um ponto de acesso seguro. Ao tentar "aumentar" a interface wireless, o systemd-networkd inicia o serviço wpa_supplicant@имяOnde nome é o nome da interface sem fio. Se você não usou o systemd-networkd antes deste ponto, provavelmente este serviço está faltando no seu sistema.

Então crie-o com o comando:

systemctl enable wpa_supplicant@wlp6s0

eu usei wlp6s0 como o nome de sua interface sem fio. Seu nome pode ser diferente. Você pode reconhecê-lo com o comando ip l.

Agora o serviço criado wpa_supplicant@wlp6s0 será lançado quando a interface wireless for “levantada”, porém, por sua vez, procurará as configurações de SSID e senha do ponto de acesso no arquivo /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Portanto, você precisa criá-lo usando o utilitário wpa_passphrase.

Para fazer isso, execute o comando:

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

onde SSID é o nome do seu ponto de acesso, senha é a senha e wlp6s0 — o nome da sua interface sem fio.

Inicialize a interface virtual para tun2socks

Crie um arquivo para inicializar uma nova interface virtual no sistema/etc/systemd/network/25-tun2socks.netdev

[NetDev]
Name=tun2socks
Kind=tun
  • Nome é o nome que o systemd-networkd atribuirá à futura interface virtual quando ela for inicializada.
  • Tipo é um tipo de interface virtual. Com base no nome do serviço tun2socks, você pode adivinhar que ele usa uma interface como tun.
  • netdev é a extensão dos arquivos que systemd-networkd Usado para inicializar interfaces de rede virtuais. O endereço e outras configurações de rede para essas interfaces são especificados em .rede-arquivos.

Crie um arquivo como este /etc/systemd/network/25-tun2socks.network com o seguinte conteúdo:

[Match]
Name=tun2socks

[Network]
Address=172.16.1.2/24
Gateway=172.16.1.1
  • Name — o nome da interface virtual que você especificou em netdev-arquivo.
  • Address — Endereço IP que será atribuído à interface virtual. Deve estar na mesma rede que o endereço especificado no serviço tun2socks
  • Gateway — Endereço IP do “roteador” tun2socks, que você especificou ao criar o serviço systemd.

Então a interface tun2socks tem um endereço 172.16.1.2e o serviço tun2socks - 172.16.1.1, ou seja, é o gateway para todas as conexões da interface virtual.

Configure um ponto de acesso virtual

Instale dependências:

apt install util-linux procps hostapd iw haveged

Baixe o repositório criar_ap para o seu carro:

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

Vá para a pasta do repositório em sua máquina:

cd create_ap

Instale no sistema:

make install

Uma configuração aparecerá em seu sistema /etc/create_ap.conf. Aqui estão as principais opções de edição:

  • GATEWAY=10.0.0.1 — é melhor torná-la uma sub-rede reservada separada.
  • NO_DNS=1 - desabilitar, pois este parâmetro será gerenciado pela interface virtual systemd-networkd.
  • NO_DNSMASQ=1 - desligue-o pelo mesmo motivo.
  • WIFI_IFACE=wlp6s0 — interface sem fio para laptop.
  • INTERNET_IFACE=tun2socks - uma interface virtual criada para tun2socks.
  • SSID=hostapd — nome do ponto de acesso virtual.
  • PASSPHRASE=12345678 - senha.

Não se esqueça de ativar o serviço:

systemctl enable create_ap

Habilite o servidor DHCP em systemd-networkd

Serviço create_ap inicializa uma interface virtual no sistema ap0. Em teoria, o dnsmasq depende dessa interface, mas por que instalar serviços extras se o systemd-networkd contém um servidor DHCP integrado?

Para habilitá-lo, definiremos as configurações de rede do ponto virtual. Para fazer isso, crie um arquivo /etc/systemd/network/25-ap0.network com o seguinte conteúdo:

[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

Após o serviço create_ap inicializar a interface virtual ap0, o systemd-networkd atribuirá automaticamente um endereço IP e ativará o servidor DHCP.

Cordas EmitDNS=yes и DNS=10.0.0.1 transmitir as configurações do servidor DNS para dispositivos conectados ao ponto de acesso.

Se você não planeja usar um servidor DNS local - no meu caso é dnscrypt-proxy - você pode instalar DNS=10.0.0.1 в DNS=192.168.1.1Onde 192.168.1.1 — o endereço do seu gateway original. Então, as solicitações de DNS para seu host e rede local não serão criptografadas pelos servidores do provedor.

EmitNTP=yes и NTP=192.168.1.1 transferir configurações NTP.

O mesmo vale para a linha NTP=10.0.0.1.

Instalar e configurar o servidor NTP

Instale no sistema:

apt install ntp

Edite a configuração /etc/ntp.conf. Comente os endereços dos pools padrão:

#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

Adicione endereços de servidores públicos, 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

Forneça acesso ao servidor aos clientes em sua rede:

restrict 10.0.0.0 mask 255.255.255.0

Habilite a transmissão para sua rede:

broadcast 10.0.0.255

Finalmente, adicione os endereços desses servidores à tabela de roteamento estático. Para fazer isso, abra o arquivo de configuração da interface wireless /etc/systemd/network/25-wlp6s0.network e adicione ao final da seção 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

Você pode descobrir os endereços dos seus servidores NTP usando o utilitário host da seguinte maneira:

host time1.google.com

Instale o dnscrypt-proxy, remova anúncios e oculte o tráfego DNS do seu provedor

apt install dnscrypt-proxy

Para atender consultas DNS de host e de rede local, edite o soquete /lib/systemd/system/dnscrypt-proxy.socket. Altere as seguintes linhas:

ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53

Reiniciar systemd:

systemctl daemon-reload

Edite a configuração /etc/dnscrypt-proxy/dnscrypt-proxy.toml:

server_names = ['adguard-dns']

Para rotear conexões dnscrypt-proxy por meio de tun2socks, adicione abaixo:

force_tcp = true

Edite a configuração /etc/resolv.conf, que informa o servidor DNS ao host.

nameserver 127.0.0.1
nameserver 192.168.1.1

A primeira linha permite o uso do dnscrypt-proxy, a segunda linha usa o gateway original caso o servidor dnscrypt-proxy esteja indisponível.

Feito!

Reinicie ou pare de executar os serviços de rede:

systemctl stop networking NetworkManager NetworkManager-wait-online

E reinicie tudo o que for necessário:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Após uma reinicialização ou reinicialização, você terá um segundo ponto de acesso que roteia o host e os dispositivos LAN para o SOCKS.

Esta é a aparência da saída ip a notebook 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 vê apenas a conexão criptografada com o seu servidor SOCKS, o que significa que não vê nada.
  2. E ainda assim ele vê suas solicitações NTP, para evitar isso, remova rotas estáticas para servidores NTP. No entanto, não é certo que o seu servidor SOCKS permita o protocolo NTP.

Muleta vista em Debain 10

Se você tentar reiniciar o serviço de rede a partir do console, ocorrerá uma falha e um erro. Isso se deve ao fato de que parte dela em forma de interface virtual está vinculada ao serviço tun2socks, o que significa que é utilizado. Para reiniciar o serviço de rede, você deve primeiro interromper o serviço tun2socks. Mas acho que se você leu até o fim, isso definitivamente não é um problema para você!

referências

  1. Roteamento estático no Linux - IBM
  2. systemd-networkd.service - Freedesktop.org
  3. Tun2socks · ambrop72/badvpn Wiki · GitHub
  4. oblique/create_ap: Este script cria um ponto de acesso WiFi NATed ou Bridged.
  5. dnscrypt-proxy 2 — Um proxy DNS flexível, com suporte para protocolos DNS criptografados.

Fonte: habr.com