ProHoster > Blog > administración > Configuración de BGP para evitar el bloqueo o "Cómo dejé de tener miedo y me enamoré de RKN"
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:
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.
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.
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.
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.
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.
Acciones preparatorias
Conseguir un VPS
Subimos el túnel desde el router hasta el VPS
Obtener y actualizar periódicamente una copia del registro
Instalación y configuración del servicio de enrutamiento
Cree una lista de rutas estáticas para el servicio de enrutamiento según el registro
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:
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.
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
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í:
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
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í.