Поезддеги телефондон гана жеке тармакта жашаган backend-ке чейин бир суроону көзөмөлдө. Телефон коомдук атты чечет, 443 портундагы коомдук дарекке туташат жана кадимки TLS кол алышууну бүтүрөт. Nginx ал туташууну кабыл алат, анан VPN интерфейси аркылуу гана жеткиликтүү дарекке экинчи, толугу менен өзүнчө туташуу ачат. Телефондо эч нерсе өзгөрбөйт жана телефон туннелдин катышканын эч качан билбейт.

Бир суроону эки туташуу аркылуу көзөмөлдөө

Кирүүчү бөлүк — коомдук HTTP транзакциясы. Анын коомдук аты, коомдук сертификаты жана коноктун ошол учурдагы каалаган дареги үчүн иштеши керек жооп жолу бар. Бул жолду буза турган ар кандай өзгөрүү бардык конокторду бир эле учурда бузат. Ошондуктан коомдук бөлүк — тажрыйба жасоону эң аз каалай турган бөлүк.

Чыгуучу бөлүк жеке. Nginx кардарга айланат, ички атты чечет же туруктуу даректи колдонот жана интернеттен келген туташуудан баш тарта турган кызматка жетет.

Public client  -> frontend public address:443   (TLS, public name)
Frontend       -> VPN private backend 10.40.0.20:8443  (TLS, private name)

Аларды акылыңда өзүнчө карма, конфигурация өзүнөн эле айкын болот. Эгер бириктирсең, акырында коомдук кардарды туннелге катыштырууга аракет кыласың, жана бул дизайндагы башаламандыктын көп бөлүгү ушундан келет. Жеке бөлүк назик болушу мүмкүн. Коомдук бөлүк андай эмес.

Мунун кайсынысын болбосун куруудан мурун колдонмону жарыялоо атайын экенин ыраста. Иштеген прокси — бул да иштеген ачыкка чыгаруу, ал эми аутентификация модели чечим болушу керек, жанындагы таасир эмес.

Шлюздун аты туннелден аман өтүшү керек

Аттарды чечүүдө назик тузак бар. Эгер жеке DNS VPN профили өз шлюзу үчүн колдонгон ошол эле атты кайра жазса, кайра туташуу акырында өзү курушу керек болгон туннел аркылуу ошол шлюзга жетүүгө аракет кылышы мүмкүн. Кардарга бул ат туннел пайда боло электе чечилиши керек. Ал туннелдин ичинде чечилсе, туташууну такыр куруу мүмкүн эмес.

Шлюз жана backend үчүн өзүнчө бекитилген аттарды колдон жана чечүүчү саясатын ар бир ат өз керектөөчүсүнө керектүү дарекке чечиле тургандай чекте. Колдонмонун Host аталышын өзгөртүү бул жерде эч нерсе бербейт, анткени издөөнү VPN кардары жасайт.

Анан көлөм тууралуу ойлон. Frontend backend дарегине маршрут керек, ошондой эле коомдук кардарларга жооп берүүнү улантышы керек. Ошол хосттогу толук туннел биринчи талапты канааттандырып, экинчисин бузушу мүмкүн.

Саясат уруксат берген жерде так максатка туннел тазараак дизайн. Саясат толук туннелди талап кылган жерде frontend өзүнчө тармактык контекстке таандык, белгилүү коноктор үчүн убактылуу маршруттар менен жамалбайт.

Сервер блокун эки бөлүк те текшере тургандай жазып чык

Backend ушул ат үчүн сертификат сунуштайт деп эсептейли: backend.corp.example жана жеке даректе жооп берет. Атты текшерип жатып дарекке туташуу — прокси модулунун SNI жана ат опцияларынын так максаты.

upstream private_app {
    server 10.40.0.20:8443;
}

server {
    listen 443 ssl;
    server_name app.example.com;

    ssl_certificate     /etc/nginx/tls/app-fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/app-key.pem;

    location / {
        proxy_pass https://private_app;
        proxy_ssl_server_name on;
        proxy_ssl_name backend.corp.example;
        proxy_ssl_trusted_certificate /etc/nginx/trust/backend-ca.pem;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 3;

        proxy_set_header Host app.example.com;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Жогорудагы ар бир жол жана дарек — орун толтургуч. Маанилүүсү — текшерүүнү күйүк тута турган бөлүктөр: текшериле турган ат, ага каршы текшерүү үчүн ишеним топтому жана бекитилген чынжырга туура келген тереңдик.

proxy_set_header Host app.example.com атайын. Backend ушул коомдук келип чыгышты кабыл ала тургандай конфигурацияланышы керек жана жиберилген аталыштарга ушул frontendден гана ишениши керек. Мынаны кайра жазуу X-Forwarded-For кардар дареги менен бир прокси үчүн туура, ал эми чынжыр үчүн туура эмес, ошондуктан көп проксилүү жайгаштырууга өзүнүн ишенимдүү дарек тартиби керек.

Коомдук келип чыгышты ошондой болуп жүрүүгө мажбурлоо

Колдонмо коомдук келип чыгыш үчүн абсолюттук URL, кайра багыттоолор жана cookieлерди чыгарышы керек. Эгер ал конокту мынага багыттаса: backend.corp.example, бул конок өзү чече албаган атка жөнөтүлөт.

Муну колдонмонун колдогон тышкы URL жөндөөсү жана каралган кайра багыттоо саясаты аркылуу оңдо, жооп денелеринде хост аттарын кайра жазуу менен эмес. Кокустан алынган мазмундагы саптарды алмаштыруу кол коюлган жүктөрдү бузат жана изинен түшүү кыйын каталарды жаратат.

Cookieлер да ошондой камкордукка татыктуу. Жеке атка чектелген cookieни коомдук атты гана билген браузер эч качан жөнөтпөйт.

Nginx чын эле коомдук сокетке ээ боло аларын да ыраста. 443төгү учурдагы веб-кызмат көчүшү керек же frontend башка жерде жашашы керек, анткени эки процесс бир дарек менен портту байлай албайт.

Ар бир бөлүктү ал чындап иштеген жерде текшер

Конфигурацияны орнотулган анализатор менен ар бир кайра жүктөө алдында текшер, теруу катасы азыр кызмат кылып жаткан угуучуну кулатпасын.

Анан backend бөлүгүн frontend хостүнүн өзүнөн, Nginx колдонгон ошол эле тармактык контекстте сынап көр. Туннел аркылуу ping жеткиликтүүлүктү далилдейт жана TLS, авторизация же колдонмо жөнүндө эч нерсе айтпайт.

Акырында чыныгы хост атына кадимки сертификат текшерүү менен жаңы коомдук суроо жөнөт жана жооп денесин гана эмес, жооп жолун байка.

Эки байкоону тең жайгаштырылган конфигурация менен бирге сакта жана туннел жеткиликсиз болгондо эмне болорун жаз. Frontend көзөмөлдөнгөн upstream катасын кайтарышы керек, эч ким документтебеген башка backend-ке үнсүз өтпөшү керек. Ачык журнал сабы бар 502 — жакшы натыйжа. Күтүлбөгөн булактан кэштөлгөн барак андай эмес.

Тектеш макалалар