Configuración de BGP para evitar el bloqueo o "Cómo dejé de tener miedo y me enamoré de RKN"

Bueno, está bien, eso de "se enamoró" es una exageración. Más bien "podría coexistir con".

Como todos saben, desde el 16 de abril de 2018, Roskomnadzor ha estado bloqueando el acceso a los recursos en la red con trazos extremadamente amplios, agregando al Registro Unificado de nombres de dominio, punteros a páginas de sitios en Internet y direcciones de red que le permiten identifique sitios en Internet que contengan información cuya difusión esté prohibida en la Federación Rusa” (en el texto, solo un registro) /10 a veces. Como resultado, los ciudadanos de la Federación Rusa y las empresas sufren, al haber perdido el acceso a los recursos absolutamente legales que necesitan.

Después de que dijera en los comentarios de uno de los artículos sobre Habré que estaba dispuesto a ayudar a las víctimas a establecer un esquema de derivación, varias personas se pusieron en contacto conmigo para pedirme ayuda. Cuando todo les funcionó, uno de ellos recomendó describir la técnica en un artículo. Pensándolo bien, decidí romper mi silencio en el sitio e intentar por una vez escribir algo intermedio entre un proyecto y una publicación en Facebook, es decir. Habrapost. El resultado está frente a ti.

Observación

Dado que publicar formas de eludir el bloqueo del acceso a la información prohibida en el territorio de la Federación Rusa no es muy legal, el propósito de este artículo será hablar sobre un método que le permita automatizar el acceso a los recursos que están permitidos en el territorio de la Federación Rusa, pero que son inaccesibles directamente a través de su proveedor debido a las acciones de alguien. Y el acceso a otros recursos, obtenidos como resultado de las acciones del artículo, es un efecto secundario desafortunado y de ninguna manera es el propósito del artículo.

Además, dado que soy principalmente un arquitecto de redes por profesión, vocación y trayectoria de vida, la programación y Linux no son mis puntos fuertes. Por lo tanto, por supuesto, los scripts se pueden escribir mejor, los problemas de seguridad en VPS se pueden trabajar más profundamente, etc. Sus sugerencias serán aceptadas con gratitud, si son lo suficientemente detalladas. Estaré encantado de agregarlas al texto del artículo.

TL; DR

Automatizamos el acceso a los recursos a través de su túnel existente utilizando una copia del registro y el protocolo BGP. El objetivo es eliminar todo el tráfico dirigido a recursos bloqueados en el túnel. Explicación mínima, en su mayoría instrucciones paso a paso.

¿Qué necesitas para esto?

Desafortunadamente, esta publicación no es para todos. Para utilizar esta técnica, deberá reunir algunos elementos:

  1. Debe tener un servidor Linux en algún lugar fuera del campo de bloqueo. O al menos el deseo de iniciar un servidor de este tipo, ya que ahora cuesta desde $ 9 / año, y posiblemente menos. El método también es adecuado si tiene un túnel VPN separado, entonces el servidor puede ubicarse dentro del campo de bloqueo.
  2. Su enrutador debe ser lo suficientemente inteligente como para poder
    • cualquier cliente VPN que desee (prefiero OpenVPN, pero puede ser PPTP, L2TP, GRE+IPSec y cualquier otra opción que cree una interfaz de túnel);
    • Protocolo BGPv4. Lo que significa que para SOHO puede ser Mikrotik o cualquier enrutador con OpenWRT/LEDE/firmware personalizado similar que le permita instalar Quagga o Bird. El uso de un enrutador de PC tampoco está prohibido. Para una empresa, consulte la documentación de su enrutador de frontera para obtener compatibilidad con BGP.
  3. Debe estar familiarizado con el uso de Linux y las tecnologías de red, incluido BGP. O al menos quiero tener esa idea. Como no estoy listo para abrazar la inmensidad esta vez, tendrás que estudiar algunos puntos que son incomprensibles para ti por tu cuenta. Sin embargo, por supuesto, responderé preguntas específicas en los comentarios y es poco probable que sea el único que responda, así que siéntete libre de preguntar.

Lo que se usa en el ejemplo.

  • copia del registro https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • Servicio de enrutamiento - pájaro 1.6.3   
  • Enrutador - Microtik hAP ac
  • Carpetas de trabajo: dado que estamos trabajando como root, la mayor parte de todo se colocará en la carpeta de inicio raíz. Respectivamente:
    • /root/blacklist - carpeta de trabajo con script de compilación
    • /root/zi - una copia del registro de github
    • /etc/bird - carpeta de configuración estándar del servicio de aves
  • Aceptamos 194.165.22.146, ASN 64998 como la dirección IP externa del VPS con el servidor de enrutamiento y el punto de terminación del túnel; dirección IP externa del enrutador - 81.177.103.94, ASN 64999
  • Las direcciones IP dentro del túnel son 172.30.1.1 y 172.30.1.2, respectivamente.

Configuración de BGP para evitar el bloqueo o "Cómo dejé de tener miedo y me enamoré de RKN"

Por supuesto, puede usar cualquier otro enrutador, sistema operativo y producto de software, ajustando la solución para que se ajuste a su lógica.

Brevemente - la lógica de la solución.

  1. Acciones preparatorias
    1. Conseguir un VPS
    2. Subimos el túnel desde el router hasta el VPS
  2. Obtener y actualizar periódicamente una copia del registro
  3. Instalación y configuración del servicio de enrutamiento
  4. Cree una lista de rutas estáticas para el servicio de enrutamiento según el registro
  5. Conectamos el enrutador al servicio y configuramos el envío de todo el tráfico a través del túnel.

La decisión real

Acciones preparatorias

En la inmensidad de la red hay muchos servicios que ofrecen VPS por un precio extremadamente razonable. Hasta ahora, he encontrado y uso la opción de $9/año, pero incluso si realmente no te molestas, hay muchas opciones por 1E/mes en cada esquina. La cuestión de elegir un VPS va mucho más allá del alcance de este artículo, por lo que si algo no está claro para alguien al respecto, pregunte en los comentarios.

Si usa VPS no solo para el servicio de enrutamiento, sino también para terminar un túnel en él, debe generar este túnel y, casi inequívocamente, configurar NAT para él. Hay una gran cantidad de instrucciones en la red para estas acciones, no las repetiré aquí. El requisito principal para dicho túnel es que debe crear una interfaz separada en su enrutador que admita el túnel hacia el VPS. La mayoría de las tecnologías VPN utilizadas cumplen con este requisito; por ejemplo, OpenVPN en modo tun está bien.

Obtenga una copia del registro

Como dijo Jabrayil, "Aquel que nos estorbe, nos ayudará". Dado que la RKN está creando un registro de recursos prohibidos, sería un pecado no utilizar este registro para solucionar nuestro problema. Recibiremos una copia del registro de github.

Vamos a su servidor Linux, entramos en el contexto de root'a (sudo su-) e instale git si aún no está instalado.

apt install git

Vaya a su directorio de inicio y extraiga una copia del registro.

cd ~ && git clone --depth=1 https://github.com/zapret-info/z-i 

Configure una actualización de cron (lo tengo cada 20 minutos, pero puede elegir cualquier intervalo que le interese). Para ello lanzamos crontab -e y añádele la siguiente línea:

*/20 * * * * cd ~/z-i && git pull && git gc

Conectamos un gancho que creará archivos para el servicio de enrutamiento después de actualizar el registro. Para ello creamos un archivo /root/zi/.git/hooks/post-merge con el siguiente contenido:

#!/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"

y no olvides hacerlo ejecutable

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

El script makebgp al que hace referencia el enlace se creará más tarde.

Instalación y configuración del servicio de enrutamiento

Instalar pájaro. Desafortunadamente, la versión publicada actualmente de bird en los repositorios de Ubuntu es comparable en frescura a las heces de Archaeopteryx, por lo que primero debemos agregar el PPA oficial de los desarrolladores de software al sistema.

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

Después de eso, deshabilitamos inmediatamente bird para IPv6; en esta instalación no lo necesitaremos.

systemctl stop bird6
systemctl disable bird6

A continuación se muestra un archivo de configuración minimalista para el servicio de aves (/etc/bird/bird.conf), que es suficiente para nosotros (y una vez más les recuerdo que nadie prohíbe desarrollar y ajustar la idea para que se adapte a sus propias necesidades)

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 del enrutador: identificador del enrutador, que visualmente parece una dirección IPv4, pero no lo es. En nuestro caso, puede ser cualquier número de 32 bits en formato de dirección IPv4, pero es una buena práctica especificar allí la dirección IPv4 de su dispositivo (en este caso, VPS).

El protocolo directo determina qué interfaces funcionarán con el proceso de enrutamiento. El ejemplo da un par de ejemplos de nombres, puede agregar más. También puede simplemente eliminar la línea, en cuyo caso el servidor escuchará en todas las interfaces disponibles con una dirección IPv4.

El protocolo estático es nuestra magia que carga listas de prefijos y direcciones IP (que son, por supuesto, prefijos /32) de los archivos para un anuncio posterior. De dónde provienen estas listas se discutirá a continuación. Tenga en cuenta que la carga de direcciones IP está comentada de forma predeterminada, la razón de esto es la gran cantidad de carga. A modo de comparación, al momento de escribir el artículo, hay 78 líneas en la lista de prefijos y 85898 en la lista de direcciones IP. Le recomiendo que comience y depure solo en la lista de prefijos, y decida si habilitar o no la carga de IP en el futuro después de experimentar con su enrutador. No todos pueden digerir fácilmente 85 mil entradas en la tabla de enrutamiento.

El protocolo bgp en realidad configura el emparejamiento de bgp con su enrutador. ip-address es la dirección de la interfaz externa del enrutador (o la dirección de la interfaz del túnel desde el costado del enrutador), 64998 y 64999 son los números de los sistemas autónomos. En este caso, se pueden asignar en forma de cualquier número de 16 bits, pero es una buena práctica usar números AS del rango privado definido por RFC6996 - 64512-65534 inclusive (hay un formato ASN de 32 bits, pero en nuestro caso definitivamente es excesivo). La configuración descrita utiliza emparejamiento eBGP, en el que los números de sistema autónomo del servicio de enrutamiento y el enrutador deben ser diferentes.

Como puede ver, el servicio necesita saber la dirección IP del enrutador, por lo que si tiene una dirección privada (RFC1918) o compartida (RFC6598) dinámica o no enrutable, no tiene opción para generar peering en la interfaz externa, pero el servicio seguirá funcionando dentro del túnel.

También es bastante transparente que puede proporcionar varios enrutadores diferentes con rutas de un servicio: simplemente duplique la configuración para ellos copiando la sección bgp del protocolo y cambiando la dirección IP del vecino. Es por eso que el ejemplo muestra la configuración para mirar fuera del túnel como la más universal. No es difícil eliminarlos en el túnel cambiando las direcciones IP en la configuración en consecuencia.

Procesamiento de registro para el servicio de enrutamiento

Ahora necesitamos, de hecho, crear listas de prefijos y direcciones IP, que se mencionan en el paso anterior en el protocolo estático. Para hacer esto, tomamos el archivo de registro y creamos los archivos que necesitamos con el siguiente script, ubicado en /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'

No olvides hacerlo ejecutable.

chmod +x /root/blacklist/makebgp

Ahora puede ejecutarlo manualmente y observar la apariencia de los archivos en /etc/bird.

Lo más probable es que en este momento bird no te funcione, porque en la etapa anterior le sugeriste que buscara archivos que aún no existían. Por tanto, lo lanzamos y controlamos que arranque:

systemctl start bird
birdc show route

La salida del segundo comando debería mostrar alrededor de 80 entradas (esto es en este momento, y cuando lo configure, todo dependerá del celo del ILV en el bloqueo de redes) así:

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

Equipo

birdc show protocol

mostrará el estado de los protocolos dentro del servicio. Hasta que configure el enrutador (vea el siguiente párrafo), el protocolo OurRouter estará en el estado de inicio (fases Conectar o Activo), y después de una conexión exitosa, pasará al estado activo (fase Establecida). Por ejemplo, en mi sistema, el resultado de este comando se ve así:

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

Conexión de enrutador

Probablemente todos ya estén cansados ​​de leer este footcloth, pero anímense, el final está cerca. Además, en esta sección no podré dar instrucciones paso a paso, será diferente para cada fabricante.

Sin embargo, te puedo mostrar un par de ejemplos. La lógica principal es aumentar el emparejamiento BGP y adjuntar nexthop a todos los prefijos recibidos, apuntando a nuestro túnel (si necesita generar tráfico a través de la interfaz p2p) o dirección IP nexthop si el tráfico va a ethernet).

Por ejemplo, en Mikrotik en RouterOS, esto se resuelve de la siguiente manera

/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

y en Cisco IOS - así

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

En el caso de que se utilice el mismo túnel tanto para el peering BGP como para la transmisión de tráfico útil, no es necesario configurar nexthop, se configurará correctamente mediante el protocolo. Pero si lo configura manualmente, tampoco empeorará.

En otras plataformas, tendrá que resolver la configuración usted mismo, pero si tiene alguna dificultad, escriba en los comentarios, intentaré ayudarlo.

Después de que su sesión BGP haya aumentado, las rutas a redes grandes hayan llegado y estén instaladas en la tabla, el tráfico a las direcciones desde ellas se haya ido y la felicidad esté cerca, puede volver al servicio de aves e intentar descomentar la entrada allí que conecta el lista de direcciones IP, ejecutar después de eso

systemctl reload bird

y vea cómo su enrutador transfirió estas 85 mil rutas. Prepárate para apagarlo y piensa qué hacer con él 🙂

En total

En teoría, después de realizar los pasos anteriores, tiene un servicio que redirige automáticamente el tráfico a las direcciones IP prohibidas en la Federación Rusa más allá del sistema de filtrado.

Por supuesto, se puede mejorar. Por ejemplo, es bastante fácil resumir una lista de direcciones IP a través de soluciones Perl o Python. Un script perl simple que hace esto con Net::CIDR::Lite convierte 85 mil prefijos en 60 (no mil), pero naturalmente cubre un rango de direcciones mucho mayor que el que está bloqueado.

Dado que el servicio opera en el tercer nivel del modelo ISO/OSI, no lo salvará del bloqueo del sitio/página si no se resuelve en la dirección registrada en el registro. Pero junto con el registro de github, llega el archivo nxdomain.txt, que con unos pocos trazos de script se convierte fácilmente en una fuente de direcciones para, por ejemplo, el complemento SwitchyOmega en Chrome.

También se debe mencionar que la solución requiere un enfoque adicional si no solo es un usuario de Internet, sino que también publica algunos recursos de usted mismo (por ejemplo, un sitio web o un servidor de correo se ejecuta en esta conexión). Por medio del enrutador, debe vincular el tráfico saliente de este servicio a su dirección pública, de lo contrario perderá la conectividad con aquellos recursos que están cubiertos por la lista de prefijos recibidos por el enrutador.

Si tiene alguna pregunta, pregunte, listo para responder.

UPD. Gracias navegación и teranyu para conocer las opciones de git para reducir los volúmenes de descarga.

UPD2. Colegas, parece que cometí un error al no agregar instrucciones para configurar un túnel entre el VPS y el enrutador en el artículo. Muchas preguntas son causadas por esto.
Por si acaso, tomo nota nuevamente: se supone que antes de comenzar los pasos de esta guía, ya configuró el túnel VPN en la dirección que necesita y verificó su rendimiento (por ejemplo, envolviendo el tráfico allí de manera predeterminada o estática). Si aún no ha completado esta fase, realmente no tiene sentido seguir los pasos del artículo. Todavía no tengo mi propio texto sobre esto, pero si busca en Google "Configuración del servidor OpenVPN" junto con el nombre del sistema operativo instalado en el VPS, y "Configuración del cliente OpenVPN" con el nombre de su enrutador, lo más probable es que Encontrará una serie de artículos sobre este tema, incluso sobre Habré.

UPD3. no sacrificado escribió un código que crea el archivo resultante para bird de dump.csv con suma opcional de direcciones IP. Por lo tanto, la sección "Procesamiento de registro para el servicio de enrutamiento" se puede reemplazar con una llamada a su programa. https://habr.com/post/354282/#comment_10782712

UPD4. Un poco de trabajo sobre los errores (no contribuyó en el texto):
1) en cambio systemctl recarga pájaro tiene sentido usar el comando configurar birdc.
2) en el enrutador Mikrotik, en lugar de cambiar el siguiente salto a la IP del segundo lado del túnel /filtro de enrutamiento agregar acción = aceptar cadena = protocolo de entrada dinámica = comentario bgp = "Establecer siguiente salto" set-in-nexthop = 172.30.1.1 tiene sentido especificar la ruta directamente a la interfaz del túnel, sin la dirección /filtro de enrutamiento add action=accept chain=dynamic-in protocol=bgp comment="Establecer nexthop" set-in-nexthop-direct=<nombre de interfaz>

UPD5. Llegó un nuevo servicio https://antifilter.download, desde donde puede tomar listas preparadas de direcciones IP. Actualizado cada media hora. Del lado del cliente, solo queda enmarcar las entradas con la correspondiente “ruta…rechazar”.
Y eso es probablemente suficiente para follar a mi abuela y actualizar el artículo.

UPD6. Una versión revisada del artículo para aquellos que no quieren entender, pero quieren comenzar: aquí.

Fuente: habr.com

Añadir un comentario