Construindo um roteador no SOCKS em um laptop com Debian 10

Por um ano inteiro (ou dois) adiei a publicação deste artigo pelo principal motivo - já publiquei dois artigos nos quais descrevi o processo de criação de um roteador no SOCKS a partir de um laptop comum com o Debian.

No entanto, desde então, a versão estável do Debian foi atualizada para o Buster, um número suficiente de pessoas me enviou uma solicitação pessoal para ajudar na configuração, o que significa que meus artigos anteriores não são exaustivos. Bem, eu próprio imaginei que os métodos estabelecidos neles não revelavam completamente todos os meandros da configuração do Linux para roteamento no SOSKS. Além disso, eles foram escritos para o Debian Stretch e, após atualizar para o Buster, no sistema de inicialização do systemd, notei pequenas mudanças na interação dos serviços. Sim, e nos artigos em si, não usei systemd-networkd, embora seja mais adequado para configurações de rede complexas.

Além das alterações acima, serviços como o hostapd foram adicionados à minha configuração - um serviço para virtualização de pontos de acesso, ntp para sincronizar o horário dos clientes da rede local, dnscrypt-proxy para criptografar conexões DNS e desativar a publicidade em clientes da rede local, bem como, como mencionei anteriormente, systemd-networkd para configurar interfaces de rede.

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



Por isso, lembro quais são os objetivos do ciclo desses artigos:

  1. Encaminhe todas as conexões do SO para SOCKS, bem como as conexões de todos os dispositivos que estão na mesma rede que o laptop.
  2. O laptop no meu caso deve permanecer totalmente móvel. Ou seja, para dar a oportunidade de usar o ambiente da área de trabalho e não estar vinculado a um local físico.
  3. O último ponto envolve conectar e rotear somente através da interface sem fio integrada.
  4. Bem, é claro, a criação de um guia exaustivo, bem como a análise de tecnologias apropriadas da melhor forma possível.

O que será considerado neste artigo:

  1. git - faça o download dos repositórios do projeto tun2socks necessários para rotear o tráfego TCP para SOCKS, e create_ap - um script para automatizar a configuração de um ponto de acesso virtual usando o hostapd .
  2. tun2socks - construa e instale o serviço systemd no sistema .
  3. systemd-networkd - configure interfaces virtuais e sem fio, tabelas de roteamento estático e encaminhamento de pacotes.
  4. create_ap - instale o serviço systemd no sistema, configure e inicie o ponto de acesso virtual.

Etapas opcionais:

  • ntp - instale e configure o servidor para sincronizar o tempo nos clientes do ponto de acesso virtual.
  • dnscrypt-proxy - criptografe as consultas DNS, encaminhe-as para SOCKS e desative os domínios de publicidade da rede local.

Por que tudo isso?


Essa é uma maneira de proteger conexões TCP em uma rede local. A principal vantagem é que todas as conexões vão para o SOCKS se uma rota estática através do gateway original não for criada para eles. Isso significa que não é necessário prescrever as configurações do servidor SOCKS para programas ou clientes individuais na rede local - todos eles acessam o SOCKS por padrão, já que é o gateway padrão até especificarmos o oposto.

De fato, adicionamos o segundo roteador de criptografia como um laptop na frente do roteador original e usamos a conexão à 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 rede local.

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

Assim, todos os dispositivos se conectam ao ponto de acesso virtual de um laptop.

Antes que você comece


Quase todas as configurações estão disponíveis no repositório .

Instale tun2socks no sistema


Contanto que você tenha internet na sua máquina, baixe todas as ferramentas necessárias.

apt update

apt install git make cmake

Faça o download do pacote badvpn
git clone https://github.com/ambrop72/badvpn

A pasta badvpn aparecerá no seu sistema . Crie uma pasta de compilação separada

mkdir badvpn-build

Vá para ela

cd badvpn-build

Crie tun2socks

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

Instalar no sistema

make install

  • O parâmetro -DBUILD_NOTHING_BY_DEFAULT = 1 desativa o conjunto de todos os componentes do repositório badvpn .
  • DBUILD_TUN2SOCKS = 1 inclui componentes tun2socks na montagem .
  • make install - instala o binário tun2socks no seu sistema em / usr / local / bin / badvpn-tun2socks.

Instalar o serviço tun2socks no systemd


Crie o 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 - aceita o nome da interface virtual que inicializamos com systemd-networkd .
  • --netif-ipaddr - endereço de rede dos “router” tun2socks ao qual a interface virtual está conectado. É melhor criar uma sub-rede reservada separada .
  • --socks-server-addr - aceita um soquete ( endereço: porta do servidor SOCKS).

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

Em seguida, registre o serviço

systemctl daemon-reload

E ligue

systemctl enable tun2socks

Antes de iniciar o serviço, forneceremos uma interface de rede virtual.

Vá para systemd-networkd


Ative systemd-networkd :

systemctl enable systemd-networkd

Desabilite os serviços de rede atuais.

systemctl disable networking NetworkManager NetworkManager-wait-online

  • O NetworkManager-wait-online é um serviço que aguarda uma conexão de rede em funcionamento antes que o systemd continue a iniciar outros serviços, dependendo da disponibilidade da rede. Nós o desativamos quando mudamos para o sistema analógicod -networkd .

Vamos ligá-lo imediatamente:

systemctl enable systemd-networkd-wait-online

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

  • Nome é o nome da sua interface sem fio. Identifique-o com o comando ip a .
  • IPMasquerade é uma diretiva que inclui mascaramento e encaminhamento de pacotes em uma interface de rede.
  • O endereço é responsável por atribuir um endereço IP à interface sem fio. Nós o especificamos estaticamente porque, com a diretiva equivalente DHCP = yes , systemd-networkd cria um gateway padrão no sistema. Todo o tráfego passará pelo gateway original e não pela futura interface virtual em uma excelente sub-rede. 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 servidor SOCKS não for local, mas remoto, você precisará criar uma rota estática para ele. Para fazer isso, adicione a seção Rota no final do arquivo de configuração sem fio que você criou com o seguinte conteúdo:

[Route]
Gateway=192.168.1.1
Destination=0.0.0.0

  • Gateway é o gateway ou endereço padrão do seu ponto de acesso original.
  • Destino - endereço do servidor SOCKS.

Configurar wpa_supplicant para systemd-networkd


O systemd-networkd usa wpa_supplicant para conectar-se a um ponto de acesso seguro. Quando você tenta "aumentar" a interface sem fio, systemd-networkd inicia o serviço wpa_supplicant @ name , em que name é o nome da interface sem fio. Se você não usou o systemd-networkd antes deste ponto, esse serviço não está disponível no seu sistema.

Portanto, crie-o com o comando:

systemctl enable wpa_supplicant@wlp6s0

Eu usei wlp6s0 como o nome da minha interface sem fio. Seu nome pode ser diferente. Você pode descobrir por sua equipe
ip l
.

Agora, o serviço wpa_supplicant @ wlp6s0 criado será iniciado quando a interface sem fio for "levantada"; no entanto, ela procurará o SSID e a senha do ponto de acesso no arquivo / etc / wpa_supplicant / wpa_supplicant-wlp6s0 . Portanto, você deve 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.

Inicializar 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 systemd-networkd atribuirá à futura interface virtual quando for inicializada.
  • Kind é 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 de arquivo que systemd-networkd usa para inicializar interfaces de rede virtual. O endereço e outras configurações de rede para essas interfaces são especificados nos arquivos .network .

Crie um arquivo /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

  • Nome - o nome da interface virtual que você especificou no arquivo netdev .
  • Endereço - endereço IP a ser atribuído à interface virtual. Deve estar na mesma rede que o endereço especificado em tun2socks
  • Gateway - o endereço IP do tun2 "roteador" especificado por você ao criar o serviço systemd .

Portanto, a interface tun2socks possui o endereço 172.16.1.2 e o serviço tun2socks é 172.16.1.1 , ou seja, é o gateway para todas as conexões da interface virtual.

Configurar um ponto de acesso virtual


Instale as dependências:

apt install util-linux procps hostapd iw haveged

Faça o download do repositório create_ap para sua máquina:

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

O config /etc/create_ap.conf aparecerá no seu sistema . Aqui estão as principais opções para edição:

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

Lembre-se de ativar o serviço:

systemctl enable create_ap

Habilitar servidor DHCP em systemd-networkd


O serviço create_ap inicializa a interface virtual ap0 no sistema . Em teoria, o dnsmasq trava nessa interface , mas por que instalar serviços extras se o systemd-networkd contiver um servidor DHCP interno?

Para habilitá-lo, defina as configurações de rede para o ponto virtual. Para fazer isso, crie o 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 sreate_ap inicializar a interface virtual Ap0 , o systemd-NetworkD atribui automaticamente um endereço IP e ativa o servidor DHCP.

As linhas EmitDNS = yes e DNS = 10.0.0.1 passam 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 definir DNS = 10.0.0.1 como DNS = 192.168.1.1 , em que 192.168.1.1 é o endereço do seu gateway original. Em seguida, as consultas DNS do seu host e da rede local não serão criptografadas pelos servidores do provedor.

EmitNTP = yese NTP = 192.168.1.1 transmitem as configurações de NTP.

O mesmo vale para a linha NTP = 10.0.0.1 .

Instale e configure o servidor NTP


Instale no sistema:

apt install ntp

Edite o arquivo config /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 os endereços dos servidores públicos, por exemplo, NTP público do Google:

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

Conceda acesso ao servidor aos clientes da sua rede:

restrict 10.0.0.0 mask 255.255.255.0

Transforme a transmissão em sua rede:

broadcast 10.0.0.255

Por fim, adicione os endereços desses servidores à tabela de roteamento estático. Para fazer isso, abra o arquivo de configuração sem fio /etc/systemd/network/25-wlp6s0.network e adicione a seção Rota no 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

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 provedor


apt install dnscrypt-proxy

Para atender às consultas DNS do host e da 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 através do tun2socks , adicione abaixo:

force_tcp = true

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

nameserver 127.0.0.1
nameserver 192.168.1.1

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

Feito!


Reinicialize ou pare os serviços de rede existentes:

systemctl stop networking NetworkManager NetworkManager-wait-online

E reinicie todos os necessários:

systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntp

Depois de reiniciar ou reiniciar, você terá um segundo ponto de acesso que roteia o host e os dispositivos de LAN para o SOCKS.

É assim que a saída se parece.
ip a
laptop comum:

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

Eventualmente


  1. O provedor vê apenas a conexão criptografada com o servidor SOCKS, o que significa que ele não vê nada.
  2. E, no entanto, ele vê suas solicitações NTP, para evitar isso, exclua as rotas estáticas dos servidores NTP. No entanto, não é fato que seu servidor SOCKS permita NTP.

Muleta vista em Debain 10


Se você tentar reiniciar o serviço de rede no console, ele falhará com um erro. Isso se deve ao fato de parte dela na forma de uma interface virtual estar vinculada ao serviço tun2socks , o que significa que é usado. Para reiniciar o serviço de rede, você deve primeiro parar o serviço tun2socks . Mas, eu acho, se você ler até o fim, para você definitivamente não é um problema!

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 com NAT ou ponte.
  5. dnscrypt-proxy 2 - Um proxy DNS flexível, com suporte para protocolos DNS criptografados.

All Articles