Isang programa ang dapat gumamit ng karaniwang koneksyon habang lahat ng iba ay nananatili sa tunel, at walang switch ang kliyente para diyan. Wala ring nakatagong menu na mahahanap. Pinipili ang ruta mula sa mga field sa loob ng packet, at nagdadala ang packet ng mga address at port sa halip na pagkakakilanlan ng prosesong lumikha nito, kaya ang pagbubukod ay dapat ipahayag sa isa sa mga field na iyon. Sundan ang isang packet nang isang beses at titigil ang mga available na opsyon sa pagiging mahiwaga.

Bakit hindi ito maiaalok ng kliyente

Inihahambing ng routing sa destinasyon ang address ng destinasyon sa mga prefix at pinapanatili ang pinakamahabang tugma. Sa sandaling iyon, magkapareho ang hitsura ng bawat packet, anuman ang lumikha nito. Pinalalawak ng routing sa patakaran ng pinagmulan ang paghahambing sa address ng pinagmulan, at iyon ang sabitan na ginagamit ng bawat praktikal na solusyon: baguhin ang pinagmulan at magiging karapat-dapat ang ibang talahanayan.

Walang tulong ang mga port. Ang pagbubukod ayon sa port ay kailangang suriin bago ang paghahanap ng destinasyon, at walang bahagi ang port sa desisyong iyon. Lahat ng inaanunsyo bilang pagbubukod batay sa port ay talagang nagbubukod sa ibang field at maluwag itong inilalarawan.

Ang tunay na routing kada application ay umiiral kung saan nagdagdag ang platform ng mekanismo para dito, gaya ng mga filter callout sa Windows o ang binding ng serbisyo ng VPN sa Android. Walang dala ang desktop instance ng OpenVPN ni isa sa mga iyon, at walang configuration flag ang nag-imbento nito.

Linux: markahan ang proseso, pagkatapos i-route ang marka

Ang pinakamalinis na paraan ay nagtatali ng desisyon sa prosesong may-ari ng socket. Gumagana ang tugma ng owner para sa trapikong lokal na nabuo sa chain ng OUTPUT, kaya ang markang inilapat doon ay makapipili ng hiwalay na talahanayan:

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

Ang mga packet mula sa user 1001 ay sasangguni sa talahanayan 200 at lalabas sa karaniwang gateway, habang ang pangunahing talahanayan ay nagpapadala pa rin ng lahat ng iba sa tunel. Ang tugma ng owner ay nalalapat lamang sa mga packet na lokal na nabuo, na siyang trapikong mahalaga dito, at hindi nito maiuuri ang mga packet na ipinapasa para sa ibang host. I-verify gamit ang mga tool at hindi ang intensyon: ipinapakita ng ss -tnp ang lokal na address at ang prosesong may-ari ng mga naitatag na koneksyon, at ipinapakita ng ip route get 1.1.1.1 mark 0x1 kung aling talahanayan ang pinipili ng marka.

Ang network namespace ang mas matibay na sagot para sa isang standalone na programa, dahil ang bawat socket na nilikha sa loob nito ay nakatali rito ayon sa konstruksyon, kaya ang mga helper na proseso at child connection ay nagmamana ng pag-uugali nang walang anumang pag-uuri. Ang halaga ay pagtutubero: isang pares ng veth, isang address sa bawat dulo, at isang default na ruta sa loob ng namespace na nakaturo pabalik sa 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: ang destinasyon pa rin ang nagpapasya

Pinipili ng Windows ang palabas na interface mula sa destinasyon, kaya ang programang gustong ibang landas ay kailangang baguhin ang isang bagay na sinusangguni ng stack bago ang pagpiling iyon. Sinaklaw ng ForceBindIP ang unang kalahati: sinisimulan nito ang isang programa na ang mga socket ay nakatali na sa lokal na address na tinukoy mo. Hindi binabago nito ang interface kung saan lumalabas ang packet, dahil pinipili pa rin ng destinasyon ang ruta. Itali ang isang pinagmulan sa laptop na ang default na ruta ay nakaturo sa tunel, at papasok pa rin ang packet sa tunel.

May mababasang hugis ang sintomas kapag kilala mo na ito. Nalalapat ito sa isang LAN address na direktang naaabot ng piniling interface at nabibigo para sa anumang nasa internet na ang ruta ay nakaturo sa tunel. Mukha rin itong gumagana hanggang ibigay ng programa ang trabaho sa isang helper, dahil ang helper na nagbubukas ng sarili nitong socket ay hindi kailanman sinabihan tungkol sa pagtali.

Ilipat ang desisyon kapag ang isang proseso ay maling yunit

Kung ang tunay na pangangailangan ay aparato at hindi programa, ilagay ito sa sariling SSID o VLAN at hayaang magpasya ang router: ang pinagmulang iyon ay dumadaan sa karaniwang landas habang ang ibang pinagmulan ay gumagamit ng tunel. Ang nakatalagang gateway machine ay ang isa pang tapat na disenyo: hawak nito ang VPN at tinatanggap lamang ang mga destinasyong ipinapadala ng router dito. Sa isang VLAN, sinasaklaw ng patakaran ang bawat daloy na binubuksan ng aparato, kasama ang mga helper na proseso na sumira sa paraan ng Windows. Ang kapalit ay saklaw: ang dalawang programa sa aparatong iyon ay hindi na maaring tratuhin nang iba.

Pareho silang patakaran ng pinagmulan o destinasyon na may saklaw na masasabi sa isang pangungusap. Wala sa kanila ang kada application, at ang disenyong nagbebenta ng sarili bilang kada application ay nabibigo sa unang pagkakataon na ipinagkatiwala ng programa ang trabaho nito sa pangalawang proseso.

Kaugnay na mga artikulo