ProHoster > Blog > administração > Configurando o BGP para ignorar o bloqueio ou "Como parei de ter medo e me apaixonei pelo RKN"
Configurando o BGP para ignorar o bloqueio ou "Como parei de ter medo e me apaixonei pelo RKN"
Bem, ok, sobre “amado” é um exagero. Em vez disso, “foi capaz de coexistir”.
Como todos sabem, desde 16 de abril de 2018, Roskomnadzor vem bloqueando o acesso a recursos na Internet de forma extremamente ampla, acrescentando ao “Registro Unificado de nomes de domínio, índices de páginas de sites na Internet e endereços de rede que permitem identificar sites na Internet”, contendo informações cuja distribuição é proibida na Federação Russa” (no texto - apenas um registro) até /10 às vezes. Como resultado, os cidadãos da Federação Russa e as empresas estão a sofrer, tendo perdido o acesso aos recursos totalmente legais de que necessitam.
Depois de eu ter dito nos comentários a um dos artigos sobre Habré que estava pronto para ajudar as vítimas a criar um esquema de bypass, várias pessoas vieram ter comigo pedindo essa ajuda. Quando tudo funcionou para eles, um deles recomendou descrever a técnica em um artigo. Depois de pensar um pouco, decidi quebrar o silêncio no site e tentar pela primeira vez escrever algo intermediário entre um projeto e uma postagem no Facebook, ou seja, habrapost. O resultado está na sua frente.
Aviso Legal
Como não é muito legal publicar formas de contornar o bloqueio de acesso a informações proibidas no território da Federação Russa, o objetivo deste artigo será falar sobre um método que permite automatizar o acesso a recursos permitidos no território da Federação Russa, mas devido às ações de outra pessoa não estão diretamente acessíveis através do seu provedor. E o acesso a outros recursos obtidos como resultado das ações do artigo é um efeito colateral infeliz e não é de forma alguma o objetivo do artigo.
Além disso, como sou principalmente um arquiteto de redes por profissão, vocação e trajetória de vida, programação e Linux não são meus pontos fortes. Portanto, é claro, os scripts podem ser escritos melhor, as questões de segurança no VPS podem ser trabalhadas mais profundamente, etc. Suas sugestões serão aceitas com gratidão, desde que sejam suficientemente detalhadas - terei prazer em adicioná-las ao texto do artigo.
TL, DR
Automatizamos o acesso aos recursos através do seu túnel existente usando uma cópia do registro e do protocolo BGP. O objetivo é remover todo o tráfego endereçado aos recursos bloqueados para dentro do túnel. Explicações mínimas, principalmente instruções passo a passo.
O que você precisa para isso?
Infelizmente, este post não é para todos. Para utilizar esta técnica, você precisará juntar vários elementos:
Você deve ter um servidor Linux em algum lugar fora do campo de bloqueio. Ou pelo menos o desejo de ter um servidor assim - felizmente ele agora custa a partir de US$ 9/ano, e possivelmente menos. O método também é adequado se você tiver um túnel VPN separado, então o servidor pode estar localizado dentro do campo de bloqueio.
Seu roteador deve ser inteligente o suficiente para poder
qualquer cliente VPN de sua preferência (prefiro OpenVPN, mas pode ser PPTP, L2TP, GRE+IPSec ou qualquer outra opção que crie uma interface de túnel);
Protocolo BGPv4. O que significa que para SOHO pode ser Mikrotik ou qualquer roteador com OpenWRT/LEDE/firmware personalizado semelhante que permita instalar Quagga ou Bird. Usar um roteador de PC também não é proibido. No caso de uma empresa, procure suporte BGP na documentação do seu roteador de borda.
Você deve ter conhecimento do uso do Linux e das tecnologias de rede, incluindo o protocolo BGP. Ou pelo menos quero ter essa ideia. Como desta vez não estou pronto para abraçar a imensidão, você terá que estudar por conta própria alguns aspectos que são incompreensíveis para você. No entanto, é claro que responderei a perguntas específicas nos comentários e é improvável que seja o único a responder, então não hesite em perguntar.
Pastas de trabalho - como estamos trabalhando como root, quase tudo estará localizado na pasta inicial do root. Respectivamente:
/root/blacklist - pasta de trabalho com o script de compilação
/root/zi – cópia do registro do github
/etc/bird - pasta padrão para configurações de serviço de pássaros
O endereço IP externo do VPS com o servidor de roteamento e o ponto de terminação do túnel é 194.165.22.146, ASN 64998; endereço IP externo do roteador - 81.177.103.94, ASN 64999
Os endereços IP dentro do túnel são 172.30.1.1 e 172.30.1.2, respectivamente.
Claro, você pode usar quaisquer outros roteadores, sistemas operacionais e produtos de software, ajustando a solução à sua lógica.
Resumidamente - a lógica da solução
Ações preparatórias
Obtendo um VPS
Levantando um túnel do roteador para o VPS
Recebemos e atualizamos regularmente uma cópia do registro
Instalando e configurando o serviço de roteamento
Criamos uma lista de rotas estáticas para o serviço de roteamento com base no registro
Conectamos o roteador ao serviço e configuramos o envio de todo o tráfego pelo túnel.
A solução real
Ações preparatórias
Existem muitos serviços na Internet que oferecem VPS a preços extremamente razoáveis. Até agora encontrei e estou usando a opção de US$ 9/ano, mas mesmo que você não se preocupe muito, há muitas opções de 1E/mês em cada esquina. A questão de escolher um VPS está muito além do escopo deste artigo, então se alguém não entendeu algo sobre isso, pergunte nos comentários.
Se você usa um VPS não apenas para o serviço de roteamento, mas também para encerrar um túnel nele, você precisa aumentar esse túnel e, quase certamente, configurar o NAT para ele. Há um grande número de instruções sobre essas ações na Internet, não vou repeti-las aqui. O principal requisito para tal túnel é que ele crie uma interface separada em seu roteador que suporte o túnel para o VPS. As tecnologias VPN mais utilizadas atendem a esse requisito - por exemplo, OpenVPN no modo tun é perfeito.
Obtendo uma cópia do registro
Como disse Jabrail: “Aquele que nos atrapalha nos ajudará”. Como o RKN está criando um cadastro de recursos proibidos, seria um pecado não utilizar esse cadastro para resolver nosso problema. Receberemos uma cópia do registro do github.
Vamos para o seu servidor Linux, entramos no contexto raiz (sudo su —) e instale o git se ainda não estiver instalado.
apt install git
Vá para o seu diretório inicial e retire uma cópia do registro.
cd ~ && git clone --depth=1 https://github.com/zapret-info/z-i
Configuramos uma atualização do cron (faço isso uma vez a cada 20 minutos, mas você pode escolher qualquer intervalo de seu interesse). Para fazer isso lançamos crontab -e e adicione a seguinte linha a ele:
*/20 * * * * cd ~/z-i && git pull && git gc
Conectamos um gancho que criará arquivos para o serviço de roteamento após atualizar o registro. Para fazer isso, crie um arquivo /root/zi/.git/hooks/post-merge com o seguinte conteúdo:
Criaremos o script makebgp ao qual o gancho se refere um pouco mais tarde.
Instalando e configurando um serviço de roteamento
Instale o pássaro. Infelizmente, a versão do bird atualmente postada nos repositórios do Ubuntu é comparável em frescor às fezes do Archaeopteryx, então precisamos primeiro adicionar o PPA oficial dos desenvolvedores de software ao sistema.
Depois disso, desabilitamos imediatamente o bird para IPv6 - não precisaremos dele nesta instalação.
systemctl stop bird6
systemctl disable bird6
Abaixo está um arquivo de configuração minimalista do serviço Bird (/etc/bird/bird.conf), o que é suficiente para nós (e lembro mais uma vez que ninguém proíbe desenvolver e ajustar a ideia para atender às suas próprias necessidades)
log syslog all;
router id 172.30.1.1;
protocol kernel {
scan time 60;
import none;
# export all; # Actually insert routes into the kernel routing table
}
protocol device {
scan time 60;
}
protocol direct {
interface "venet*", "tun*"; # Restrict network interfaces it works with
}
protocol static static_bgp {
import all;
include "pfxlist.txt";
#include "iplist.txt";
}
protocol bgp OurRouter {
description "Our Router";
neighbor 81.177.103.94 as 64999;
import none;
export where proto = "static_bgp";
local as 64998;
passive off;
multihop;
}
ID do roteador - identificador do roteador, que se parece visualmente com um endereço IPv4, mas não é um. No nosso caso, pode ser qualquer número de 32 bits no formato de endereço IPv4, mas é uma boa ideia indicar exatamente o endereço IPv4 do seu dispositivo (neste caso, VPS).
protocol direct define quais interfaces funcionarão com o processo de roteamento. O exemplo fornece alguns nomes de exemplo, você pode adicionar outros. Você pode simplesmente deletar a linha; neste caso, o servidor escutará todas as interfaces disponíveis com endereço IPv4.
protocolo estático é a nossa mágica que carrega listas de prefixos e endereços IP (que na verdade são prefixos /32, é claro) de arquivos para anúncio subsequente. A origem dessas listas será discutida abaixo. Observe que o carregamento de endereços IP é comentado por padrão, a razão para isso é o grande volume de upload. Para efeito de comparação, no momento em que este artigo foi escrito, havia 78 linhas na lista de prefixos e 85898 na lista de endereços IP. Recomendo fortemente iniciar e depurar apenas na lista de prefixos e ativar ou não o carregamento de IP em o futuro depende de você decidir depois de experimentar seu roteador. Nem todos eles conseguem digerir facilmente 85 mil entradas na tabela de roteamento.
O protocolo BGP, na verdade, configura o peering BGP com seu roteador. O endereço IP é o endereço da interface externa do roteador (ou o endereço da interface do túnel no lado do roteador), 64998 e 64999 são os números dos sistemas autônomos. Neste caso, eles podem ser atribuídos na forma de quaisquer números de 16 bits, mas é uma boa prática usar números AS do intervalo privado definido pela RFC6996 - 64512-65534 inclusive (existe um formato para ASNs de 32 bits, mas no nosso caso isso é definitivamente um exagero). A configuração descrita utiliza peering eBGP, em que os números dos sistemas autônomos do serviço de roteamento e do roteador devem ser diferentes.
Como você pode ver, o serviço precisa saber o endereço IP do roteador, portanto, se você tiver um endereço privado (RFC1918) ou compartilhado (RFC6598) dinâmico ou não roteável, não terá a opção de aumentar o peering no externo. interface, mas o serviço ainda funcionará dentro do túnel.
Também está bastante claro que, a partir de um serviço, você pode fornecer rotas para vários roteadores diferentes - basta duplicar as configurações deles, copiando a seção do protocolo BGP e alterando o endereço IP do vizinho. É por isso que o exemplo mostra as configurações de peering fora do túnel como as mais universais. É fácil removê-los do túnel alterando os endereços IP nas configurações de acordo.
Processando o registro para o serviço de roteamento
Agora precisamos, de fato, criar listas de prefixos e endereços IP, que foram mencionados no protocolo estático na etapa anterior. Para fazer isso, pegamos o arquivo de registro e dele criamos os arquivos que precisamos usando o seguinte script, colocado em /root/lista negra/makebgp
Agora você pode executá-lo manualmente e observar a aparência dos arquivos em /etc/bird.
Provavelmente, o bird não está funcionando para você neste momento, porque na etapa anterior você pediu para ele procurar arquivos que ainda não existiam. Portanto, lançamos e verificamos se foi iniciado:
systemctl start bird
birdc show route
A saída do segundo comando deve mostrar cerca de 80 registros (isso é por enquanto, mas na hora de configurar tudo vai depender do zelo do RKN em bloquear redes) mais ou menos assim:
mostrará o status dos protocolos dentro do serviço. Até que você tenha configurado o roteador (veja o próximo ponto), o protocolo OurRouter estará no estado inicial (fase Conectada ou Ativa) e após uma conexão bem-sucedida irá para o estado ativo (fase Estabelecida). Por exemplo, no meu sistema a saída deste comando é assim:
BIRD 1.6.3 ready.
name proto table state since info
kernel1 Kernel master up 2018-04-19
device1 Device master up 2018-04-19
static_bgp Static master up 2018-04-19
direct1 Direct master up 2018-04-19
RXXXXXx1 BGP master up 13:10:22 Established
RXXXXXx2 BGP master up 2018-04-24 Established
RXXXXXx3 BGP master start 2018-04-22 Connect Socket: Connection timed out
RXXXXXx4 BGP master up 2018-04-24 Established
RXXXXXx5 BGP master start 2018-04-24 Passive
Conectando um roteador
Provavelmente todo mundo está cansado de ler este calçado, mas anime-se - o fim está próximo. Além disso, nesta seção não poderei dar instruções passo a passo - serão diferentes para cada fabricante.
No entanto, posso mostrar alguns exemplos. A lógica principal é aumentar o peering BGP e atribuir nexthop a todos os prefixos recebidos, apontando para o nosso túnel (se precisarmos enviar tráfego através de uma interface p2p) ou para o endereço IP do nexthop se o tráfego for para Ethernet).
Por exemplo, no Mikrotik no RouterOS isso é resolvido da seguinte forma
router bgp 64999
neighbor 194.165.22.146 remote-as 64998
neighbor 194.165.22.146 route-map BGP_NEXT_HOP in
neighbor 194.165.22.146 ebgp-multihop 250
!
route-map BGP_NEXT_HOP permit 10
set ip next-hop 172.30.1.1
Se o mesmo túnel for usado tanto para peering BGP quanto para transmissão de tráfego útil, não é necessário configurar o nexthop; ele será configurado corretamente usando o protocolo. Mas se você configurá-lo manualmente, também não piorará as coisas.
Nas outras plataformas você terá que descobrir a configuração sozinho, mas se tiver alguma dificuldade escreva nos comentários, tentarei ajudar.
Após o início da sua sessão BGP, as rotas para grandes redes chegaram e estão instaladas na tabela, o tráfego fluiu para os endereços delas e a felicidade está próxima, você pode retornar ao serviço bird e tentar descomentar a entrada que conecta o lista de endereços IP, execute depois disso
systemctl reload bird
e veja como seu roteador transferiu essas 85 mil rotas. Esteja preparado para desconectar e pensar no que fazer com isso :)
No total
Teoricamente, depois de concluir as etapas descritas acima, você agora tem um serviço que redireciona automaticamente o tráfego para endereços IP proibidos na Federação Russa, passando pelo sistema de filtragem.
É claro que pode ser melhorado. Por exemplo, é muito fácil resumir uma lista de endereços IP usando soluções Perl ou Python. Um script Perl simples fazendo isso usando Net::CIDR::Lite transforma 85 mil prefixos em 60 (não mil), mas, é claro, cobre uma faixa muito maior de endereços do que o bloqueado.
Como o serviço opera no terceiro nível do modelo ISO/OSI, ele não evitará o bloqueio de um site/página se ele resolver para o endereço errado conforme registrado no registro. Mas junto com o registro chega o arquivo nxdomain.txt do github, que com alguns traços do script facilmente se transforma em uma fonte de endereços para, por exemplo, o plugin SwitchyOmega no Chrome.
Também é necessário mencionar que a solução requer refinamentos adicionais se você não for apenas um usuário da Internet, mas também publicar alguns recursos por conta própria (por exemplo, um site ou servidor de e-mail roda nesta conexão). Utilizando os meios do roteador, é necessário vincular estritamente o tráfego de saída deste serviço ao seu endereço público, caso contrário você perderá a conectividade com os recursos que estão cobertos pela lista de prefixos recebidos pelo roteador.
Se você tiver alguma dúvida, pergunte, estou pronto para responder.
Atualização. Obrigado Navion и TerAnYu para parâmetros para git que permitem reduzir volumes de download.
UPD2. Colegas, parece que cometi um erro ao não adicionar ao artigo instruções para configurar um túnel entre o VPS e o roteador. Muitas questões são levantadas por isso.
Por precaução, observo mais uma vez que antes de iniciar este guia, você já configurou um túnel VPN na direção necessária e verificou sua funcionalidade (por exemplo, direcionando o tráfego para lá por padrão ou estaticamente). Se você ainda não concluiu esta fase, não faz muito sentido seguir os passos do artigo. Ainda não tenho meu próprio texto sobre isso, mas se você pesquisar no Google “configurando um servidor OpenVPN” junto com o nome do sistema operacional instalado no VPS, e “configurando um cliente OpenVPN” com o nome do seu roteador , você provavelmente encontrará vários artigos sobre esse assunto, inclusive no Habré.
UPD3. Não sacrificado Escrevi um código que transforma dump.csv em um arquivo resultante para bird com resumo opcional de endereços IP. Portanto, a seção “Processando o registro do serviço de roteamento” pode ser substituída pela chamada do seu programa. https://habr.com/post/354282/#comment_10782712
UPD4. Um pouco de trabalho nos erros (não os adicionei ao texto):
1) em vez disso systemctl recarregar pássaro faz sentido usar o comando configurar pássaro.
2) no roteador Mikrotik, ao invés de mudar o nexthop para o IP do segundo lado do túnel /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Definir nexthop» set-in-nexthop=172.30.1.1 faz sentido especificar a rota diretamente para a interface do túnel, sem endereço /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Definir nexthop» set-in-nexthop-direct=<nome da interface>
UPD5. Um novo serviço apareceu https://antifilter.download, de onde você pode obter listas prontas de endereços IP. Atualizado a cada meia hora. Do lado do cliente, resta enquadrar os registros com a correspondente “rota...rejeitar”.
E neste ponto, provavelmente, basta irritar sua avó e atualizar o artigo.
UPD6. Uma versão revisada do artigo para quem não quer descobrir, mas quer começar - aqui.