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

Гэтае кіраўніцтва ахоплівае звычайны выпадак: ноўтбук на 192.168.20.0/24, шлюз VPN з адрасам LAN 192.168.20.5 і ўдаленая сетка 10.70.0.0/24 за гэтым шлюзам. Усе каманды ніжэй мяркуюць, што вы на ноўтбуку, калі не сказана іншае.

Два адрасы, адзін маршрут

Меркаваны запіс — 10.70.0.0/24 via 192.168.20.5. Прэфікс кажа, куды ідзе пакет; адрас via кажа, хто нясе яго туды. Ядро адмаўляецца ўсталёўваць маршрут, шлюз якога яно не можа дасягнуць праз названы вамі інтэрфейс, і гэтая адмова — уся сутнасць: наступны хоп, якому патрэбны тунель для дасяжнасці, не можа быць наступным хопам, які будуе тунель.

Такім чынам, першая праверка — не «ці працуе шлюз», а «ці шлюз на гэтым звяне». Уласная падсетка ноўтбука, яго запіс ARP ці суседа і інтэрфейс у маршруце мусяць супадаць. Адрас, які існуе толькі ўнутры 10.70.0.0/24, можа быць прызначэннем другога маршруту, але ніколі — via першага.

Да чаго наступны хоп абавязвае шлюз

Усталяванне маршруту на ноўтбуку вырашае толькі першую перадачу. Далей шлюзу патрэбны ўласны шлях: уключаная перасылка, тунельны маршрут для 10.70.0.0/24 і любая палітыка доступу, якая вызначае, хто можа ім карыстацца. На Linux гэта net.ipv4.ip_forward=1 плюс тунельны маршрут; міжсеткавы экран перад ім патрабуе правіла, якое дазваляе перасылаемы паток.

Зваротны кірунак — тая частка, якую людзі забываюць. Удалены бок мусіць мець маршрут назад да 192.168.20.0/24, або праект мусіць пераўтвараць крыніцу ноўтбука ў нешта, што ўдалены бок ведае. Працоўны ping са шлюза даказвае, што шлюз можа дасягнуць удаленай сеткі; ён нічога не кажа пра тое, ці перажывуць пакеты ноўтбука зваротную дарогу.

Праверце пошук з таго хоста, які адпраўляе

Спытайце ядро, які наступны хоп яно выбера, і прачытайце інтэрфейс у адказе:

ip route get 10.70.0.10
ip route show 10.70.0.0/24
ip neigh show 192.168.20.5

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

Затым паўтарыце тэст з правільнага месца. Запыт, створаны на шлюзе, выкарыстоўвае ўласны адрас крыніцы шлюза, што можа схаваць адсутны зваротны маршрут або палітыку, якая дазваляе толькі пэўныя крыніцы. Кіраўніцтва ip-route аддзяляе прызначэнне, шлюз і перакрыццё onlink, і гэтае перакрыццё варта зразумець, перш чым карыстацца ім.

Не выкарыстоўвайце onlink, каб падрабляць дасяжнасць

onlink кажа ядру прапусціць праверку дасяжнасці шлюза і ўсё роўна адпраўляць да яго. Ён не стварае шлях, не развязае ARP для адраса, якога няма, і не прымушае ўдалены маршрутызатар адказваць на вашым сегменце Ethernet. Ён законны для шлюзаў, якія адказваюць, але не сядзяць у далучанай падсетцы, і гэта пастка, калі яго ўжываюць, каб заглушыць памылку, якую вы не патлумачылі.

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

Тунелі пункт-пункт — гэта не Ethernet

Тунельны прыбор не робіць ARP і часта не мае значнай падсеткі суседзяў. Яго маршруты часта выглядаюць як 10.70.0.0/24 dev tun0, зусім без via, бо партнёр — адзіная іншая канчатковая кропка. Капіраванне via у стылі LAN у гэтую табліцу стварае маршрут, які ядро можа адхіліць або, горш, які паказвае на адрас, на які партнёр ніколі не адказвае.

Трымайце дзве мадэлі асобна ў кіраўніцтве: маршрут LAN мае дасяжны шлюз, тунельны маршрут мае інтэрфейс і партнёра. WireGuard, OpenVPN і IPsec прапануюць трохі розныя формы, таму запісвайце тую форму, якую вы сапраўды выкарысталі, замест абагульнення з аднаго хоста.

Дадайце, пацвердзіце, адкаціце

Уся змена — тры каманды і адна праверка, і яе трэба запісаць менавіта ў такім парадку:

sudo ip route add 10.70.0.0/24 via 192.168.20.5
ip route get 10.70.0.10
ping -c 3 10.70.0.10
sudo ip route del 10.70.0.0/24 via 192.168.20.5

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

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