Ei kytkintä ”sulje tämä sovellus pois”: anna prosessille oma lähde
Reititys sovittaa osoitteita, ei prosessien nimiä. Anna poissuljetulle ohjelmalle oma lähde ja taulu tai siirrä päätös reitittimelle, missä se on rehellistä.
Yhden ohjelman pitäisi käyttää tavallista yhteyttä, kun kaikki muu pysyy tunnelissa, ja asiakkaalla ei ole siihen kytkintä. Piilotettua valikkoakaan ei ole löydettäväksi. Reitti valitaan paketin sisäisistä kentistä, ja paketti kuljettaa osoitteita ja portteja eikä sen luoneen prosessin identiteettiä, joten poissulkeminen on ilmaistava jossakin niistä kentistä. Seuraa pakettia kerran, niin käytettävissä olevat vaihtoehdot lakkaavat olemasta arvoituksellisia.
Miksi asiakas ei voi tarjota sitä
Kohdereititys vertaa kohdeosoitetta etuliitteisiin ja pitää pisimmän osuman. Sillä hetkellä jokainen paketti näyttää samalta, mikä tahansa sen tuotti. Lähteen käytäntöreititys laajentaa vertailun lähdeosoitteeseen, ja se on se koukku, jota jokainen käytännön ratkaisu käyttää: vaihda lähde, niin toisesta taulusta tulee kelvollinen.
Portit eivät auta. Portin perusteella tehtävä poissulkeminen pitäisi arvioida ennen kohdehakua, eikä portilla ole siinä päätöksessä mitään osaa. Kaikki porttiperusteisena poissulkemisena mainostettu sulkee itse asiassa pois jonkin muun kentän perusteella ja kuvaa sitä löyhästi.
Todellista sovelluskohtaista reititystä on siellä, missä alusta on lisännyt siihen mekanismin, kuten suodatinkutsut Windowsissa tai VPN-palvelun sidonta Androidissa. Työpöytä-OpenVPN:n instanssi ei tuo mitään siitä, eikä mikään asetuslippu keksi sitä.
Linux: merkitse prosessi ja reititä sitten merkki
Puhtain lähestymistapa sitoo päätöksen prosessiin, joka omistaa socketin. owner-osuma toimii paikallisesti syntyvälle liikenteelle OUTPUT-ketjussa, joten siellä asetettu merkki voi valita erillisen taulun:
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
Käyttäjän 1001 paketit kysyvät sitten taulua 200 ja lähtevät tavallisen yhdyskäytävän kautta, kun päätaulu lähettää kaiken muun edelleen tunneliin. owner-osuma koskee vain paikallisesti syntyneitä paketteja, mikä on täsmälleen se liikenne, jolla on tässä merkitystä, eikä se pysty luokittelemaan toiselle isännälle välitettäviä paketteja. Varmista työkaluilla, älä aikomuksella: ss -tnp näyttää avattujen yhteyksien paikallisen osoitteen ja omistavan prosessin, ja ip route get 1.1.1.1 mark 0x1 näyttää, minkä taulun merkki valitsee.
Verkkonimiavaruus on tukevampi vastaus itsenäiselle ohjelmalle, koska jokainen sen sisällä luotu socket on rakenteellisesti sidottu siihen, joten apuprosessit ja aliyhteydet perivät käyttäytymisen ilman minkäänlaista luokittelua. Hinta on putkityötä: veth-pari, osoite kummassakin päässä ja oletusreitti nimiavaruuden sisällä, joka osoittaa takaisin isäntään.
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: kohde päättää edelleen
Windows valitsee lähtevän liitännän kohteen perusteella, joten eri polkua haluavan ohjelman on muutettava jotakin, jota pino kysyy ennen sitä valintaa. ForceBindIP kattaa ensimmäisen puolen: se käynnistää ohjelman, jonka socketit on jo sidottu nimeämääsi paikalliseen osoitteeseen. Se yksin ei muuta sitä, mitä liitäntää pitkin paketti lähtee, koska kohde valitsee reitin edelleen. Sido lähde kannettavassa, jonka oletusreitti osoittaa tunneliin, ja paketti menee silti tunneliin.
Oireella on luettava muoto, kun sen kerran tuntee. Se pätee LAN-osoitteeseen, johon valittu liitäntä yltää suoraan, ja epäonnistuu kaikelle internetissä, jonka reitti osoittaa tunneliin. Se näyttää myös toimivan, kunnes ohjelma antaa työtä apurille, koska apurille, joka avaa oman socketinsa, ei koskaan kerrottu sidonnasta.
Siirrä päätös, kun yksi prosessi on väärä yksikkö
Jos todellinen vaatimus on laite eikä ohjelma, laita se omaan SSID:hen tai VLANiin ja anna reitittimen päättää: se lähde kulkee tavallista polkua, kun muut lähteet käyttävät tunnelia. Erillinen yhdyskäytäväkone on toinen rehellinen suunnittelu: se pitää VPN:n ja vastaanottaa vain ne kohteet, jotka reititin sille lähettää. VLANissa käytäntö kattaa jokaisen virtauksen, jonka laite avaa, mukaan lukien apuprosessit, jotka rikkoivat Windows-lähestymistavan. Kauppa on laajuus: saman laitteen kahta ohjelmaa ei enää voi kohdella eri tavoin.
Molemmat ovat lähde- tai kohdekäytäntöjä, joiden laajuuden voi sanoa yhdellä lauseella. Kumpikaan ei ole sovelluskohtainen, ja suunnittelu, joka mainostaa itseään sovelluskohtaisena, epäonnistuu ensimmäisen kerran, kun ohjelma delegoi työnsä toiselle prosessille.