Поўны тунель або маршрут да вузла: як пакінуць VPN-сервер дасяжным
Тунель ідзе праз сетку, якую ён замяняе. Параўнайце выключэнне маршруту да хоста з адзнакай сокета на ўзроўні праграмы і даведайцеся, калі кожны з іх перастае працаваць.
Дадайце маршрут па змаўчанні праз тунель, і ўласныя пакеты тунеля пойдуць па ім. Табліца тады змяшчае правіла, якое само сябе знішчае. Зашыфраванае злучэнне з серверам спрабуе ісці ўнутры злучэння, якое яно спрабуе ўсталяваць.
Два механізмы прадухіляюць гэтую пятлю. Адзін бачны ў табліцы маршрутызацыі, другі жыве ўнутры праграмы.
Унутраны і знешні трафік — гэта розныя рашэнні
Пакет праграмы трапляе ў віртуальны інтэрфейс і інкапсулюецца. Вынік — новы пакет, адрасаваны публічнаму адрасу сервера. Гэтаму пакету патрэбны маршрут у фізічнай сетцы, бо нішто ў ім не павінна трапляць у тунель.
Абодва — рашэнні маршрутызацыі, і толькі першае належыць тунелю. Калі кліент устанаўлівае маршрут па змаўчанні, які ахоплівае і сервер, знешні пакет таксама захопліваецца.
Сімптомы імгненныя і поўныя. Рукапоціск завяршаецца, і пасля нічога не ідзе, або злучэнне абрываецца ў момант усталявання маршруту. У любым выпадку keepalive больш не можа выйсці.
Варыянт першы: маршрут да хоста для вузла
Прамы падыход дадае маршрут для адраса сервера праз першапачатковы шлюз. Гэта займае адзін радок. Ён бачны кожнаму, хто чытае табліцу. Яго таксама лёгка апісаць у запісе пра змены.
Яго слабасць праяўляецца, калі змяняецца базавы шлях. Захаваны маршрут называе шлюз і інтэрфейс са старой сеткі. Пасля змены Wi-Fi гэтага шлюза можа не ісці, і маршрут застаецца, выглядае слушна і нічога не робіць.
# before the tunnel: which path reaches the endpoint?
ip route get 198.51.100.7
# pin it through the current gateway
ip route add 198.51.100.7/32 via 192.168.1.1 dev wlan0
# after the tunnel is up, confirm the pin survived
ip route get 198.51.100.7
Імя хоста ўскладняе справу. Калі вузол — гэта імя, якое развязаецца ў некалькі адрасоў, выключэнне павінна ахопліваць адрас, які фактычна выкарыстоўваецца. Пазнейшы запыт можа вярнуць тое, чаго маршрут ніколі не ахопліваў.
Варыянт другі: абараніць сокет
Іншы падыход ніколі не кранае табліцу маршрутызацыі. Кліент пазначае або абараняе сокет, які нясе тунель, таму аперацыйная сістэма адпраўляе трафік гэтага сокета па-за тунелем па палітыцы. Android прадастаўляе гэты механізм непасрэдна VPN-праграмам. Кліенты для настольных сістэм рэалізуюць эквіваленты з дапамогай адзнак міжсеткавага экрана або выклікаў прывязкі да прылады.
Перавага ў тым, што выключэнне ідзе за злучэннем, а не за захаваным шлюзам. Змена сеткі перапісвае базавы шлях, і абаронены сокет рухаецца разам з ім, бо ён ніколі не быў прывязаны да адраса. Табліца маршрутаў застаецца чыстай.
Цана — бачнасць. Нішто ў табліцы маршрутызацыі не паказвае выключэнне, таму рэцэнзент, які шукае маршрут да хоста, нічога не знойдзе і можа зрабіць выснову, што схема небяспечная. Абарона жыве ў кодзе кліента і ў правілах палітыкі, якія гэты код усталёўвае.
Як выбіраць паміж імі
Выбірайце механізм узроўню сокета, калі кліент яго падтрымлівае, бо ён перажывае змены сеткі, якія ламаюць прывязаны маршрут. Выбірайце маршрут да хоста, калі выключэнне павінна быць бачным для іншых інструментаў або калі кліент не прапануе нічога лепшага.
Ні адзін з механізмаў не адмяняе патрэбы ў тым, каб адрас сервера быў дасяжным наогул. Прыватны шлюз мае публічны адрас для праслухоўвання, і менавіта гэты адрас павінен заставацца па-за тунелем. Унутраныя сеткі за ім становяцца дасяжнымі толькі пасля ўзнікнення тунеля.
Што б вы ні выбралі, трымайце гэта пры кампаненце, якому належыць тунель. Выпадковы маршрут да хоста, дададзены ўручную, працуе да наступнай сеткі, а потым ператвараецца ў загадкавае адключэнне заўтра.