Адна праграма павінна выкарыстоўваць звычайнае злучэнне, а ўсё астатняе застаецца ў тунэлі, і у кліента няма перамыкача для гэтага. Схаванага меню таксама няма. Маршрут выбіраецца з палёў унутры пакета, а пакет нясе адрасы і порты, а не ідэнтычнасць працэса, які яго стварыў, таму выключэнне трэба выразіць у адным з гэтых палёў. Прасочыце пакет адзін раз, і даступныя варыянты перастануць быць загадкавымі.

Чаму кліент не можа гэтага прапанаваць

Маршрутызацыя прызначэння параўноўвае адрас прызначэння з прэфіксамі і захоўвае самае доўгае супадзенне. У гэты момант усе пакеты выглядаюць аднолькава, што б іх ні стварыла. Маршрутызацыя палітыкі крыніцы пашырае параўнанне на адрас крыніцы, і гэта той кручок, які выкарыстоўвае кожнае практычнае рашэнне: змяніце крыніцу, і іншая табліца становіцца прыдатнай.

Порты не дапамагаюць. Выключэнне па порце трэба было б ацэньваць да пошуку прызначэння, а порт не ўдзельнічае ў гэтым рашэнні. Усё, што прапануецца як выключэнне на аснове порта, насамрэч выключае па іншаму полю і апісвае гэта няўдала.

Сапраўдная маршрутызацыя па праграмах існуе там, дзе платформа дадала для гэтага механізмы, напрыклад фільтруючыя выклікі ў 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. Абмен — гэта ахоп: дзве праграмы на гэтай прыладзе ўжо нельга апрацоўваць па-рознаму.

Абодва — гэта палітыкі крыніцы або прызначэння з ахопам, які можна сфармуляваць адным сказам. Ні адна не з'яўляецца па-праграмнай, і дызайн, які выдае сябе за па-праграмны, церпіць няўдачу ў першы раз, калі праграма перадае сваю працу другому працэсу.

Падобныя артыкулы