Docker порттарын жариялау және VPN: жауап қайда кетеді
Жарияланған контейнер кері NAT-қа дейін өз мекенжайынан жауап береді. Екі дизайн сол жауапты қоғамдық жолда ұстай алады, бірақ шығындары әртүрлі.
Толық туннельді VPN көтерілгеннен кейін хост SSH-ға жауап беруді жалғастырады, ал сол машинадағы Docker арқылы жарияланған қызмет үнсіз қалады. Тыңдаушыда ешқандай ақау жоқ: контейнер жұмыста, порт картасы бар және пакет жетеді. Контейнер сау, сұраныс шынымен оған жетеді. Айырмашылық — Linux өз маршрутын таңдаған кезде жауаптың қайдан басталатынында, және сол айырмашылық төмендегі екі дизайнның қайсысы керектігін анықтайды.
Tuple-ды мақсатты 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
Хосттың маршрут шешімінде жауап әлі де контейнердің бастапқы мекенжайын алып жүреді. Кері аудару жарияланған tuple-ды кейінірек қалпына келтіреді, сондықтан пакет дәл маршрут таңдалған сәтте қате көрінеді.
Неліктен тек хостқа арналған ереже оны өткізіп жібереді
WAN кестесін тек 192.0.2.10 мекенжайынан келген пакеттерге таңдайтын ереже хосттың өз демондарын қамтиды және бұл қайта бағытталған жауапты мүлдем өткізіп жібереді. Жауаптағы бастапқы мекенжай — 172.30.240.5, хост емес.
Шамадан тыс түзету — контейнерден бәрін WAN арқылы маршруттау, бұл контейнердің байланыссыз шығыс қосылымдарын да VPN-нен босатады. Бұл сұралған саясаттан өзгеше және әдетте кейінірек біреуді таңқалдырады.
DNAT-тан кейінгі сәйкестендіру — басқа hook
Docker-дің firewall құжаттамасы мынаны атап өтеді: қарапайым пайдаланушы сүзгісі DNAT-тан кейінгі мақсатты көреді, сондықтан қарапайым ережеде жарияланған 2222 портын сәйкестендіру контейнердің 22 портын сәйкестендірумен бірдей емес. Егер бастапқы tuple маңызды болса, қай порт көрінетінін болжаудың орнына қолдау көрсетілетін бастапқы мақсат механизмін пайдаланыңыз.
Hook-тардың бұл шатасуы дұрыс көрінетін және ешқашан сәйкеспейтін ережелер тудырады. Саясатты қайта жазбас бұрын ереженің өзіндегі есептегіштерді тексеріңіз. Нөлдік соққысы бар ереже пакет ешқашан жетпейтін жерде бағаланып жатқанын айтады.
Дизайн A: шешімді қосылым күйі ретінде алып жүру
Қосылым белгісі кіру шешімін аудару арқылы алып жүре алады, бірақ ол маңызды маршрут іздеуінің алдында пакетке қайтарылуы керек. Кезеңдер:
- Docker-мен, VPN-мен немесе басқа саясат иесімен қақтығыспайтын белгі өрісі мен ереже басымдығын бөліңіз.
- Тек көзделген жаңа WAN қосылымын қосылымды бақылау қолжетімді DNAT алдындағы нүктеде анықтаңыз.
- Шешімді қосылым белгісіне жазыңыз, бастапқы сұраныстың өзін WAN кестесіне мәжбүрлемей.
- Жауап бағытында маршруттау алдында пакетке тек өз белгі биттеріңізді қайтарыңыз.
- VPN ережесі бірінші жеңе алмайтындай етіп толық WAN кестесін жеткілікті ерте таңдаңыз.
Бұл кестеге нақты қосылған маршруттар мен шлюз керек. Маршрут жоқ кездегі анықталған мінез-құлық та керек. Туннельге үнсіз құлау — ең нашар нәтиже, өйткені конфигурация әлі де жұмыс істеп тұрғандай көрінеді. Оның орнына жабық түрде сәтсіздікке ұшыраңыз және оны журналға жазыңыз.
Дизайн B: хостта аяқтау
Хост жағында әдейі конфигурацияланған фронтенд, мысалы TCP прокси немесе контейнер алдындағы кері прокси, жауапты хост мекенжайынан шығарып ұстайды. Сонда хостқа жазылған ережелер күткендей әрекет етеді, ал контейнер өз жеке желісінде қалады.
Бағасы — өз конфигурациясы, бастапқы мекенжайды өңдеуі және қатынауды бақылауы бар тағы бір қозғалмалы бөлік. Бұл әдетте қарапайым қолдау көрсетілетін шекара және маршруттау саясатын кетуі мүмкін бір адам ұстайтын болса, жиі дұрыс жауап болады.
Өзгерісті тексеріңіз, ниетті емес
Қоғамдық жақтан жаңа рұқсат етілген қосылым ашып, жауаптың көзделген интерфейстен шығатынын растаңыз. Содан кейін контейнер бастаған байланыссыз сұраныстың әлі де VPN-ге ілесетінін тексеріңіз.
Бір ережені сынау үшін машинаның қосылым кестесін тазартпаңыз: бар жазбалар бұрынғы картасын сақтайды, ал тазарту хосттағы қалғанның бәрін бұзады. Портты жариялау қолжетімділікті анықтайды. Ол жауап жолын анықтамайды. Таңдалған дизайнды оның кесте атауларымен жазып қойыңыз, келесі адам оқиға кезінде оны қайта ашпауы үшін.