Bu tətbiqi istisna etmək üçün açar yoxdur: prosesə öz mənbəyini verin
Marşrutlaşdırma adresləri uyğunlaşdırır, proses adlarını yox. İstisna edilən proqrama öz mənbəyini və cədvəlini verin və ya qərarı dürüst olduğu yerdə — marşrutlaşdırıcıya köçürün.
Bir proqram adi bağlantıdan istifadə etməli, qalan hər şey isə tuneldə qalmalıdır, və müştəridə bunun üçün açar yoxdur. Tapmaq üçün gizli menyu da yoxdur. Marşrut paketin daxilindəki sahələrdən seçilir, paket isə onu yaradan prosesin kimliyini deyil, adresləri və portları daşıyır, ona görə də istisna həmin sahələrdən birində ifadə olunmalıdır. Paketi bir dəfə izləyin və mövcud variantlar sirli olmaqdan çıxır.
Niyə müştəri bunu təklif edə bilmir
Təyinat marşrutlaşdırması təyinat adresini prefikslərlə müqayisə edir və ən uzun uyğunluğu saxlayır. Həmin anda hər paket eyni görünür, onu nə yaratmış olsa da. Mənbə siyasəti marşrutlaşdırması müqayisəni mənbə adresinə genişləndirir və hər praktik həllin istifadə etdiyi qarmaq budur: mənbəyi dəyişin, fərqli cədvəl uyğun olur.
Portlar kömək etmir. Portla istisna təyinat axtarışından əvvəl qiymətləndirilməli olardı və port həmin qərarda heç bir rol oynamır. Port əsaslı istisna kimi təqdim edilən hər şey əslində başqa bir sahə ilə istisna edir və bunu səliqəsiz təsvir edir.
Əsl tətbiq üzrə marşrutlaşdırma platformanın bunun üçün mexanizm əlavə etdiyi yerdə mövcuddur, məsələn Windows-da filtr çağırışları və ya Android-də VPN xidməti bağlaması. Masaüstü OpenVPN nüsxəsi bunların heç birini daşımır və heç bir konfiqurasiya bayrağı bunu uydurmur.
Linux: prosesi işarələyin, sonra işarəni marşrutlaşdırın
Ən təmiz yanaşma qərarı soketi saxlayan prosesə bağlayır. owner uyğunluğu OUTPUT zəncirində yerli yaradılan trafik üçün işləyir, ona görə də orada tətbiq edilən işarə ayrı cədvəl seçə bilər:
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 istifadəçisindən gələn paketlər sonra 200 cədvəlinə müraciət edir və adi şlüz vasitəsilə çıxır, əsas cədvəl isə qalan hər şeyi hələ də tunelə göndərir. owner uyğunluğu yalnız yerli yaradılan paketlərə aiddir, bu da tam olaraq burada vacib olan trafikdir, və o, başqa host üçün ötürülən paketləri təsnif edə bilmir. Niyyətlə deyil, alətlərlə yoxlayın: ss -tnp qurulmuş bağlantıların yerli adresini və sahib prosesini göstərir, ip route get 1.1.1.1 mark 0x1 isə işarənin hansı cədvəli seçdiyini göstərir.
Şəbəkə adlar məkanı müstəqil proqram üçün daha davamlı cavabdır, çünki onun içində yaradılan hər soket konstruksiya etibarilə ona bağlıdır, buna görə köməkçi proseslər və alt bağlantılar heç təsnif edilmədən davranışı miras alır. Qiyməti santexnikadır: bir veth cütü, hər ucda bir adres və adlar məkanının içində hosta geri baxan defolt marşrut.
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: təyinat hələ də qərar verir
Windows çıxış interfeysini təyinata görə seçir, ona görə fərqli yol istəyən proqram yığının həmin seçimdən əvvəl müraciət etdiyi bir şeyi dəyişməlidir. ForceBindIP birinci yarısını örtür: proqramı soketləri artıq adını verdiyiniz yerli adrese bağlı vəziyyətdə başladır. Bu tək başına paketin hansı interfeysdən çıxdığını dəyişmir, çünki marşrutu hələ də təyinat seçir. Defolt marşrutu tunelə baxan noutbukda mənbə bağlayın və paket yenə də tunelə girir.
Simptomun oxunaqlı bir forması var, onu bildikdən sonra. Bu, seçilmiş interfeysin birbaşa çatdığı LAN adresi üçün keçərlidir və internetdə marşrutu tunelə baxan hər şey üçün uğursuz olur. Həm də proqram işi köməkçi prosesə ötürənə qədər işləyirmiş kimi görünür, çünki öz soketini açan köməkçiyə bağlama heç vaxt deyilməmişdi.
Bir proses yanlış vahid olduqda qərarı köçürün
Əgər əsl tələb proqram deyil, cihazdırsa, onu öz SSID və ya VLAN-ına qoyun və qərarı marşrutlaşdırıcıya verin: o mənbə normal yolu tutur, digər mənbələr isə tuneldən istifadə edir. Ayrılmış şlüz maşını digər dürüst dizayndır: VPN-i saxlayır və yalnız marşrutlaşdırıcının ona göndərdiyi təyinatları qəbul edir. VLAN-da siyasət cihazın açdığı hər axını əhatə edir, o cümlədən Windows yanaşmasını pozan köməkçi prosesləri. Mübadilə əhatə dairəsidir: həmin cihazdakı iki proqrama artıq fərqli yanaşmaq mümkün deyil.
Hər ikisi bir cümlə ilə ifadə edə biləcəyiniz əhatə dairəsi olan mənbə və ya təyinat siyasətidir. Heç biri tətbiq üzrə deyil və özünü tətbiq üzrə kimi təqdim edən dizayn proqram işini ikinci prosesə həvalə etdiyi ilk anda uğursuz olur.