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:

  1. 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.
  2. 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.
  3. 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.

O que é usado no exemplo

  • Uma cópia do registro - de https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • Serviço de roteamento - pássaro 1.6.3   
  • Roteador - Mikrotik hAP-ac
  • 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.

Configurando o BGP para ignorar o bloqueio ou "Como parei de ter medo e me apaixonei pelo RKN"

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

  1. Ações preparatórias
    1. Obtendo um VPS
    2. Levantando um túnel do roteador para o VPS
  2. Recebemos e atualizamos regularmente uma cópia do registro
  3. Instalando e configurando o serviço de roteamento
  4. Criamos uma lista de rotas estáticas para o serviço de roteamento com base no registro
  5. 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:

#!/usr/bin/env bash
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
check_run() {
    echo "$changed_files" | grep --quiet "$1" && eval "$2"
}
check_run dump.csv "/root/blacklist/makebgp"

e não se esqueça de torná-lo executável

chmod +x /root/z-i/.git/hooks/post-merge

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.

add-apt-repository ppa:cz.nic-labs/bird
apt update
apt install bird

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

#!/bin/bash
cut -d";" -f1 /root/z-i/dump.csv| tr '|' 'n' |  tr -d ' ' > /root/blacklist/tmpaddr.txt
cat /root/blacklist/tmpaddr.txt | grep / | sed 's_.*_route & reject;_' > /etc/bird/pfxlist.txt
cat /root/blacklist/tmpaddr.txt | sort | uniq | grep -Eo "([0-9]{1,3}[.]){3}[0-9]{1,3}" | sed 's_.*_route &/32 reject;_' > /etc/bird/iplist.txt
/etc/init.d/bird reload
logger 'bgp list compiled'

Não se esqueça de torná-lo executável

chmod +x /root/blacklist/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:

54.160.0.0/12      unreachable [static_bgp 2018-04-19] * (200)

Equipe

birdc show protocol

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

/routing bgp instance set default as=64999 ignore-as-path-len=yes router-id=172.30.1.2
/routing bgp peer add in-filter=dynamic-in multihop=yes name=VPS remote-address=194.165.22.146 remote-as=64998 ttl=default
/routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1

e no Cisco IOS - assim

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.

Fonte: habr.com

Adicionar um comentário