Durante um ano (ou dois), eu hesitei em publicar este artigo por uma razão principal — eu já havia publicado dois artigos nos quais descrevi o processo de criação de um roteador SOCKS usando um laptop comum com Debian.
No entanto, desde então, a versão estável do Debian foi atualizada para o Buster, e recebi numerosas solicitações em particular para ajudar na configuração, o que significa que meus artigos anteriores não são completos. Bem, eu mesmo suspeitava que os métodos descritos neles não revelem todos os detalhes da configuração do Linux para roteamento no SOCKS. Além disso, eles foram escritos para o Debian Stretch, e após a atualização para o Buster, na inicialização do sistema systemd, percebi algumas pequenas mudanças na interação dos serviços. E nos próprios artigos, eu não usei o systemd-networkd, embora esta seja a melhor opção para configurações de rede complexas.
Além das mudanças mencionadas, minha configuração agora inclui serviços como hostapd — serviço para virtualização de ponto de acesso, ntp para sincronização do tempo dos clientes da rede local, dnscrypt-proxy para criptografar conexões usando o protocolo DNS e bloquear anúncios nos clientes da rede local, e também, como mencionei anteriormente, systemd-networkd para configuração de interfaces de rede.
Aqui está um diagrama simples do funcionamento interno de tal roteador.

Então, deixo claro quais são os objetivos desta série de artigos:
- Roteirizar todas as conexões do sistema operacional SOCKS, bem como as conexões de todos os dispositivos na mesma rede que o laptop.
- O laptop no meu caso deve permanecer completamente móvel. Ou seja, deve permitir o uso do ambiente de trabalho e não estar vinculado a uma localização física.
- O último ponto implica conexão e roteamento apenas através da interface sem fio embutida.
- E, claro, criar um guia completo, assim como discutir as tecnologias pertinentes na medida do meu modesto conhecimento.
O que será abordado neste artigo:
- git — vamos baixar os repositórios dos projetos tun2socks, necessário para roteamento de tráfego TCP em SOCKS, e create_ap — um script para automatizar a configuração de um ponto de acesso virtual usando hostapd.
- tun2socks — vamos construir e instalar o serviço systemd no sistema.
- systemd-networkd — vamos configurar as interfaces sem fio e virtuais, as tabelas de roteamento estático e redirecionamento de pacotes.
- create_ap — vamos instalar o serviço systemd no sistema, configurar e iniciar um ponto de acesso virtual.
Passos opcionais:
- ntp — vamos instalar e configurar um servidor para sincronização do tempo nos clientes do ponto de acesso virtual.
- dnscrypt-proxy — vamos criptografar as solicitações DNS, roteá-las em SOCKS e desativar domínios de publicidade para a rede local.
Por que fazer tudo isso?
Esta é uma das maneiras de organizar a proteção das conexões TCP na rede local. A principal vantagem é que todas as conexões vão para SOCKS, a menos que exista uma rota estática construída através do gateway original. Isso significa que não é necessário configurar as definições do servidor SOCKS nem para programas individuais, nem para clientes na rede local — todos eles vão para SOCKS por padrão, já que este é o gateway padrão, até que indiquemos o contrário.
Na prática, estamos adicionando um segundo roteador criptografador como um notebook antes do roteador original e usando a conexão à Internet do roteador original para as solicitações SOCKS já criptografadas do notebook, que, por sua vez, roteia e criptografa as solicitações dos clientes da rede local.
Do ponto de vista do provedor, estamos constantemente conectados a um único servidor com tráfego criptografado.
Consequentemente, todos os dispositivos se conectam ao ponto de acesso virtual do notebook.
Instale o tun2socks no sistema
Enquanto sua máquina tiver internet, baixe todas as ferramentas necessárias.
apt updateapt install git make cmakeBaixe o pacote badvpn
git clone https://github.com/ambrop72/badvpn
Uma pasta chamada badvpnaparecerá no seu sistema. Crie uma pasta separada para a construção
mkdir badvpn-build
Vá para ela
cd badvpn-build
Construa tun2socks
cmake ../badvpn -DBUILD_NOTHING_BY_DEFAULT=1 -DBUILD_TUN2SOCKS=1
Instale no sistema
make install
- Parâmetro
-DBUILD_NOTHING_BY_DEFAULT=1desabilita a construção de todos os componentes do repositório badvpn. - —
DBUILD_TUN2SOCKS=1habilita a construção do componente tun2socks. make install— irá instalar o binário tun2socks no seu sistema no endereço/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— aceita o nome da interface virtual que inicializamos com o systemd-networkd.--netif-ipaddr— o endereço de rede do "roteador" tun2socks, ao qual a interface virtual se conecta. É melhor fazer uma .--socks-server-addr— aceita o socket (endereço:portado servidor SOCKS).
Se o seu servidor SOCKS exigir autenticação, você pode fornecer parâmetros. --username e --password.
Em seguida, registre o serviço
systemctl daemon-reloadE ative
systemctl enable tun2socksAntes de iniciar o serviço, vamos fornecer-lhe uma interface de rede virtual.
Vamos para systemd-networkd
Ativamos systemd-networkd:
systemctl enable systemd-networkdDesative os serviços de rede atuais.
systemctl disable networking NetworkManager NetworkManager-wait-online- NetworkManager-wait-online é um serviço que aguarda a disponibilidade de uma conexão de rede operacional antes que o systemd continue a iniciar outros serviços que dependem da rede. Vamos desativá-lo, pois mudaremos para o equivalente do systemd-networkd.
Vamos ativá-lo agora:
systemctl enable systemd-networkd-wait-onlineConfigure a interface de rede sem fio
Crie um arquivo de configuração do 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 é a diretiva que ativa o reenvio de pacotes na interface de rede.
- Endereço responsável por atribuir um endereço IP à interface sem fio. Definimos isso estaticamente porque, com a diretiva equivalente
DHCP=yes, o 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 comandoip 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 isso, adicione a seção Route no final do arquivo de configuração criado da sua interface sem fio com o seguinte conteúdo:
[Route]
Gateway=192.168.1.1
Destination=0.0.0.0
Gatewayé o gateway padrão ou o endereço do seu ponto de acesso original.Destinoé o endereço do servidor SOCKS.
Configure o wpa_supplicant para o systemd-networkd
O systemd-networkd utiliza o wpa_supplicant para se conectar a um ponto de acesso protegido. Ao tentar "ativar" a interface sem fio, o systemd-networkd inicia o serviço wpa_supplicant@nome, onde nome é o nome da interface sem fio. Se você não utilizou o systemd-networkd até este momento, é provável que esse serviço não esteja presente no seu sistema.
Portanto, crie-o com o comando:
systemctl enable wpa_supplicant@wlp6s0Eu utilizei wlp6s0 como o nome da sua interface sem fio. Seu nome pode ser diferente. Você pode descobrir o nome com o comando ip l.
Agora, o serviço criado wpa_supplicant@wlp6s0 será iniciado quando a interface sem fio for "levantada", no entanto, ela, por sua vez, buscará as configurações de SSID e senha do ponto de acesso no arquivo /etc/wpa_supplicant/wpa_supplicant-wlp6s0. Portanto, é necessário criá-lo com a ferramenta wpa_passphrase.
Para isso, execute o comando:
wpa_passphrase SSID password>/etc/wpa_supplicant/wpa_supplicant-wlp6s0.confonde SSID é o nome do seu ponto de acesso, password é a senha, e wlp6s0 é o nome da sua interface sem fio.
Inicialize a interface virtual para tun2socks
Crie um arquivo para inicializar a 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 for inicializada.
- Kind é o tipo da interface virtual. Com base no nome do serviço tun2socks, você pode deduzir que ele usa uma interface do tipo
tun. - netdev é a extensão de arquivo que
systemd-networkdusa para inicializar interfaces de rede virtuais. O endereço e outras configurações de rede para essas interfaces são especificados nos .network-arquivos.
Crie um arquivo assim /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 netdev-arquivo.Endereçoé o endereço IP que será atribuído à interface virtual. Deve estar na mesma rede que o endereço que você especificou no serviço tun2socksGatewayé o endereço IP "do roteador" tun2socks, que você especificou ao criar o serviço systemd.
Assim, a interface tun2socks tem 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 a partir da interface virtual.
Configure o ponto de acesso virtual
Instale as dependências:
apt install util-linux procps hostapd iw havegedBaixe o repositório create_ap para sua máquina:
git clone https://github.com/oblique/create_apVá para a pasta do repositório na sua máquina:
cd create_apInstale no sistema:
make installSua configuração aparecerá no sistema /etc/create_ap.conf. Aqui estão as principais opções para ajustes:
GATEWAY=10.0.0.1é melhor fazer uma sub-rede reservada separada.NO_DNS=1desative, pois esse parâmetro será gerenciado pela interface virtual systemd-networkd.NO_DNSMASQ=1desative pela mesma razão.WIFI_IFACE=wlp6s0é a interface sem fio do laptop.INTERNET_IFACE=tun2socksé a interface virtual criada para tun2socks.SSID=hostapdé o nome do ponto de acesso virtual.PASSPHRASE=12345678é a senha.
Não se esqueça de habilitar o serviço:
systemctl enable create_apAtive o servidor DHCP no systemd-networkd
O serviço create_ap inicializa a interface virtual ap0Idealmente, o dnsmasq está associado a essa interface, mas por que instalar serviços desnecessários se o systemd-networkd contém um servidor DHCP embutido?
Para ativá-lo, vamos definir as configurações de rede para o ponto de acesso virtual. Para 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
Depois que o serviço create_ap inicializar a interface virtual ap0, o systemd-networkd automaticamente atribuirá um endereço IP a ela e ativará o servidor DHCP.
As linhas EmitDNS=yes e DNS=10.0.0.1 transmitem as configurações do servidor DNS para os dispositivos conectados ao ponto de acesso.
Se você não planeja usar um servidor DNS local — no meu caso, é o dnscrypt-proxy — pode configurar DNS=10.0.0.1 em DNS=192.168.1.1, onde 192.168.1.1 — o endereço do seu gateway original. Assim, as solicitações DNS do seu host e da rede local passarão de forma não criptografada pelos servidores do provedor.
EmitNTP=yes e NTP=192.168.1.1 transmitem as configurações NTP.
O mesmo se aplica à linha NTP=10.0.0.1.
Instale e configure 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 os endereços de servidores públicos, como o Google Public NTP:
server time1.google.com iburst
server time2.google.com iburst
server time3.google.com iburst
server time4.google.com iburst
Permita acesso ao servidor para clientes da sua rede:
restrict 10.0.0.0 mask 255.255.255.0
Habilite a difusão na 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 da interface sem fio /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.12Você pode descobrir os endereços dos seus servidores NTP usando a ferramenta host da seguinte forma:
host time1.google.comInstale o dnscrypt-proxy, remova anúncios e oculte o tráfego DNS do provedor
apt install dnscrypt-proxyPara atender às solicitações DNS do host e da rede local, edite o socket /lib/systemd/system/dnscrypt-proxy.socket. Altere as seguintes linhas:
ListenStream=0.0.0.0:53
ListenDatagram=0.0.0.0:53Reinicie systemd:
systemctl daemon-reloadEdite a configuração /etc/dnscrypt-proxy/dnscrypt-proxy.toml:
server_names = ['adguard-dns']
Para direcionar as conexões do dnscrypt-proxy pelo 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.1A primeira linha ativa o uso do dnscrypt-proxy, a segunda utiliza o gateway original, caso o servidor dnscrypt-proxy não esteja disponível.
Pronto!
Reinicie ou pare os serviços de rede em execução:
systemctl stop networking NetworkManager NetworkManager-wait-onlineE reinicie todos os necessários:
systemctl restart systemd-networkd tun2socks create_ap dnscrypt-proxy ntpApós a reinicialização ou reinício, você terá um segundo ponto de acesso que roteia o host e os dispositivos da rede local para o SOCKS.
Assim é como a saída se parece ip a de um laptop comum:
1: lo: 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: 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: 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: 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: 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,
- O provedor vê apenas a conexão criptografada com seu servidor SOCKS, o que significa que nada é visível.
- E ainda assim ele vê suas requisições NTP; para evitar isso, exclua as rotas estáticas para os servidores NTP. No entanto, não é certo que seu servidor SOCKS permita o protocolo NTP.
Uma solução temporária, notada no Debian 10
Se você tentar reiniciar o serviço de rede a partir do console, ele falhará com um erro. Isso está relacionado ao fato de que parte dele, como a interface virtual, está ligada ao serviço tun2socks, ou seja, está em uso. Para reiniciar o serviço de rede, primeiro você precisa parar o serviço tun2socks. Mas, eu imagino que, se você leu até aqui, isso com certeza não será um problema para você!
Links
Fonte: habr.com
