Виключіть один хост із маршруту за замовчуванням VPN у Windows
Профіль повного тунелю володіє маршрутом за замовчуванням. Одному хосту потрібен вужчий префікс на фізичному інтерфейсі, який додається знову після кожного підключення.
Ноутбук підключається до офісного VPN, і все йде за ним, зокрема вебсторінка принтера та одна інтрамережа, яка відповідає лише в локальній мережі. Маршрут, зроблений вручну, виправляє це на годину, потім з’єднання падає, повертається, і виняток зникає. З тунелем усе гаразд: Windows тримає єдину таблицю маршрутизації, а VPN-адаптер переписує свою частину цієї таблиці під час кожного підключення. Виживає те, що лежить поза власними записами адаптера.
Який запис бере на себе тунель
Запишіть таблицю двічі — один раз із вимкненим тунелем, один раз із увімкненим — і порівняйте рядки за замовчуванням. Коли профіль забирає префікс за замовчуванням, запис адаптера є найширшим рядком у таблиці, тож будь-який виняток має бути вужчим за нього. Це арифметика про довжину префікса, а не твердження про довіру чи політику. Вона також визначає, який інтерфейс має назвати виняток.
Запишіть індекс інтерфейсу та локальний шлюз, перш ніж рухатися далі, бо обидва змінюються, коли машина приєднується до іншої мережі. Команди нижче читають їх із машини, а не з пам’яті.
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.30
Друга команда повідомляє інтерфейс і наступний хоп, які ця адреса використала б прямо зараз, що краще за читання сорока рядків і здогадки. Запустіть її до та після підключення — і матимете пару, варту додавання до запису про зміну. Обидва виводи дають числа, які використовуються в решті цієї сторінки.
Маршрут хоста перемагає за конкретністю
Найдовший збіг префікса визначає переможця, тож /32 через фізичний шлюз перемагає маршрут за замовчуванням через тунель, не чіпаючи тунель. Трафік до цієї адреси виходить із локального інтерфейсу, а все інше зберігає наявний шлях. Тунель і далі несе маршрут за замовчуванням і просто перестає бути єдиним кандидатом для цього призначення. Довжина префікса — єдиний важіль, який надає таблиця, і для цієї роботи його достатньо.
Конкретність також відкидає очевидний короткий шлях із виключенням імені домену, бо таблиця зіставляє адреси, а одне ім’я може розв’язуватися в кілька з них. Спершу розв’яжіть хост, потім вирішіть, яка з його адрес заслуговує на виняток.
Для всього нижче припустіть з’єднання з назвою Office, локальний шлюз 10.0.0.1 на інтерфейсі 7 і призначення 198.51.100.30. Це заповнювачі, а не значення за замовчуванням, і команди вище дають значення, які ваша машина справді використовує. Тримайте цю примітку про заміну разом зі зміною, щоб наступний читач не копіював числа.
Зробіть так, щоб маршрут пережив наступне перепідключення
Windows не пропонує жодної інструкції з виключення для VPN-з’єднання, тож виняток має жити на фізичному інтерфейсі, де адаптер його не перепише. Командлет, який виглядає як відповідь, робить протилежне: Add-VpnConnectionRoute переміщує префікс у тунель, що є дзеркальним випадком, коли розділений профіль має нести одне призначення, а решту лишати локально. Якщо взятися за нього тут, трафік, який ви хотіли залишити зовні, гарантовано піде всередину.
Ручна форма — це одна команда. Її слабкість — зміна мережі, а не перепідключення.
route -p add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
Це переживає перезавантаження завдяки -p і відправляє одну адресу через інтерфейс 7, поки тунель несе все інше. Перемістіть ноутбук в іншу мережу — і шлюз, і індекс застаріють, тож запис тихо відмовить. Запишіть, кому він належить і коли його слід видалити.
Скрипт підключення — міцніша версія, бо він додає виняток знову після кожного з’єднання, а не сподівається, що запис вижив. Два рядки нижче належать тому, що запускає тунель, а не скрипту входу.
rasdial Office
route add 198.51.100.30 mask 255.255.255.255 10.0.0.1 metric 1 if 7
Те, що піднімає тунель, — правильне місце для другого рядка, і rasdial повертається лише після встановлення з’єднання, тож маршрут лягає за власними записами адаптера. Запустіть його знову після пробудження, бо призупинення може скинути маршрут і залишити тунель піднятим. Якщо завдання зворотне — заштовхнути один префікс у тунель, а решту лишити локально, — тоді Add-VpnConnectionRoute і є правильний інструмент.
Маршрутизація не може вибрати процес
Іноді вимога вужча за призначення: одна програма має йти локальним шляхом, а все інше лишатися в тунелі. Маршрутизація не може це виразити, бо вона зіставляє адреси, а не процеси. Робочий шаблон штовхає проблему в засіб запуску.
Тримайте профіль поза маршрутом за замовчуванням і запускайте ту єдину програму, прив’язану до адреси локального інтерфейсу, тож виняток стає командою запуску, а тунель зберігає те, що вже обробляв. У таблиці маршрутизації нічого не змінюється, тому це переживає перепідключення. Це також означає, що тунель не повинен володіти маршрутом за замовчуванням від самого початку, тож це інший дизайн, а не латка на попередній.
Її слабкість — операційна, а не технічна. Програма завжди має запускатися через обгортку, і якщо прив’язка зникла після пробудження, вона тихо бере будь-який шлях, який пропонує таблиця. Це припустимо для браузера, який ви відкриваєте навмисно, і неприпустимо для всього, що ніколи не повинно виходити з тунелю.
З’єднання для окремих користувачів це теж не вирішують. Windows може обмежити з’єднання обліковим записом, поки таблиця маршрутизації лишається спільною для всієї машини, тож з’єднання, прив’язане до запису й таке, що тримає маршрут за замовчуванням, усе одно перенаправляє кожен процес на машині, зокрема інші сеанси. Обмеження стає справжнім лише тоді, коли область маршруту збігається з обліковим записом. Двоє людей, які ділять один ноутбук, отже ділять одну таблицю, і другий успадковує той тунель, який запустив перший.
Підтвердьте, що виняток пережив перепідключення
Перевірте зміну так, як вона зазнає невдачі: від’єднайтеся, підключіться знову, відкрийте новий застосунок, потім запитайте одну адресу, що має лишитися локальною, і одну, що має використовувати тунель. Порівняйте обидві з Find-NetRoute у підключеному стані.
Якщо префікс відсутній у таблиці після перепідключення, він живе в неправильному об’єкті, а не в неправильному форматі. Перемістіть його на фізичний інтерфейс і повторіть тест. Зберігайте обидва виводи команд разом із записом про зміну, бо знімок робочого стану пізніше відповідає на більше питань, ніж абзац пояснень. Наступна людина захоче знати, що дало підключення, а не що ви мали намір отримати.