Публікацыя партоў Docker супраць VPN: куды ідзе адказ
Апублікаваны кантэйнер адказвае са свайго адраса да зваротнага NAT. Дзве схемы могуць утрымаць гэты адказ на публічным шляху, з рознымі выдаткамі.
Хост працягвае адказваць па SSH пасля ўзняцця VPN з поўным тунэлем, а служба, апублікаваная праз Docker на той жа машыне, змаўкае. З слухачом усё ў парадку: кантэйнер запушчаны, адлюстраванне порта існуе, і пакет прыходзіць. Кантэйнер здаровы, і запыт сапраўды да яго даходзіць. Розніца ў тым, адкуль пачынаецца адказ, калі Linux выбірае маршрут, і гэтая розніца вызначае, якая з дзвюх схем ніжэй вам патрэбна.
Праследуйце картэж праз NAT прызначэння
Вазьміце хост 192.0.2.10 які публікуе TCP 2222 на кантэйнер 172.30.240.5:22. Запыт ад 198.51.100.25 пераўтвараецца перад тым, як дасягнуць кантэйнера, і кантэйнер адказвае ад сябе.
WAN request: 198.51.100.25 -> 192.0.2.10:2222
after DNAT: 198.51.100.25 -> 172.30.240.5:22
container reply: 172.30.240.5:22 -> 198.51.100.25
У момант рашэння хоста аб маршруце адказ усё яшчэ нясе адрас крыніцы кантэйнера. Зваротнае пераўтварэнне аднаўляе апублікаваны картэж пазней, і менавіта таму пакет выглядае няправільным у той самы момант, калі выбіраецца маршрут.
Чаму правіла толькі для хоста гэта прапускае
Правіла, якое выбірае табліцу WAN толькі для пакетаў з 192.0.2.10 ахоплівае ўласныя дэманы хоста і цалкам прапускае гэты перанакіраваны адказ. Адрас крыніцы ў адказе — 172.30.240.5, а не хост.
Надмернае выпраўленне — накіроўваць усё з кантэйнера праз WAN, што таксама вызваляе незвязаныя зыходныя злучэнні кантэйнера ад VPN. Гэта іншая палітыка, чым тая, якую ў вас прасілі, і звычайна яна кагосьці здзіўляе пазней.
Супастаўленне пасля DNAT — гэта іншы хук
Дакументацыя Docker па брандмаўэры адзначае, што звычайная фільтрацыя карыстальніка бачыць прызначэнне пасля DNAT, таму супастаўленне апублікаванага порта 2222 у звычайным правіле не тое ж самае, што супастаўленне порта кантэйнера 22. Калі зыходны картэж мае значэнне, выкарыстоўвайце падтрыманы механізм зыходнага прызначэння замест здагадак, які порт бачны.
Гэтая блытаніна з хукамі спараджае правілы, якія выглядаюць правільнымі і ніколі не спрацоўваюць. Праверце лічыльнікі на самім правіле, перш чым перапісваць палітыку. Правіла з нулём трапленняў кажа вам, што яно ацэньваецца там, куды пакет ніколі не даходзіць.
Схема A: несці рашэнне як стан злучэння
Метка злучэння можа перанесці рашэнне аб уваходзе праз пераўтварэнне, але яна павінна быць вернута пакету да таго пошуку маршруту, які мае значэнне. Этапы такія:
- Зарэзервуйце поле меткі і прыярытэт правіла, якія не сутыкаюцца з Docker, VPN або іншым уладальнікам палітыкі.
- Вызначце толькі патрэбнае новае злучэнне WAN у кропцы да DNAT, дзе даступна адсочванне злучэнняў.
- Запішыце рашэнне ў метку злучэння, не прымушаючы сам зыходны запыт ісці ў табліцу WAN.
- У кірунку адказу вярніце пакету толькі свае біты меткі перад маршрутызацыяй.
- Выберыце поўную табліцу WAN дастаткова рана, каб правіла VPN не магло перамагчы першым.
Гэтай табліцы патрэбны рэальныя падключаныя маршруты і шлюз. Ёй таксама патрэбны вызначаны паводзіны, калі маршрут адсутнічае. Ціхае правалванне ў тунэль — найгоршы вынік, бо канфігурацыя ўсё яшчэ выглядае працоўнай. Замест гэтага адмаўляйце закрыта і запісвайце гэта ў журнал.
Схема B: завяршаць на хосце
Наўмысна наладжаны фронтэнд на баку хоста, напрыклад TCP-проксі або зваротны проксі перад кантэйнерам, трымае адказ такім, што ён выходзіць з адраса хоста. Правілы, напісаныя для хоста, тады працуюць як чакалася, а кантэйнер застаецца ў сваёй прыватнай сетцы.
Кошт — яшчэ адзін рухомы элемент са сваёй канфігурацыяй, апрацоўкай адраса крыніцы і кантролем доступу. Звычайна гэта больш просты падтрыманы мяжа, і часта гэта правільны адказ, калі палітыку маршрутызацыі падтрымліваў бы адзін чалавек, які можа сысці.
Правярайце змену, а не намер
Адкрыйце новае дазволенае злучэнне з публічнага боку і пераканайцеся, што адказ выходзіць праз патрэбны інтэрфейс. Затым праверце, што незвязаны запыт, ініцыяваны кантэйнерам, па-ранейшаму ідзе праз VPN.
Не ачышчайце табліцу злучэнняў машыны, каб пратэсціраваць адно правіла: існуючыя запісы захоўваюць ранейшае адлюстраванне, а ачыстка ламае ўсё астатняе на хосце. Публікацыя порта вызначае дасяжнасць. Яна не вызначае шлях адказу. Запішыце абраныя схемы з назвамі іх табліц, каб наступны чалавек не адкрываў іх нанова падчас інцыдэнту.