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!