Perché abbiamo bisogno della sottorete privata in VPC?


127

Esistono 4 scenari nella configurazione di AWS VPC. Ma diamo un'occhiata a questi due:

  • Scenario 1: 1 sottorete pubblica.
  • Scenario 2: 1 sottorete pubblica e 1 sottorete privata.

Poiché qualsiasi istanza avviata nella sottorete pubblica non ha EIP (a meno che non sia assegnato), non è già indirizzabile da Internet. Poi:

  • Perché è necessaria una sottorete privata?
  • Quali sono esattamente le differenze tra le sottoreti pubbliche e private?

4
La sottorete privata, anche dopo aver assegnato un IP pubblico alle macchine all'interno, è ancora inaccessibile dall'Internet pubblico. Creo configurazioni VPC ad esempio con un server Web in una sottorete pubblica e il mio back-end del database nella sottorete privata. Posso connettermi con il gateway del cliente per accedere alle macchine su entrambe le sottoreti private e pubbliche.
user602525

Risposte:


239

Aggiornamento: a fine dicembre 2015, AWS ha annunciato una nuova funzionalità, un Managed NAT Gateway per VPC . Questo servizio facoltativo fornisce un meccanismo alternativo per le istanze VPC in una sottorete privata per accedere a Internet, dove in precedenza la soluzione comune era un'istanza EC2 su una sottorete pubblica all'interno del VPC, funzionante come "istanza NAT", che fornisce la traduzione dell'indirizzo di rete ( tecnicamente, traduzione dell'indirizzo di porta ) per istanze in altre sottoreti private, consentendo a tali macchine di utilizzare l'indirizzo IP pubblico dell'istanza NAT per l'accesso a Internet in uscita.

Il nuovo servizio NAT gestito non cambia sostanzialmente l'applicabilità delle seguenti informazioni, ma questa opzione non è trattata nel contenuto che segue. È comunque possibile utilizzare un'istanza NAT come descritto, oppure è possibile eseguire il provisioning del servizio Gateway NAT gestito. Sarà disponibile una versione estesa di questa risposta che integra ulteriori informazioni su NAT Gateway e su come si confronta con un'istanza NAT, poiché entrambe sono rilevanti per il paradigma della sottorete privata / pubblica in VPC.

Si noti che Internet Gateway e NAT Gateway sono due diverse funzionalità. Tutte le configurazioni VPC con accesso a Internet avranno un oggetto virtuale Internet Gateway.


Per comprendere la distinzione tra sottoreti "private" e "pubbliche" in Amazon VPC è necessario comprendere come funzionano in generale il routing IP e la traduzione degli indirizzi di rete (NAT) e come vengono specificamente implementati in VPC.

La differenziazione principale tra una sottorete pubblica e privata in VPC è definita da quale sia la route predefinita di quella sottorete, nelle tabelle di routing VPC.

Questa configurazione, a sua volta, determina la validità dell'utilizzo o meno di indirizzi IP pubblici su istanze su quella particolare sottorete.

Ogni subnet ha esattamente una route predefinita, che può essere solo una delle due cose:

  • l'oggetto "Internet Gateway" del VPC, nel caso di una sottorete "pubblica", oppure
  • un dispositivo NAT, ovvero un gateway NAT o un'istanza EC2, che svolge il ruolo di "istanza NAT", nel caso di una sottorete "privata".

Internet Gateway non esegue alcuna traduzione dell'indirizzo di rete per istanze senza indirizzi IP pubblici, quindi un'istanza senza un indirizzo IP pubblico non può connettersi a Internet verso l' esterno - per fare cose come il download di aggiornamenti software o l'accesso ad altre risorse AWS come S3 1 e SQS - se la route predefinita sulla sua sottorete VPC è l'oggetto Internet Gateway. Quindi, se sei un'istanza su una sottorete "pubblica", allora hai bisogno di un indirizzo IP pubblico per fare un numero significativo di cose che i server comunemente devono fare.

Per le istanze con solo un indirizzo IP privato, esiste un modo alternativo di accesso in uscita a Internet. Qui entra in gioco Network Address Translation² e un'istanza NAT.

Le macchine su una sottorete privata possono accedere a Internet perché il percorso predefinito su una sottorete privata non è l'oggetto "Internet Gateway" VPC - è un'istanza EC2 configurata come istanza NAT.

Un'istanza NAT è un'istanza su una sottorete pubblica con un IP pubblico e una configurazione specifica. Ci sono AMI pre-costruite per fare questo, o puoi costruirne una tua.

Quando le macchine private indirizzano il traffico verso l'esterno, il traffico viene inviato da VPC all'istanza NAT, che sostituisce l'indirizzo IP di origine sul pacchetto (l'indirizzo IP privato della macchina privata) con il proprio indirizzo IP pubblico, invia il traffico su Internet, accetta i pacchetti di risposta e li inoltra all'indirizzo privato della macchina di origine. (Può anche riscrivere la porta di origine e, in ogni caso, ricorda i mapping in modo da sapere quale macchina interna dovrebbe ricevere i pacchetti di risposta). Un'istanza NAT non consente a alcun traffico in ingresso "imprevisto" di raggiungere le istanze private, a meno che non sia stato specificamente configurato per farlo.

Pertanto, quando si accede a una risorsa Internet esterna da una sottorete privata, il traffico attraversa l'istanza NAT e sembra che la destinazione abbia avuto origine dall'indirizzo IP pubblico dell'istanza NAT ... quindi il traffico di risposta ritorna all'istanza NAT. Né il gruppo di sicurezza assegnato all'istanza NAT né il gruppo di sicurezza assegnato all'istanza privata devono essere configurati per "consentire" questo traffico di risposta, poiché i gruppi di sicurezza sono stateful. Si rendono conto che il traffico di risposta è correlato alle sessioni originate internamente, quindi è automaticamente consentito. Il traffico imprevisto viene ovviamente negato a meno che il gruppo di sicurezza non sia configurato per consentirlo.

A differenza del routing IP convenzionale, in cui il gateway predefinito si trova sulla stessa sottorete, il modo in cui funziona in VPC è diverso: l'istanza NAT per una determinata sottorete privata è sempre su una sottorete diversa e quell'altra sottorete è sempre una sottorete pubblica, perché l'istanza NAT deve avere un IP esterno pubblico e il suo gateway predefinito deve essere l'oggetto "Internet Gateway" VPC.

Allo stesso modo ... non è possibile distribuire un'istanza con un IP pubblico su una sottorete privata. Non funziona, perché il percorso predefinito su una sottorete privata è (per definizione) un'istanza NAT (che esegue NAT sul traffico) e non l'oggetto Internet Gateway (che non funziona). Il traffico in entrata da Internet colpirebbe l'IP pubblico dell'istanza, ma le risposte proverebbero a instradare verso l'esterno attraverso l'istanza NAT, il che eliminerebbe il traffico (poiché sarebbe composto da risposte a connessioni di cui non è a conoscenza, quindi sarebbe considerato non valido) o riscriverebbe il traffico di risposta per utilizzare il proprio indirizzo IP pubblico, che non funzionerebbe poiché l'origine esterna non avrebbe accettato risposte provenienti da un indirizzo IP diverso da quello con cui stavano tentando di avviare le comunicazioni .

In sostanza, quindi, le designazioni "private" e "pubbliche" non riguardano realmente l'accessibilità o l'inaccessibilità da Internet. Riguardano i tipi di indirizzi che verranno assegnati alle istanze su quella sottorete, il che è rilevante a causa della necessità di tradurre - o evitare di tradurre - quegli indirizzi IP per le interazioni Internet.

Poiché VPC ha route implicite da tutte le subnet VPC a tutte le altre subnet VPC, la route predefinita non ha un ruolo nel traffico VPC interno. Le istanze con indirizzi IP privati ​​si collegheranno ad altri indirizzi IP privati ​​nel VPC "dal" loro indirizzo IP privato, non "dal" loro indirizzo IP pubblico (se ne hanno uno) ... purché l'indirizzo di destinazione sia un altro indirizzo privato all'interno del VPC.

Se le tue istanze con indirizzi IP privati ​​non devono mai, in nessun caso, originare traffico Internet in uscita, potrebbero tecnicamente essere distribuite su una sottorete "pubblica" e sarebbero comunque inaccessibili da Internet ... ma in una tale configurazione, è impossibile per loro originare il traffico in uscita verso Internet, che include ancora connessioni con altri servizi di infrastruttura AWS, come S3 1 o SQS.


1. Per quanto riguarda S3, in particolare, affermare che l'accesso a Internet è sempre necessario è una semplificazione eccessiva che probabilmente aumenterà nel tempo e si diffonderà ad altri servizi AWS, poiché le capacità di VPC continuano a crescere ed evolversi. Esiste un concetto relativamente nuovo chiamato endpoint VPCche consente alle tue istanze, comprese quelle con solo indirizzi IP privati, di accedere direttamente a S3 da sottoreti selezionate all'interno del VPC, senza toccare "Internet" e senza utilizzare un'istanza NAT o un gateway NAT, ma ciò richiede una configurazione aggiuntiva, ed è utilizzabile solo per accedere a bucket all'interno della stessa area AWS del VPC. Per impostazione predefinita, S3 - che è, al momento della stesura di questo documento, l'unico servizio che ha esposto la capacità di creare endpoint VPC - è accessibile solo dall'interno di VPC via Internet. Quando si crea un endpoint VPC, viene creato un elenco di prefissi (pl-xxxxxxxx) che è possibile utilizzare nelle tabelle di route VPC per inviare il traffico associato a quel particolare servizio AWS direttamente al servizio tramite l'oggetto virtuale "VPC Endpoint". Risolve anche un problema di limitazione dell'accesso in uscita a S3 per un'istanza particolare, poiché l'elenco dei prefissi può essere utilizzato in gruppi di sicurezza in uscita, al posto di un indirizzo IP o blocco di destinazione - e un endpoint VPC S3 può essere soggetto a ulteriori dichiarazioni di politica , limitando l'accesso alla benna dall'interno, come desiderato.

2. Come indicato nella documentazione, ciò che viene attualmente discusso è la porta e la traduzione dell'indirizzo di rete. È comune, anche se tecnicamente un po 'impreciso, fare riferimento all'operazione combinata come "NAT". Questo è in qualche modo simile al modo in cui molti di noi tendono a dire "SSL" quando in realtà intendiamo "TLS". Sappiamo di cosa stiamo parlando, ma non usiamo la parola più corretta per descriverlo. "Nota Usiamo il termine NAT in questa documentazione per seguire la pratica IT comune, sebbene il ruolo effettivo di un dispositivo NAT sia la traduzione dell'indirizzo che la traduzione dell'indirizzo della porta (PAT)."


16
Risposta dettagliata, ma mi chiedo ancora. Qual è il vantaggio di un server su una sottorete privata con un'istanza NAT e una sottorete pubblica di un server con una rigorosa politica di sicurezza?
abhillman,

13
@abhillman non è davvero un vantaggio. Riguarda il modo in cui funziona la rete, in VPC. Tutte le istanze su una determinata sottorete devono usare lo stesso gateway predefinito, che sarà l'oggetto virtuale "Internet gateway", che non farà NAT, o sarà un'istanza NAT, che non "non farà" NAT . A meno che tutti i computer non dispongano di IP pubblici o nessuno di essi, si vorranno entrambi i tipi di sottoreti. Se tutto è un web server rivolto a Internet, certo, potresti aver bisogno solo di una sottorete pubblica e con una corretta configurazione di sicurezza, non ci sono svantaggi.
Michael - sqlbot,

1
In realtà ora è possibile accedere ad alcune risorse AWS, come S3, da VPC aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3 .
circa

2
@avloss grazie per aver riportato la mia attenzione su questo punto e la sua rilevanza per questa risposta. Sono passati quasi due anni senza molte modifiche e hai ragione: le cose continuano a evolversi. Aggiornerò questo per menzionare gli endpoint VPC.
Michael - sqlbot,

4
@VirtualJasper non dovresti voler usare tutti gli indirizzi pubblici. L'uso di indirizzi IPv4 privati ​​ove possibile è una buona pratica. Riduce la superficie di attacco. Offre un migliore controllo dell'uscita. Lo spazio degli indirizzi IPv4 è scarso e lo è sempre di più, c'è un aspetto etico nel consumare più di questa risorsa del necessario. Sembra inoltre logico che se continui a chiedere al supporto AWS di aumentare il numero consentito di indirizzi, a un certo punto inizieranno a porre domande. VPC è stato progettato per funzionare in questo modo. Riesci a invertire il sistema e utilizzare tutti gli IP pubblici? Sì. È una buona idea? No.
Michael - sqlbot,

27

Suggerirei una diversa subnet "privata" e istanze / gateway NAT. Non sono necessari Se non si desidera che la macchina sia accessibile da Internet, non inserirla in un gruppo di sicurezza che consenta tale accesso.

Eliminando l'istanza / gateway NAT, si eliminano i costi di gestione dell'istanza / gateway e si elimina il limite di velocità (sia esso 250mbit o 10gbit).

Se hai una macchina che non ha bisogno di accedere direttamente a Internet (e ti chiederei come lo stai patching *), allora non assegnare un indirizzo IP pubblico.

* Se la risposta qui è una specie di proxy, beh, stai subendo un sovraccarico, ma ognuno per il suo.


5
Non potrei essere più d'accordo. Più lavoro con le domande, meno utilizzo vedo per le sottoreti private. Sembra più una reliquia di come apparivano le reti locali e che la loro esistenza risiedeva principalmente nella familiarità. Sono sicuro che ci sono casi limite in cui potrebbero essere ancora validi, ma in termini generali, dico di non usarli. Il fatto che la parte superiore (e la risposta molto lunga) a questa domanda non risolva la domanda reale è un'indicazione della loro ridondanza.
Carl,

1
Sono completamente d'accordo con la teoria qui, ma in pratica ho scoperto che AWS ti limita per impostazione predefinita a 20 EIP per regione e sono scettico sul fatto che sarebbero disposti ad aumentare tale limite per consentire a centinaia di indirizzi IPv4 pubblici. Sono scarse risorse su Internet.
Nic,

1
@Nic Non hai bisogno di EIP, ricorda, si tratta di abbandonare il NAT - non ci interessa quale sia l'IP pubblico di una macchina senza volto e non ci importa se cambia.
Phil

1
Oggi AWS ha rilasciato IPv6 a livello globale. Lascia morire IPv4. :-)
Phil

3
L'abbandono delle sottoreti private presuppone intrinsecamente che gli errori non si verifichino mai. Con dozzine di casi e centinaia di regole di sicurezza che si incrociano tra di loro, e più personale coinvolto nella manutenzione, la possibilità che qualcuno apra accidentalmente un porto sul mondo, non può essere trascurata. Una postura difensiva che limita l'accesso del pubblico in base alla progettazione ai pochi casi che ne hanno bisogno è un approccio migliore alla sicurezza. Per quelli di voi che sono infallibili, proseguite. Per tutti noi semplici mortali, errare dal punto di vista della prudenza non è un'idea così terribile.
Jim Walker,

23

Non ho la reputazione di aggiungere un commento alla risposta di Michael sopra, quindi aggiungendo il mio commento come risposta.

Vale la pena notare che il gateway gestito AWS è ~ 3 volte più costoso rispetto alla data rispetto all'esecuzione della propria istanza. Ciò presuppone ovviamente che sia necessaria solo un'istanza NAT (ovvero che non si abbiano più istanze NAT configurate per il failover, ecc.), Che è generalmente vero per la maggior parte degli scenari di casi d'uso medio-piccoli. Supponendo un trasferimento mensile di dati di 100 GB tramite il gateway NAT,

Costo mensile dell'istanza NAT gestita = $ 33,48 / mese ($ 0,045 / ora * 744 ore al mese) + $ 4,50 ($ 0,045 per GB di dati elaborati * 100 GB) + $ 10 ($ 0,10 / GB di addebiti per il trasferimento di dati AWS standard per tutti i dati trasferiti tramite il Gateway NAT) = $ 47,98

Istanza t2.nano configurata come istanza NAT = $ 4,84 / mese ($ 0,0065 * 744 ore in un mese) + $ 10 ($ 10,00 / GB spese di trasferimento dati AWS standard per tutti i dati trasferiti tramite l'istanza NAT) = $ 14,84

Questo ovviamente cambia quando si utilizzano istanze NAT ridondanti poiché il gateway NAT gestito da AWS ha una ridondanza integrata per l'alta disponibilità. Se non ti interessano i $ 33 al mese in più, allora l'istanza NAT gestita merita sicuramente il mal di testa ridotto di non dover mantenere un'altra istanza. Se stai eseguendo un'istanza VPN (ad esempio OpenVPN) per l'accesso alle tue istanze all'interno del VPC, puoi semplicemente configurare quell'istanza in modo che funga anche da gateway NAT, quindi non devi mantenere un'istanza aggiuntiva solo per NAT ( anche se alcune persone potrebbero disapprovare l'idea di combinare VPN e NAT).


4
D'accordo, tuttavia, con l'istanza t2.nano, vedrai un throughput massimo di forse 250Mbit / sec, rispetto al picco urlante di 10 Gbit / sec da NAT Gateway. Non fraintendetemi, trovo anche i prezzi un po 'alti e ci sono altre limitazioni: sto ancora usando istanze NAT praticamente ovunque ... ma, in tutta onestà, stai pagando, in parte, per alcuni pacchetti di alimentazione grezzi piuttosto seri e la connettività di rete con il gateway.
Michael - sqlbot,

1
Ma perché NAT Gateway è così costoso? Richiede molte risorse informatiche per tradurre gli indirizzi? Posso capire che per un'applicazione davvero enorme NAT può inoltrare molte richieste da VPC, ma se parliamo della solita media impresa e di piccoli progetti $ 0,045 l'ora e ogni GB è abbastanza sopravvalutato.
Sergey Cherepanov,

15

La risposta di Michael - sqlbot presuppone implicitamente che siano richiesti indirizzi IP privati. Penso che valga la pena mettere in dubbio tale presupposto: dobbiamo prima usare gli indirizzi IP privati? Almeno un commentatore ha posto la stessa domanda.

Qual è il vantaggio di un server su una sottorete privata con un'istanza NAT [rispetto a] un server [in una] sottorete pubblica con una rigorosa politica di sicurezza? - abhillman, 24 giugno 14 alle 23:45

Immagina uno scenario in cui stai utilizzando un VPC e assegni indirizzi IP pubblici a tutte le tue istanze EC2. Non preoccuparti, ciò non significa che siano necessariamente raggiungibili su Internet, perché usi i gruppi di sicurezza per limitare l'accesso esattamente nello stesso modo in cui le cose hanno funzionato con EC2 classic. Utilizzando gli indirizzi IP pubblici hai il vantaggio di essere in grado di esporre facilmente determinati servizi a un pubblico limitato senza la necessità di utilizzare qualcosa come un ELB. Questo ti libera dalla necessità di impostare un'istanza NAT o un gateway NAT. E poiché hai bisogno della metà del numero di sottoreti, puoi scegliere di utilizzare un'allocazione CIDR più piccola per il tuo VPC o puoi creare sottoreti più grandi con lo stesso VPC delle stesse dimensioni. E meno sottoreti significa che pagherai anche meno per il traffico inter-AZ.

Quindi, perché non lo facciamo? Perché AWS afferma che la migliore pratica è utilizzare IP privati?

Amazon Web Services ha un numero limitato di indirizzi IPv4 pubblici perché Internet nel suo complesso ha un numero limitato di indirizzi IPv4 pubblici. È nel loro interesse utilizzare indirizzi IP privati ​​che siano effettivamente illimitati, anziché consumare eccessivamente indirizzi IPv4 pubblici scarsi. Potete vedere alcune prove di ciò nel modo in cui AWS valuta gli IP elastici; un EIP collegato a un'istanza è gratuito, ma un EIP inutilizzato costa denaro.

Ma per amor di discussione, supponiamo che non ci importi della carenza di indirizzi IPv4 pubblici su Internet. Dopo tutto, la mia applicazione è speciale. Cosa succede dopo?

Esistono solo due modi per collegare un indirizzo IP pubblico a un'istanza EC2 in un VPC.

1. Indirizzo IP pubblico associato

È possibile richiedere un indirizzo IP pubblico all'avvio di una nuova istanza EC2. Questa opzione appare come una casella di controllo nella console, come flag --associate-public-ip-address quando si utilizza aws-cli e come flag AssociatePublicIpAddress su un oggetto di interfaccia di rete incorporato quando si utilizza CloudFormation. In ogni caso, l'indirizzo IP pubblico è assegnato a eth0(DeviceIndex = 0). È possibile utilizzare questo approccio solo quando si avvia una nuova istanza. Tuttavia, ciò comporta alcuni inconvenienti.

Uno svantaggio è che la modifica del gruppo di sicurezza di un'istanza che utilizza un oggetto di interfaccia di rete incorporato forzerà la sostituzione immediata dell'istanza, almeno se si utilizza CloudFormation.

Un altro svantaggio è che un indirizzo IP pubblico assegnato in questo modo andrà perso quando l'istanza viene arrestata.

2. IP elastico

In generale, gli IP elastici sono l'approccio preferito perché sono più sicuri. Puoi continuare a utilizzare lo stesso indirizzo IP, non rischi di eliminare accidentalmente alcuna istanza EC2, puoi collegare / scollegare liberamente un IP elastico in qualsiasi momento e hai la libertà di cambiare i gruppi di sicurezza applicati alle tue istanze EC2.

... Ma AWS ti limita a 5 EIP per regione. Puoi richiederne di più e la tua richiesta potrebbe essere accolta. Ma AWS potrebbe altrettanto negare tale richiesta in base al ragionamento che ho menzionato sopra. Quindi probabilmente non vorrai fare affidamento su EIP se prevedi di ridimensionare la tua infrastruttura oltre 5 istanze EC2 per regione.

In conclusione, l'utilizzo di indirizzi IP pubblici comporta alcuni vantaggi, ma si verificheranno problemi amministrativi o di ridimensionamento se si tenta di utilizzare esclusivamente indirizzi IP pubblici. Speriamo che questo aiuti a illustrare e spiegare perché le migliori pratiche sono così come sono.


4
Il limite predefinito per gli EIP è in realtà 5 per regione , non 20. "Dopo tutto, la mia applicazione è speciale." Questa frase merita un voto a sé stante.
Michael - sqlbot,

4
Da dove viene l'idea che non puoi cambiare i gruppi di sicurezza al volo per una macchina con un IP pubblico che non sia un EIP? Semplicemente non è vero!
Phil,

1
@Phil Correct. Questa affermazione è falsa. Dire che non è possibile modificare il gruppo di sicurezza di un'istanza a cui è associato un indirizzo IP pubblico annulla la sua intera risposta. So che potrebbe essere un po 'duro, ma come puoi fuorviare i lettori con false dichiarazioni che sono al centro del tuo post. Ad ogni modo, sono d'accordo con Nic sul fatto che è possibile abbandonare le sottoreti private e utilizzare solo quelle pubbliche con un'adeguata configurazione del firewall,
Geo C.,

1
Ora ho rimosso le dichiarazioni errate sul fatto di non poter cambiare il gruppo di sicurezza.
JP

Alcune di queste affermazioni sono ancora lì;)
Tim Malone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.