GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:enrutamiento basado en nombres de dominio

El enrutamiento basado en el dominio de destino no es imposible y, con las herramientas adecuadas, no es tan difícil.

Presentaré algunos métodos que requieren poca o ninguna configuración especial del lado del cliente. Todos estos asumen que está utilizando OpenVPN para conectarse. Esto debería poder lograrse con otras VPN, pero puede requerir una configuración más manual después de que se abra la VPN.

A modo de ejemplo, usaré los dominios "example.com", "us1.example.com", "us2.example.com" y "geoblocked.com" para los dominios que queremos enrutar a través de la red no VPN. interfaz.

Todos los comandos deben ejecutarse como root.

Método 1:OpenVPN

Solo recomendaría esto si está seguro de que las direcciones IP que está enrutando tienen direcciones IP estáticas que nunca cambian.

Ventajas:

  • Extremadamente simple

Contras:

  • Solo confiable para dominios con direcciones IP que nunca cambiar
  • Necesita una entrada explícita para cada dominio y subdominio

Método:

Agregue las siguientes líneas a su configuración de OpenVPN:

route example.com     255.255.255.255 net_gateway
route us1.example.com 255.255.255.255 net_gateway
route us2.example.com 255.255.255.255 net_gateway
route geoblocked.com  255.255.255.255 net_gateway

Reinicie OpenVPN.

Eso es todo, pero tendrá que reiniciar la VPN nuevamente si esas direcciones IP cambian alguna vez.

NOTA :Algunas fuentes dicen que también necesita especificar allow-pull-fqdn , pero ese no parece ser el caso en mi experiencia. YMMV.

Método 2:enrutamiento basado en políticas

El enrutamiento basado en políticas es la capacidad de enrutar según ciertos criterios; comúnmente una dirección o protocolo de origen, pero en este caso inspeccionaremos el nombre de dominio de destino antes del enrutamiento y usaremos paquetes marcados ("fwmark").

Entonces, lo que debemos hacer primero es crear una tabla separada para sus paquetes enrutados de VPN, de modo que podamos marcar aquellos que pasan a través de la VPN y pasar los paquetes marcados a través de la interfaz que no es de VPN. (Tenga en cuenta que este es un enfoque y que hay muchas otras formas de abordarlo, como dejar que la VPN realice su enrutamiento normalmente a través de la tabla principal y crear una tabla separada para el tráfico que no es de VPN).

Su núcleo debe ser lo suficientemente reciente y tener los módulos adecuados, aunque los sistemas modernos probablemente los tengan en sus núcleos predeterminados.

El nombre "vpn_table" (el nombre de la tabla de enrutamiento) y los números "201" (ID de la tabla de enrutamiento) y "3" (fwmark) se eligen arbitrariamente.

Cree la nueva tabla de enrutamiento (como root):

echo 201 vpn_table >> /etc/iproute2/rt_tables

Configurar OpenVPN:

Cree el siguiente script en algún lugar (lo llamo "/etc/openvpn/client/setup-routing") y hágalo ejecutable:

#!/bin/bash
ip route add 0.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
ip route add 128.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
sysctl -w net.ipv4.conf.$dev.rp_filter=2

# You can optionally leave the next two lines out but run the `ip rule add`
# command at each boot instead
ip rule del fwmark 3 table vpn_table &>/dev/null # This might fail but that's ok
ip rule add fwmark 3 table vpn_table

OpenVPN completará las variables en el script anterior como variables de entorno. También tenga en cuenta que esto configura el enrutamiento a todos direcciones a través de la puerta de enlace VPN en la tabla de enrutamiento "vpn_table". Si la configuración de su VPN requiere un enrutamiento más complejo, consulte la documentación de OpenVPN y ajústela en consecuencia.

Agregue lo siguiente a su configuración de OpenVPN:

## Policy routing
route-noexec
script-security 2
route-up /etc/openvpn/client/setup-routing

La línea "route-noexec" permite que OpenVPN obtenga la ruta del servidor, pero evita que complete las rutas. En su lugar, se llama al script de enrutamiento. "script-security 2" es necesario para llamar a un script definido por el usuario.

Esa es toda la configuración necesaria para enrutar los paquetes marcados, pero necesitamos configurar una forma de marcar los paquetes. Dos opciones son usar dnsmasq con ipset o configurar un proxy squid.

Método 2a:enrutamiento basado en políticas usando ipset y dnsmasq

Recomendaría este método si ya lo está ejecutando en un enrutador basado en dnsmasq o si sus clientes no admiten la configuración de proxy. Esto es efectivamente lo mismo que un DNS de almacenamiento en caché que actualiza la tabla de enrutamiento cada vez que se busca un nombre de dominio.

Ventajas:

  • Maneja subdominios
  • Funciona en dispositivos que no pueden acceder a servidores proxy (¿existen?)

Contras:

  • No maneja el campo de referencia (ver Método 2b)
  • Necesita configuraciones complicadas de ipset e iptables
  • Requiere que el sistema conectado a VPN esté configurado como enrutador (necesita una interfaz dedicada)
  • No tengo idea de qué tan escalable es ipset (mi caso de uso es para un ccTLD completo)

Esto supone que ya tiene dnsmasq configurado y configurado, y que actúa como puerta de enlace y servidor DNS para clientes conectados a una interfaz dedicada "eth1".

Cree el conjunto de IP:

ipset create SKIP_VPN_IPSET iphash

Dígale a iptables que marque los paquetes ipset (n.b., esto debe hacerse después creando la lista de ipset):

# Mark ALL packets coming in on eth1 - change this to the interface dnsmasq listens on
iptables -A PREROUTING -i eth1 -t mangle -j MARK --set-mark 3

# REMOVE mark on any addresses that match our ipset
iptables -A PREROUTING -t mangle -m set --match-set SKIP_VPN_IPSET dst -j MARK --set-mark 0/3

NOTA :Los comandos anteriores (ipset y iptables ) debe ejecutarse en cada arranque. Alternativamente, su sistema operativo puede proporcionar algunas opciones para guardar/restaurar reglas e ipsets de iptable.

NOTA2 :Hay documentado un inverso ! --match-set pero eso dio como resultado que todos los paquetes desaparecieran cuando lo probé.

Agregue lo siguiente a su dnsmasq.conf:

ipset=/example.com/geoblocked.com/SKIP_VPN_IPSET

Obviamente, ajuste esa línea también para los nombres de dominio que desee enrutar. Esto también agregará TODOS subdominios al ipset, por lo que no necesita especificarlos explícitamente. Incluso usar un TLD funcionará.

Reinicie dnsmasq y configure sus clientes para usar el sistema conectado a la VPN como puerta de enlace y DNS (que debería estar implícito si está configurado como un servidor DHCP).

Método 2b:enrutamiento basado en políticas usando squid

Este es mi método favorito y funciona bien con mi PS4 y otros dispositivos que uso para conectarme.

Ventajas:

  • Maneja subdominios
  • Maneja el campo de referencia
  • No requiere reemplazar su enrutador existente
  • Los clientes (navegadores) pueden usarlo opcionalmente o no

Contras:

  • Los clientes deben ser compatibles con la conexión proxy

Esto supone que tiene una configuración de squid que funciona y un conocimiento básico de la configuración de squid.

Agregue las siguientes líneas a squid.conf:

# redirect example domains
acl domain_to_remote_proxy dstdomain .example.com
acl ref_to_remote_proxy referer_regex [^.]*\.example.com.*

# redirect geoblocked domain
acl domain_to_remote_proxy dstdomain .geoblocked.com
acl ref_to_remote_proxy referer_regex [^.]*\.geoblocked.com.*

# mark packets that we want routed through the VPN
tcp_outgoing_mark 0x03 !ref_to_remote_proxy !domain_to_remote_proxy

Tenga en cuenta que hay 2 líneas por dominio y los subdominios coinciden. La primera línea verifica el dominio de destino y la segunda coincide con el encabezado "Referer". Esto es útil porque los navegadores envían el referente cuando buscan contenido en una página web, como imágenes, CSS o javascript; esto significa que el contenido solicitado por el sitio también se enrutará a través de la dirección que no sea VPN incluso si está alojado en un dominio diferente (por ejemplo, ejemplo-cdn.com).

En los clientes, configure la conexión como de costumbre, pero establezca la configuración del proxy para usar el servidor proxy y el puerto para este sistema. La mayoría de los dispositivos (incluidas las consolas de juegos) permiten la configuración de todo el sistema. En las PC, la mayoría de los navegadores se pueden configurar para usar un proxy independientemente de la configuración del sistema.

Nota final:mi caso de uso es en realidad enrutar dominios específicos a través de la VPN y todo lo demás a través de la no VPN. Los métodos son similares a los anteriores, pero invertidos.


Le recomiendo que evite administrar el enrutamiento en función de los nombres de dominio (por cierto, también es imposible resolver el subdominio comodín, ya sea que se trate de puntos de bonificación o no:D)

Para ser un poco descriptivo, no deberías hacer eso porque:

1) algunos dominios cambian sus IP de vez en cuando,

2) es imposible hacer coincidir los comodines en los subdominios

3) es imposible conocer/obtener todos los subdominios de cualquier dominio

4) cualquier subdominio aleatorio puede tener cualquier dirección IP aleatoria.

Por lo tanto, la solución como complemento del navegador (y/o proxy local personalizado como squid) es la mejor opción para su problema.

Pero, supongo, el complemento "FoxyProxy" (originalmente es un complemento de Firefox, pero AFAIRC, también existe una versión de Chrome) es exactamente lo que quieres.

Y, además, respondiendo a tu aviso de que "FoxyProxy es un servicio de pago y ya tienes tu vpn":

FoxyProxyMás es un servicio pago, pero no FoxyProxy.

FoxyProxy es un complemento, disponible para los principales navegadores:

Edición estándar (Firefox) | Edición básica (Firefox)

Edición estándar (cromo{e,io}) | Edición básica (Chrom{e,ium})

Entonces, si desea acceder a algunos dominios a través de VPN, debe:

1) escribe reglas para que foxyproxy pase por tu instancia de squid para la lista de dominios

2) y/o escribe la lista de reglas para el calamar

3) capturar el tráfico http/https no propio por squid con iptables y apúntalo a squid con una regla como esta:

iptables -m owner -m multiport -t nat -A OUTPUT ! -o lo ! --uid-owner $squid_user_id -p tcp --dports 80,443,8080,... -j REDIRECT --to-ports $SQUID_PORT

(--syn la opción puede ser necesaria para -p tcp)

4) capturar tráfico http/https propiedad por squid, y márquelo para el próximo enrutamiento a VPN con una regla como esta:

iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11

5)

echo 11 forcevpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table forcevpn
ip route add default via 10.0.0.1 table forcevpn

donde 10.0.0.1 es su puerta de enlace dentro de VPN. O puede usar dev $VPN_IF en lugar de via 10.0.0.1 si no tiene una puerta de enlace y solo quiere enviar todo el tráfico a la interfaz vpn.

6) opcionalmente, es posible que deba ejecutar sudo sysctl ipv4.conf.all.rp_filter =0

===

Y una cosa más:

Si desea hacer la misma magia con tráfico TCP que no sea http(s), necesitará algo como cadenas proxy y realizar una captura mágica similar.

Y, si quieres hacer esa magia con UDP, tengo malas noticias:no conozco ningún proxy capaz de hacer proxy de UDP (debido a la naturaleza de este protocolo) :)

⇓⇓⇓ EDITAR ⇓⇓⇓

En caso de que desee lo contrario (predeterminado gw =vpn y gobernar algunos dominios directamente a través del ISP), puede ser:

1) escribe reglas para que foxyproxy pase por tu instancia de squid para la lista de dominios

2) capturar tráfico propio por squid, y márquelo para el próximo enrutamiento de otra manera con una regla como esta:

iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11

3)

echo 11 novpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table novpn
ip route add default via ${ISP_GW} table novpn

donde ISP_GW es la puerta de enlace que utiliza para enrutar el tráfico a su servidor VPN. Algunos usuarios pueden querer usar dev ppp0 (o ppp1 , ..., pppN ) en lugar de via ${ISP_GW} en caso de que usen pptp para conectarse a Internet.


Linux
  1. Comando nslookup de Linux explicado con ejemplos

  2. Linux – ¿Enrutamiento a través de Iptables?

  3. Lector:un lector de libros electrónicos basado en Qt para Linux

  4. Linux recupera los nombres de los monitores

  5. error de enrutamiento de linux?

Las mejores distribuciones de Linux basadas en KDE

Cómo encontrar archivos según sus permisos en Linux

Comando de host en Linux

Cómo encontrar archivos basados ​​en la marca de tiempo en Linux

Las 5 mejores distribuciones de Linux basadas en Arch Linux

Ejemplos de comandos de ruta en Linux