Ичине салынган WireGuard: орто секирик өз портуна жооп бере албайт
Орто секирик баарын бир туннелге жибергенде, кирүү кызматына жооптор туура эмес жол менен чыгат. Интерфейстеги баштапкы порт эрежеси муну оңдойт.
Үч WireGuard секириги жалпы дареги жок тармакка жетет, анан орто машина угууга тийиш болгон портто жооп берүүнү токтотот. Андан ары туннел дагы эле иштейт, алыскы хост дагы эле жооп берет, сырттан үнсүз калганы орто сервердин өзү гана. Бул айкалыш баш аламан, анткени ал өзү жараткан: орто секирик өзүнүн маршруттоо таблицасына баш ийет, ал эми таблица анын жоопторун туура эмес жакка жиберет.
Орто куту менен сүйлөшкөнгө чейин иштеген чынжыр
Мисал чынжырды алалы: A кардары UDP 500 аркылуу B серверине жетет, ал эми B UDP 500 аркылуу C серверине карай уланат. C трафикти өзүнүн жалгыз шеригинин дарегинен гана кабыл алат, бул аны жалбыракка айландырат жана жүрүм-турумун жөнөкөй сактайт. B жалбырак эмес, жана бул бузулуудагы бардык кызыктуу нерсе ошол жерде болот.
Бул айырма маанилүү, анткени жалбырак менен орто ролдору карама-каршы багытта тартат. Жалбырак баарын бир туннелге кесепетсиз жибере алат, анткени ага башка эч нерсе көз каранды эмес. Орто секирик бир убакта кардарлар үчүн акыркы чекит жана алыскы жакка карай кардар, жана бул эки иш ар башка маршруттоону каалайт.
Жооп эмне үчүн туннелден чыгат
B де C-ге караган интерфейс тиешелүү демейки маршрут менен бирге AllowedIPs = 0.0.0.0/0 алып жүрөт. Ошондуктан B жараткан ар бир пакет ошол туннелге кирет, эгер кыйла так нерсе артыкчылык албаса.
A-дан B-ге адрестелген пакет келип, кабыл алынат, анткени B — багыт жана жергиликтүү жеткирүү биринчи болот. Жооп A-нын жалпы дарегине багытталган таптакыр жаңы жергиликтүү жаралган пакет, жана бул багыт туннелдеги демейки маршрутка туура келет. C аны алат, бул дарекке ээ эмес жана аны таштайт.
Симптом брандмауэр маселеси же ачкычтын дал келбестиги сыяктуу окулат, жана бул жерде экөө тең туура эмес. C жакка туннелдеги кармоо жооптор туура эмес багытка кетип жатканын көрсөтөт. Ошол бир байкоо конфигурацияны канча окугандан да көп убакыт үнөмдөйт, ошондуктан ачкычтарды өзгөртө баштаардан мурун аны жазып кой. Кармоону көрбөгөн адам туннелдин өзү бузулган деп ойлойт.
Тар оңдоо: баштапкы портко туура келген саясат эрежелери
B-нын угуучу сокетинен жооптор 500 баштапкы порту менен чыгат. Саясат эрежеси ошого туура келип, бул пакеттерди кадимки таблицага кайтара алат:
ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101
Саясат эрежелери артыкчылык тартибинде каралат, ал эми негизги таблица 32766-да турат, ошондуктан 100-дөгү эреже туннелдин демейки маршруту сүйлөгөнгө чейин суралат. Сырттан жеткиликтүү бойдон калышы керек болгон ар бир порт үчүн бир жазуу кошуңуз, андан ашык эмес, ошондо жиберилген трафик өзү үчүн курулган туннелди колдонууну улантат.
Бул ыкманын чегин билиңиз. sport селектору жергиликтүү жаралган пакеттерге туура келет, бул дал жооп учурун камтыйт жана B башка бирөө үчүн жөн гана жиберген трафикти атайын камтыбайт. B-нын артында жайгашкан кызматка дагы эле өз жообу керек, ал эми тескерисинче көрсөтүү биринчи кызмат үчүн иштеген жана экинчиси үчүн ийгиликсиз болгон оңдоону берет.
Эрежеге ээсин бер
Сунуш сабында терилген эреже интерфейс кийинки жолу кайра курулганда жоголот. WireGuard жөндөөсүндө аны интерфейс түзүлгөн жана жоюлган жерге кой:
PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100
Эгер интерфейске NetworkManager, таратуу илгичи же контейнер кирүү чекити ээлик кылса, жуп кол менен оңдолгон файлга эмес, ошол ээге таандык. Кайра туташкандан кийин күчүндөгү эрежелерди текшер, биринчи баштоодон кийин гана эмес, анткени биринчи баштоо дайыма иштеген учур.
Альтернативаларды чынчылдык менен салыштыр
Баштапкы порт эрежеси төрт чыгуу жолунун бири жана алардын эң тар. Анын туннел саясатына такыр тийбестиги артыкчылык, ошондуктан ал кийинки өзгөртүүлөрдөн аман калат. Тар оңдоолор да колдонулууну токтоткондо катуу ийгиликсиз болот, ал эми кең өзгөчөлүк себеби жок болгондон көп кийин да үнсүз иштеп турат. Эки жылдан кийин куту башка бирөөгө таандык болгондо, бул айырма талгампаздыктан маанилүү.
| Approach | What it costs | Where it breaks |
|---|---|---|
| Source-port policy rule | One rule per exposed port | Anything B forwards rather than originates |
| Destination exception route | A route pinned to specific client addresses | Clients whose address changes |
| Stop full-tunnelling on B | Loses the catch-all path toward C | Designs that depend on it |
| Split into two tunnels | More interfaces and more policy | Nothing, at the cost of complexity |
Тандагандан кийин эки четинен текшер. A-дан B портуна туташууну баштап, аны бир аз бош эмес карма. B-де ядрого жооп жолун ip route get <address-of-A> sport 500 сыяктуу нерсе менен негиздетүүгө мажбурла жана ал туннелди эмес, WAN интерфейсин атаарын ыраста. Андан кийин C-нын артындагы бир нерсе дагы эле чынжыр аркылуу жооп берерин текшер, бул өзгөчөлүктүн айланып өтүүгө айланбай тар бойдон калганын далилдейт. Акырында портторду дизайн жазууларына жаз, болбосо кийинки оператор муну башка кызматта кайра ачат.