¿Omitir VPN para el tráfico HTTP/HTTPS en Ubuntu?

¿Omitir VPN para el tráfico HTTP/HTTPS en Ubuntu?

Tengo una máquina Ubuntu 14.04 en la que todo el tráfico saliente se realiza a través de una VPN, y debo asegurarme de que el tráfico HTTP y HTTPS no pase por la VPN.
He investigado el enrutamiento estático pero parece manejar solo la capa 3.
¿Cómo debo abordar esta configuración? Gracias.

Respuesta1

Para enrutar paquetes destinados a puertos específicos a través de una puerta de enlace predeterminada diferente, debe marcar esos paquetes usando iptables y luego enrutarlos a través de una tabla de rutas diferente.

Entonces, primero cree una nueva tabla de rutas con la puerta de enlace predeterminada, su puerta de enlace local (no su puerta de enlace VPN).

ip route add table 4 default via 192.168.0.1

Luego marque los paquetes que necesita según los puertos de destino.

iptables -t mangle -A PREROUTING -p tcp --dport 80  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4

Finalmente, enrute esos paquetes marcados a través de la tabla de rutas recién creada.

ip rule add fwmark 4 table 4

No he probado los comandos anteriores, por lo que es posible que necesiten algunos ajustes.

Respuesta2

Una forma de hacerlo es usando ip ruley iptables. Un ejemplo sería marcar el tráfico que te interesa enrutar.

iptables -I OUTPUT -m tcp -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x0001

Luego crea una nueva tabla de enrutamiento:

echo 101 r_http >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.1 dev eth0 table r_http
ip route flush cache

Y ahora que tienes marcado tu tráfico HTTP y HTTPS puedes crear una regla para aplicar esa nueva tabla de enrutamiento.

ip rule fwmark 0x0001 table 101

Eso debería funcionar. Como ejercicio para el lector, cómo hacerlo permanente y cómo crear la ruta predeterminada :-)

Respuesta3

Recientemente me enfrenté a una situación similar a la del OP. Gracias a las respuestas proporcionadas por @Cha0s y @Pablo Martinez, pude hacerlo funcionar para mi situación.

Primero, como dijeron ambos, debemos tener reglas de iptables para marcar aquellos paquetes que no deberían pasar por VPN. @Cha0s hizo bien en poner las reglas en la mesa de destrucción. Según la página de manual de iptables, debe usar la tabla mangle para hacer -j MARK target.

Por otro lado, @Pablo Martinez tiene razón al colocarlos en la cadena OUTPUT, aunque la página de manual de iptables dice que debes usar -j MARK en la cadena PREROUTING. Esos paquetes se generan en el host local y salen. No serán procesados ​​por la cadena PREROUTING. Pero la cadena OUTPUT tiene sentido y también tiene una tabla de mangle. Así que aquí está la regla de iptables que utilicé:

iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101

Luego cree una nueva tabla de enrutamiento y agréguele una ruta como lo describió @Pablo Martínez:

echo 101 r_http > /etc/iproute2/rt_tables.d/r_http.conf
ip route add table r_http default via 192.168.0.1 dev enp2s0
ip route flush cache

Reemplace 192.168.0.1 con la IP de su puerta de enlace o enrutador (no VPN) y enp2s0 con el nombre de su interfaz de red. Puede utilizar "ip addr" para comprobar los nombres de las interfaces.

Finalmente, agregue una regla ip para permitir que iproute2 inspeccione la marca y use nuestra nueva tabla de enrutamiento.

ip rule add fwmark 0x101 table 101

Puede agregar una regla de iptables para registrar los paquetes que van al puerto 80 y 443. Tenga en cuenta que esa regla se agrega en la parte superior de la cadena de SALIDA en la tabla de filtrado porque la tabla de filtrado se procesa después de la tabla de manipulación y debe ser la primera regla a evitar. ser ignorado.

iptables -I OUTPUT -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "<HTTP/S>" --log-level info

Las entradas del registro deberían aparecer en /var/log/kern.log (en un sistema Debian). Puede comprobar si todos tienen MARK=0x101. No olvide eliminar la regla de registro una vez que recopile suficientes entradas.

cat /var/log/kern.log | grep '<HTTP/S>' | less

Una vez que esté seguro de que los paquetes están marcados correctamente, puede verificar si iproute2 elegirá la ruta correcta para los paquetes marcados.

ip route get to 8.8.8.8
ip route get to 8.8.8.8 mark 0x101

El resultado de la primera línea debería indicarle que el paquete pasará por la puerta de enlace VPN y el dispositivo de túnel. La segunda línea debería mostrar que el paquete pasará por su propia puerta de enlace y dispositivo de red.

REFERENCIAS:

Respuesta4

Podría intentar configurar sus navegadores para utilizar un proxy.
- Puedes especificar proxy en DNS, pero no estoy familiarizado con esta técnica. (Cómo funcionan las búsquedas de DNS cuando se usa un proxy HTTP (o no) en IE) - Esto también se puede hacer con la Política de grupo (http://social.technet.microsoft.com/wiki/contents/articles/5156.how-to-force-proxy-settings-via-group-policy.aspx), y si los navegadores en cuestión respetan la configuración de Internet Explorer, puedes implementarlo fácilmente en toda la red.

Sin embargo, necesitarás un servidor proxy HTTP para que esto funcione (https://stackoverflow.com/questions/1994846/open-source-http-or-https-proxy)

Esto mantendría el tráfico del navegador web fuera de la VPN, pero todo lo demás debería estar bien. Configure su servidor proxy de tal manera que nada del tráfico se enrute a través de la VPN.

información relacionada