Gjin skeakel om dizze app út te sluten: jou it proses syn eigen boarne
Rûtebepaling ferliket adressen, net prosesnammen. Jou it útsletten programma syn eigen boarne en tabel, of ferpleats de beslissing nei de router, dêr’t dat earlik is.
Ien programma moat de gewoane ferbining brûke wylst al it oare op de tunnel bliuwt, en de klant hat dêr gjin skeakel foar. Der is ek gjin ferstoppe menu te finen. In rûte wurdt keazen út fjilden yn it pakket, en it pakket draacht adressen en poarten yn stee fan ’e identiteit fan it proses dat it makke hat, dus moat in útsluting yn ien fan dy fjilden útdrukt wurde. Folch in pakket ien kear en de beskikbere opsjes hâlde op mysterieus te wêzen.
Wêrom’t de klant it net biede kin
Bestimmingsrûtebepaling ferliket it bestimmingsadres mei foarheaksels en hâldt de langste oerienkomst. Op dat stuit sjocht elk pakket der itselde út, wat it ek makke hat. Boarnebeliedsrûtebepaling ferbreedt de ferliking nei it boarneadres, en dat is de heak dêr’t elke praktyske oplossing gebrûk fan makket: feroarje de boarne, en in oare tabel wurdt geskikt.
Poarten helpe net. In útsluting op poart soe foar it bestimmingssykjen beoardiele wurde moatte, en de poart spilet gjin rol yn dy beslissing. Alles wat as poartbasearre útsluting oanbean wurdt, slút eins op in oar fjild út en beskriuwt dat loskes.
Echte rûtebepaling per applikaasje bestiet dêr’t it platfoarm dêrfoar masjinerie tafoege hat, lykas filteropropen op Windows of de VPN-tsjinstbining op Android. In buroblêd-eksimplaar fan OpenVPN leveret dêr neat fan, en gjin konfiguraasjeflagge betinkt it.
Linux: markearje it proses, rûtebepaal dan de markearring
De skjinste oanpak keppelt de beslissing oan it proses dat de socket besit. De owner-oerienkomst wurket foar lokaal oanmakke ferkear yn ’e OUTPUT-ketting, dus in markearring dy’t dêr tapast wurdt kin in aparte tabel kieze:
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
Pakketten fan brûker 1001 rieplachtsje dan tabel 200 en ferlitte it netwurk fia de gewoane gateway, wylst de haadtabel al it oare noch yn ’e tunnel stjoert. De owner-oerienkomst jildt allinnich foar lokaal oanmakke pakketten, wat krekt it ferkear is dêr’t it hjir om giet, en it kin pakketten dy’t foar in oare host trochstjoerd wurde net klassifisearje. Kontrolearje mei de ark yn stee fan mei de bedoeling: ss -tnp toant it lokale adres en it besittende proses fan fêstige ferbiningen, en ip route get 1.1.1.1 mark 0x1 toant hokker tabel de markearring kiest.
In netwurk-namromte is it steviger antwurd foar in selsstannich programma, want elke socket dy’t dêr yn makke wurdt is by konstruksje oan dy romte bûn, dus helpprosessen en bernferbiningen ervje it gedrach sûnder hielendal klassifisearre te wurden. De kosten binne loodgieterswurk: in veth-pear, in adres oan elk ein, en in standertrûte yn ’e namromte dy’t werom wiist nei de 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: de bestimming beslút noch altyd
Windows kiest de útgeande ynterface op grûn fan ’e bestimming, dus in programma dat in oare wei wol moat wat feroarje dat de stack rieplachtet foar’t dy kar makke wurdt. ForceBindIP dekt de earste helte: it startet in programma mei syn sockets al bûn oan in lokaal adres dat jo neame. Dat allinnich feroaret net by hokker ynterface it pakket fuortgiet, want de bestimming kiest noch altyd de rûte. Bin in boarne op in laptop waans standertrûte de tunnel yn wiist, en it pakket giet dochs de tunnel yn.
It symptoom hat in lêsbere foarm as jo it ienris kenne. It jildt foar in LAN-adres dat de keazen ynterface direkt berikt en mislearret foar alles op it ynternet waans rûte nei de tunnel wiist. It liket ek te wurkjen oant it programma wurk oan in helper jout, want in helper dy’t syn eigen socket iepenet is nea oer de bining ferteld.
Ferpleats de beslissing as ien proses de ferkearde ienheid is
As de echte eask in apparaat is en net in programma, set it dan op syn eigen SSID of VLAN en lit de router beslisse: dy boarne nimt de normale wei wylst oare boarnen de tunnel brûke. In aparte gateway-masine is it oare earlike ûntwerp: it hâldt de VPN en ûntfangt allinnich de bestimmingen dy’t de router dêrhinne stjoerd. Op in VLAN dekt it belied elke stream dy’t it apparaat iepenet, ynklusyf de helpprosessen dy’t de Windows-oanpak bruts. De ruil is omfang: twa programma’s op dat apparaat kinne net mear oars behannele wurde.
Beide binne boarne- of bestimmingsbelied mei in omfang dat jo yn ien sin sizze kinne. Gjin fan beide is per applikaasje, en in ûntwerp dat himsels as per applikaasje ferkeapet, mislearret de earste kear as it programma syn wurk oan in twadde proses deleget.