Нема прекидача „изузми ову апликацију“: дајте процесу сопствени извор
Рутирање пореди адресе, а не називе процеса. Дајте изузетом програму сопствени извор и табелу, или преместите одлуку на рутер, где је то искрено.
Један програм треба да користи обичну везу док све остало остаје у тунелу, а клијент нема прекидач за то. Нема ни скривеног менија који би се нашао. Рута се бира из поља унутар пакета, а пакет носи адресе и портове, а не идентитет процеса који га је створио, зато изузимање мора бити изражено у једном од тих поља. Пратите пакет једном и доступне опције престају да буду загонетне.
Зашто клијент то не може да понуди
Рутирање по одредишту пореди одредишну адресу са префиксима и задржава најдуже поклапање. У том тренутку сваки пакет изгледа исто, шта год га је створило. Рутирање по политици извора проширује поређење на адресу извора, и то је кука коју користи свако практично решење: промените извор и друга табела постаје подобна.
Портови не помажу. Изузимање по порту морало би да се процени пре тражења одредишта, а порт у тој одлуци нема никакву улогу. Све што се рекламира као изузимање засновано на порту заправо изузима по другом пољу и описује то небрижно.
Стварно рутирање по апликацији постоји тамо где је платформа додала механизам за то, као филтерски позиви у Windows-у или повезивање VPN услуге у Android-у. Десктоп инстанца OpenVPN-а не доноси ништа од тога, и ниједна конфигурациона заставица то не измишља.
Linux: означите процес, затим рутирајте ознаку
Најчистији приступ везује одлуку за процес који поседује сокет. Поклапање owner ради за локално генерисан саобраћај у ланцу OUTPUT, па ознака примењена тамо може да изабере засебну табелу:
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
Пакети од корисника 1001 затим консултују табелу 200 и излазе кроз обичан гејтвеј, док главна табела и даље шаље све остало у тунел. Поклапање owner важи само за локално генерисане пакете, што је управо саобраћај који је овде важан, и не може да класификује пакете прослеђене другом хосту. Проверите алатима, а не намером: ss -tnp показује локалну адресу и процес који поседује успостављене везе, а ip route get 1.1.1.1 mark 0x1 показује коју табелу ознака бира.
Мрежни простор имена је чвршћи одговор за самостални програм, јер је сваки сокет створен унутар њега повезан с њим по конструкцији, па помоћни процеси и подређене везе наслеђују понашање без икаквог класификовања. Цена је водовод: пар veth, адреса на сваком крају и подразумевана рута унутар простора имена која показује назад на хост.
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: одредиште и даље одлучује
Windows бира излазни интерфејс према одредишту, па програм који жели други пут мора да промени нешто што стек консултује пре тог избора. ForceBindIP покрива прву половину: покреће програм са сокетима већ везаним за локалну адресу коју наведете. Само то не мења интерфејс кроз који пакет излази, јер руту и даље бира одредиште. Вежите извор на лаптопу чија подразумевана рута води у тунел и пакет ипак улази у тунел.
Симптом има читљив облик када га једном познајете. Важи за LAN адресу до које изабрани интерфејс стиже директно, а пада за све на интернету чија рута показује на тунел. Такође изгледа да ради све док програм не преда посао помоћнику, јер помоћнику који отвара сопствени сокет никад није речено за везивање.
Преместите одлуку када је један процес погрешна јединица
Ако је стварни захтев уређај, а не програм, ставите га на сопствени SSID или VLAN и пустите рутер да одлучи: тај извор иде нормалним путем док остали извори користе тунел. Наменска гејтвеј машина је други искрен дизајн: држи VPN и прима само одредишта која јој рутер шаље. На VLAN-у политика покрива сваки ток који уређај отвори, укључујући помоћне процесе који су сломили приступ за Windows. Замена је обим: два програма на том уређају више не могу да се третирају другачије.
Обе су политике извора или одредишта са обимом који можете да изговорите у једној реченици. Ниједна није по апликацији, а дизајн који се продаје као по апликацији пада први пут кад програм повери свој посао другом процесу.