Puncte:0

Proxy de ieșire folosind mai multe adrese IP publice pe EC2

drapel br

Avem o grămadă de servere backend sub formă de instanțe EC2 bazate într-o subrețea privată în AWS VPC care trebuie să comunice cu un API terță parte. Acest API limitează solicitările pe care le putem trimite pe baza adresei IP de origine și, în timp ce ne scalam configurația, am început să atingem limitele IP-ului gateway-ului NAT care este utilizat pentru tot traficul de ieșire.

Prin urmare, vreau să configurez un proxy pentru traficul de ieșire cu mai multe EIP-uri atașate. Pentru testare, folosesc în prezent o instanță Amazon Linux 2 cu 2 ENI cu câte 2 EIP-uri atașate fiecare.Serverele backend deschid un tunel SSH către proxy-ul de ieșire și mapează API-ul terță parte la un port local, o intrare în fișierul hosts al serverului redirecționează tot traficul către acel nume de gazdă către localhost și această configurare funcționează bine în general, dar traficul de ieșire de la proxy folosește întotdeauna doar primul EIP asociat.

Deci configurația mea arată astfel:

ENI1: eth0
IP1 privat: 10.0.11.81
IP2 privat: 10.0.11.82

ENI2: et1
IP3 privat: 10.0.11.52
IP4 privat: 10.0.11.53

tabel de rute original:
implicit prin 10.0.11.1 dev eth0
implicit prin 10.0.11.1 dev eth1 metric 10001
10.0.11.0/24 dev eth0 proto kernel scope link src 10.0.11.81
10.0.11.0/24 dev eth1 proto kernel scope link src 10.0.11.52
169.254.169.254 dev eth0

Acum vreau să pot specifica ce server backend utilizează ce EIP atunci când apelez API-ul prin proxy-ul de ieșire. Prima mea încercare a fost următoarea:

  • configurați 4 utilizatori diferiți pe gazda proxy
  • adăugați reguli iptable pentru fiecare utilizator astfel: iptables -t nat -m proprietar --uid-owner user1 -A POSTROUTING -j SNAT --to IP1 etc.
  • aceasta funcționează pentru cele 2 IP-uri care sunt atașate la ENI primar (adică eth0 în mașină), dar nu funcționează pentru cele 2 IP-uri asociate cu al doilea ENI (eth1)
  • adăugând -o eth1 nici la declarație nu a funcționat

Următoarea mea încercare a fost să creez tabele de rutare personalizate pentru fiecare adresă IP și să le potrivesc cu regulile politicii:

  • creați un tabel de rute personalizat, adică pentru IP3:
implicit prin 10.0.11.1 dev eth1
10.0.11.0/24 dev eth1 proto static scope link src 10.0.11.52
169.254.169.254 dev eth1 scope link
  • creați o regulă iptables pentru a marca traficul care provine de la user3: -A OUTPUT -m proprietar --uid-owner 1003 -j MARK --set-xmark 0x3/0xffffffff
  • creați o regulă pentru a utiliza tabelul de rute personalizat pentru toate pachetele marcate cu 3: 32763: din toate opțiunile de căutare fwmark 0x3 ip3
  • acest lucru din nou nu funcționează. pachetele sunt tratate diferit. toți utilizatorii pot comunica cu lumea, cu excepția utilizatorului3 din exemplul de mai sus.

ce fac greșit? Există ceva banal care îmi lipsește sau întreaga mea abordare este sortită eșecului? Sunt foarte deschis la sugestii, atât pentru ca această configurație să funcționeze, cât și pentru abordări alternative...

Mulțumesc mult anticipat!

Tim avatar
drapel gp
Tim
O soluție mai simplă ar fi un gateway NAT per subrețea/AZ, cu rutarea configurată corespunzător. Instanța NAT în loc de gateway-uri NAT ar fi mai ieftină, dar necesită mai multă configurare/întreținere. Răspunsul lui John este probabil cel mai bun totuși, creșteți limita.
drapel br
Proxy-ul de ieșire este garanția mea. Reorganizarea subrețelelor, mutarea serverelor etc. va reprezenta un efort mult mai mare decât simpla redirecționare a unei părți a traficului de ieșire printr-un tunel SSH. Acest lucru se poate face mașinilor existente cu impact minim asupra arhitecturii și fără timpi de nefuncționare.
Puncte:3
drapel cn

Contactați organizația care rulează API-ul și explicați situația. Crearea unei relații de afaceri este un bun început pentru rezolvarea problemei.

Implementați IPv6 pentru a reduce complexitatea tehnică. AWS vă va oferi un /64 per subrețea de spațiu public, permițând comunicarea directă între instanțele dvs. și API. Adresa unică, de exemplu, face evident că vă extindeți cu adevărat. A cere ca rețelele tale să fie permise o cotă mai mare devine mai ușor, deoarece toate sunt în VPC-ul tău /56.

drapel br
Mulțumiri! Creșterea limitei ar fi într-adevăr o opțiune pe care încă nu am luat-o în considerare. IPv6 nu este, din păcate, acceptat de ei, altfel ar fi fost prima mea alegere. M-am gândit să segmentez în continuare subrețeaua pentru a putea adăuga mai multe gateway-uri NAT și a răspândi încărcarea sau chiar a muta toate serverele backend într-o subrețea publică pentru a le putea atribui EIP-uri individuale direct. Dar aș dori să evit să mut serverele backend cu acces la baze de date într-o subrețea publică și resegmentarea configurației curente reprezintă, de asemenea, un efort considerabil. Proxy-ul de ieșire părea un bun stopgap.
Puncte:0
drapel br

La urma urmei, am găsit o soluție și am documentat-o ​​aici: Cel mai bun mod de a direcționa traficul pe baza utilizatorului conectat printr-o anumită rută redundantă?

Doar în cazul în care cineva se împiedică de asta în viitor.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.