Un programa debería usar a conexión normal mentres todo o demais queda no túnel, e o cliente non ten ningún interruptor para iso. Tampouco hai ningún menú oculto que atopar. Unha ruta escóllese a partir de campos dentro do paquete, e o paquete leva enderezos e portos en vez da identidade do proceso que o creou, así que unha exclusión ten que expresarse nun deses campos. Segue un paquete unha vez e as opcións dispoñibles deixan de ser misteriosas.

Por que o cliente non pode ofrecelo

O encamiñamento por destino compara o enderezo de destino cos prefixos e conserva a coincidencia máis longa. Nese momento todo paquete parece igual, sexa cal sexa o que o produciu. O encamiñamento por política de fonte amplía a comparación ao enderezo de orixe, e ese é o gancho que usa calquera solución práctica: cambia a fonte e outra táboa pasa a ser elixible.

Os portos non axudan. Unha exclusión por porto tería que avaliarse antes da consulta de destino, e o porto non desempeña ningún papel nesa decisión. Todo o que se anuncia como exclusión por porto en realidade exclúe por algún outro campo e descríbeo de forma laxa.

O encamiñamento real por aplicación existe onde a plataforma engadiu maquinaria para iso, como as chamadas de filtro en Windows ou a vinculación do servizo VPN en Android. Unha instancia de escritorio de OpenVPN non trae nada diso, e ningunha opción de configuración o inventa.

Linux: marca o proceso e logo encamiña a marca

O enfoque máis limpo ata a decisión ao proceso que posúe o socket. A coincidencia owner funciona para o tráfico xerado localmente na cadea OUTPUT, así que unha marca aplicada alí pode seleccionar unha táboa aparte:

iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200

Os paquetes do usuario 1001 consultan entón a táboa 200 e saen pola pasarela habitual, mentres a táboa principal segue enviando todo o demais ao túnel. A coincidencia owner só se aplica a paquetes xerados localmente, que é exactamente o tráfico que lle importa aquí, e non pode clasificar paquetes reenviados para outro host. Verifica coas ferramentas e non coa intención: ss -tnp mostra o enderezo local e o proceso propietario das conexións establecidas, e ip route get 1.1.1.1 mark 0x1 mostra que táboa selecciona a marca.

Un espazo de nomes de rede é a resposta máis sólida para un programa autocontido, porque cada socket creado dentro queda ligado a el por construción, así que os procesos auxiliares e as conexións fillas herdan o comportamento sen clasificarse en absoluto. O custo é de fontanería: un par veth, un enderezo en cada extremo e unha ruta por defecto dentro do espazo de nomes que apunta de volta ao host.

ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1

Windows: o destino segue decidindo

Windows elixe a interface de saída a partir do destino, así que un programa que quere outro camiño ten que cambiar algo que a pila consulta antes desa elección. ForceBindIP cobre a primeira metade: inicia un programa cos seus sockets xa ligados a un enderezo local que vostede nomea. Iso por si só non cambia por que interface sae o paquete, porque o destino segue seleccionando a ruta. Liga unha fonte nun portátil cuxa ruta por defecto apunta ao túnel e o paquete entra no túnel de todos os xeitos.

O síntoma ten unha forma lexible unha vez que o coñece. Cúmprese para un enderezo de LAN que a interface elixida alcanza directamente e falla para calquera cousa en internet cuxa ruta apunte ao túnel. Tamén parece funcionar ata que o programa pasa traballo a un auxiliar, porque a un auxiliar que abre o seu propio socket nunca se lle dixo nada da ligazón.

Move a decisión cando un só proceso é a unidade equivocada

Se o requisito real é un dispositivo e non un programa, pono no seu propio SSID ou VLAN e deixa que o router decida: esa fonte toma o camiño normal mentres as demais usan o túnel. Unha máquina de pasarela dedicada é o outro deseño honesto: mantén a VPN e só recibe os destinos que o router lle envía. Nunha VLAN a política cobre cada fluxo que abre o dispositivo, incluídos os procesos auxiliares que romperon o enfoque de Windows. O intercambio é de alcance: dous programas nese dispositivo xa non se poden tratar de forma distinta.

Ambas son políticas de fonte ou de destino cun alcance que pode dicir nunha frase. Ningunha é por aplicación, e un deseño que se vende como por aplicación falla a primeira vez que o programa delega o seu traballo nun segundo proceso.

Artigos relacionados