Sense commutador per excloure aquesta aplicació: doneu al procés la seva pròpia font
L’encaminament compara adreces, no noms de processos. Doneu al programa exclòs la seva pròpia font i taula, o moveu la decisió al router, on això és honest.
Un programa hauria d’usar la connexió normal mentre tota la resta es queda al túnel, i el client no té cap commutador per a això. Tampoc no hi ha cap menú ocult que trobar. La ruta es tria a partir de camps dins del paquet, i el paquet porta adreces i ports, no la identitat del procés que l’ha creat, així que una exclusió s’ha d’expressar en un d’aquests camps. Seguiu un paquet un cop i les opcions disponibles deixen de ser misterioses.
Per què el client no ho pot oferir
L’encaminament per destinació compara l’adreça de destinació amb prefixos i conserva la coincidència més llarga. En aquell moment tots els paquets semblen iguals, sigui quin sigui el que els ha produït. L’encaminament per política de font amplia la comparació a l’adreça d’origen, i aquest és el ganxo que fa servir qualsevol solució pràctica: canvieu la font i una altra taula esdevé elegible.
Els ports no ajuden. Una exclusió per port s’hauria d’avaluar abans de la consulta de destinació, i el port no hi té cap paper. Tot el que es promociona com a exclusió per port en realitat exclou per algun altre camp i ho descriu de manera laxa.
L’encaminament real per aplicació existeix on la plataforma hi ha afegit maquinària, com ara les crides de filtre a Windows o l’enllaç del servei VPN a Android. Una instància d’escriptori d’OpenVPN no en porta res, i cap indicador de configuració no ho inventa.
Linux: marqueu el procés i després encamineu la marca
L’enfocament més net lliga la decisió al procés que posseeix el sòcol. La coincidència owner funciona per al trànsit generat localment a la cadena OUTPUT, així que una marca aplicada allà pot triar una taula separada:
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
Els paquets de l’usuari 1001 consulten llavors la taula 200 i surten per la porta d’enllaç habitual, mentre la taula principal continua enviant tota la resta al túnel. La coincidència owner només s’aplica als paquets generats localment, que és exactament el trànsit que us interessa aquí, i no pot classificar paquets reenviats per a un altre amfitrió. Verifiqueu amb les eines i no amb la intenció: ss -tnp mostra l’adreça local i el procés propietari de les connexions establertes, i ip route get 1.1.1.1 mark 0x1 mostra quina taula tria la marca.
Un espai de noms de xarxa és la resposta més sòlida per a un programa autocontingut, perquè cada sòcol creat a dins hi queda lligat per construcció, així que els processos auxiliars i les connexions filles hereten el comportament sense classificar-se gens. El cost és de lampisteria: una parella veth, una adreça a cada extrem i una ruta per defecte dins de l’espai de noms que apunta de tornada a l’amfitrió.
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: la destinació encara decideix
Windows tria la interfície de sortida a partir de la destinació, així que un programa que vol un camí diferent ha de canviar alguna cosa que la pila consulta abans d’aquesta tria. ForceBindIP cobreix la primera meitat: engega un programa amb els sòcols ja lligats a una adreça local que indiqueu. Això sol no canvia per quina interfície surt el paquet, perquè la destinació encara selecciona la ruta. Lligueu una font en un portàtil la ruta per defecte del qual apunta al túnel i el paquet hi entra igualment.
El símptoma té una forma llegible un cop el coneixeu. Es compleix per a una adreça de LAN que la interfície triada abasta directament i falla per a qualsevol cosa d’internet la ruta de la qual apunta al túnel. També sembla funcionar fins que el programa passa feina a un auxiliar, perquè a un auxiliar que obre el seu propi sòcol mai no se li ha dit res de l’enllaç.
Moveu la decisió quan un sol procés és la unitat equivocada
Si el requisit real és un dispositiu i no un programa, poseu-lo al seu propi SSID o VLAN i deixeu que el router decideixi: aquella font pren el camí normal mentre les altres fan servir el túnel. Una màquina de porta d’enllaç dedicada és l’altre disseny honest: manté la VPN i només rep les destinacions que el router li envia. En una VLAN la política cobreix cada flux que obre el dispositiu, inclosos els processos auxiliars que van trencar l’enfocament de Windows. L’intercanvi és d’abast: dos programes en aquell dispositiu ja no es poden tractar de manera diferent.
Tots dos són polítiques de font o de destinació amb un abast que podeu dir en una frase. Cap no és per aplicació, i un disseny que es ven com a per aplicació falla el primer cop que el programa delega la seva feina a un segon procés.