VPN kliento adreso išsaugojimas iki pat programos reiškia, kad kiekviena žurnalo eilutė ir kiekvienas leidžiamųjų sąrašo įrašas reiškia tą patį. Perrašymas debesijos pakraštyje padaro maršrutų lentelę paprastesnę, o žurnalus mažiau naudingus. Nė vienas pasirinkimas savaime nėra klaidingas, o jį lemiantis argumentas retai susijęs su našumu. Sprendžia trys sąlygos: ar programa turi žinoti, kuris žmogus prisijungė, ar debesijos audinys priims šaltinį, kurį ketinate siųsti, ir kas vėliau prisiims atgalinio maršruto atsakomybę.

Sprendžia trys sąlygos

Pradėkite nuo programos reikalavimo, o ne nuo tinklo diagramos. Jei autorizacija ar auditas priklauso nuo atskiro kliento adreso, jo išsaugojimas yra funkcinis reikalavimas, o vertimas yra regresija. Jei programai reikia žinoti tik tai, kad srautas atėjo nuotolinės prieigos keliu, išversto adreso pakanka ir tai daug pigiau eksploatuoti.

Antroji sąlyga mechaninė. Virtualus tinklas automatiškai nepasitiki paketu, kuris teigia adresą, kuris nebuvo priskirtas siunčiančiai sąsajai. Dauguma debesijos audinių tai įgyvendina įvairiais būdais ir skirtingais pavadinimais, o dizainas, kuris to nepaiso, diagramoje atrodys teisingai, o produkcijoje tyliai kris.

Trečioji organizacinė. Šaltinių išsaugojimas reiškia, kad programos potinklio maršrutų lentelė turi rodyti atgal į šliuzą kliento prefiksui, ir kiekviena komanda, kuri vėliau prideda potinklį, turi išlaikyti tą maršrutą nuoseklų. Tai vienkartinė maža kaina ir pasikartojanti kaina per dešimtis paskyrų. Nuspręskite, kas ją moka, prieš pažadėdami elgseną.

Maršrutas nėra leidimas klastoti

Grįžtamojo maršruto pridėjimas pasako jūsų potinkliui, kur turi eiti atsakymai. Tai nepasako audiniui, kad egzempliorius, persiunčiantis tuos paketus, turi teisę juos siųsti su svetimu šaltiniu. AWS atitinkama kontrolė yra šaltinio ir paskirties tikrinimas, ir jis matomas kiekvienam egzemplioriui:

aws ec2 describe-instances --instance-ids i-0a1b2c3d4e5f60718 \
  --query "Reservations[].Instances[].SourceDestCheck"
aws ec2 modify-instance-attribute --instance-id i-0a1b2c3d4e5f60718 \
  --no-source-dest-check

Išjunkite tai tik egzemplioriui, kurio dokumentuotas darbas yra persiuntimas, ir niekam kitam. Kiekviena programos VM, kuri palieka patikrą įjungtą, yra viena mašina mažiau, kurią galima naudoti siųsti srautą su pasiskolintu šaltiniu. Jei jūsų platforma ne AWS, ieškokite atitinkamo apsaugos nuo klastojimo ar leidžiamų adresų nustatymo, o ne manykite, kad elgsena persikels.

Greitas paketų fiksavimas išsprendžia klausimą greičiau nei konsolės skaitymas. Jei atsakymai išeina, o klientas jų niekada nemato, audinys atmeta suklastotą šaltinį, o ne programa nepavyksta.

Ką perka vertimas ir kiek tai kainuoja

Šaltinio perrašymas šliuze pašalina atgalinio kelio problemą. Programa mato vieną adresą, kurį jau žino kaip pasiekti, ir kliento prefiksas niekada neturi atsirasti debesijos maršrutų lentelėje. Linux tai taisyklė yra viena eilutė, ir verta parašyti kuo siauresnę versiją:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 172.20.8.0/24 -o ens5 -j SNAT --to-source 10.40.3.10

Atkreipkite dėmesį, ką programa dabar įrašo: 10.40.3.10 kiekvienam naudotojui, kiekviename ryšyje, amžinai. Bet koks adresų leidžiamųjų sąrašas, pastatytas ant šios reikšmės, dabar suteikia prieigą visai nuotolinės prieigos populiacijai, ir bet kokia incidento apžvalga turi grįžti į šliuzą atsakyti, kas tai buvo.

Sprendimas ne atsisakyti vertimo, o nustoti apsimetinėti, kad adresas yra tapatybė. Neškite kliento tapatybę autentifikuotame lauke, įrašykite ją šliuze kartu su išverstu kortu, ir leiskite programai prisijungti pagal jį. Be sujungimo rakto vertimas paverčia tinklo problemą nuolatine teismo ekspertizės problema.

Relė yra kita sąsaja

Atvirkštinis tarpinis serveris prieš programą visiškai apeina maršrutizuoto kelio klausimą. Tarpinis serveris atidaro savo backend ryšį, todėl kliento prefiksas niekada neturi būti maršrutizuojamas virtualiame tinkle, o programa gali gauti tapatybę antraštėje, kurią nustato tarpinis serveris.

Ta antraštė patikima tik tada, kai backend ją priima iš tarpinio serverio ir iš nieko kito. nginx terminais tai reiškia aiškiai įvardyti patikimą partnerį, o ne tikėti viskuo, kas ateina:

set_real_ip_from 10.40.3.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

Bet kuris klientas, galintis tiesiogiai pasiekti backend, gali suklastoti tą pačią antraštę, todėl backend turi būti nepasiekiamas, išskyrus per tarpinį serverį. Tai užkardos faktas, o ne konfigūracijos nuomonė, ir būtent šios prielaidos žmonės praleidžia kopijuodami fragmentą.

Relė taip pat keičia, ką perkate. Gaunate programos lygio tapatybę ir natūralią vietą ją registruoti; atsisakote bendrumo, nes kiekvienas naujas protokolas turi savo tarpinio serverio palaikymą. HTTP paslaugoms šis mainai paprastai geri, o viskam, kas nėra HTTP, paprastai visai neprieinami.

Užrašykite, ką mato kiekviena riba

Kad ir ką pasirinktumėte, dizaino apžvalga turėtų baigtis viena lentele, kuri įvardija šaltinio adresą ir įrodomą tapatybę kiekviename šuolyje. Be jos pirmasis incidentas sukuria tris komandas, kurių kiekviena aprašo skirtingą klientą.

BoundarySource the next hop seesWhat is actually proven
Client to gateway172.20.8.14A certificate or credential was presented
Gateway to app subnet, preserved172.20.8.14The same session, if the return route exists
Gateway to app subnet, translated10.40.3.10Only that traffic came through the gateway
Proxy to backend10.40.3.10 plus a headerThe proxy asserted an identity it authenticated

Tada rinkitės. Išsaugokite šaltinį, kai programos autorizacija tikrai priklauso nuo kliento adreso ir galite prisiimti maršrutą. Versti, kai taip nėra ir galite nešti tapatybę už juostos, ir naudokite AWS persiuntimo egzempliorių gaires platformai būdingiems persiuntimo nustatymams. Kreipkitės į relę, kai paslauga kalba HTTP ir norite, kad tapatybė nustotų būti adresu.

Susiję straipsniai