Come configurare un NAT personalizzato da utilizzare in Amazon VPC


15

Ho una scatola Ubuntu che vorrei usare come istanza NAT (tra le altre cose). Preferirei evitare di utilizzare le AMI NAT fornite da Amazon, e invece di configurare personalmente il NAT.

Attualmente, il mio host ha un'unica interfaccia di rete (come mostrato in http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Dovrei essere in grado di configurare il mio host Ubuntu come istanza NAT per gli altri host nella mia rete Amazon?

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination         
       5      454 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0  

Ho provato a configurare una regola NAT nell'host Ubuntu (10.200.0.51). Il mio secondo host è su una rete diversa (10.200.10.41/24). Quindi ho scritto:

route add -net 10.200.0.0 netmask 255.255.255.0 dev eth0 # So I can reach 10.200.0.51
route add default gw 10.200.0.51

Ma la macchina ha perso la connessione.

Cosa sto fraintendendo per quanto riguarda l'utilizzo delle istanze NAT e il routing in Amazon?


Un commento secondario, non era necessario: route aggiungi default gw 10.200.0.51 AWS invierà automaticamente il traffico tramite la tua casella NAT se configuri correttamente il percorso predefinito nella console AWS.
Slawomir,

Risposte:


22

Puoi controllare lo script di Amazon per configurare NAT su una macchina Linux, viene fornito con la loro AMI ami-vpc-nat predefinita, in /usr/local/sbin/configure-pat.sh

Sembra così:

#!/bin/bash
# Configure the instance to run as a Port Address Translator (PAT) to provide 
# Internet connectivity to private instances. 

function log { logger -t "vpc" -- $1; }

function die {
    [ -n "$1" ] && log "$1"
    log "Configuration of PAT failed!"
    exit 1
}

# Sanitize PATH
PATH="/usr/sbin:/sbin:/usr/bin:/bin"

log "Determining the MAC address on eth0..."
ETH0_MAC=$(cat /sys/class/net/eth0/address) ||
    die "Unable to determine MAC address on eth0."
log "Found MAC ${ETH0_MAC} for eth0."

VPC_CIDR_URI="http://169.254.169.254/latest/meta-data/network/interfaces/macs/${ETH0_MAC}/vpc-ipv4-cidr-block"
log "Metadata location for vpc ipv4 range: ${VPC_CIDR_URI}"

VPC_CIDR_RANGE=$(curl --retry 3 --silent --fail ${VPC_CIDR_URI})
if [ $? -ne 0 ]; then
   log "Unable to retrive VPC CIDR range from meta-data, using 0.0.0.0/0 instead. PAT may be insecure!"
   VPC_CIDR_RANGE="0.0.0.0/0"
else
   log "Retrieved VPC CIDR range ${VPC_CIDR_RANGE} from meta-data."
fi

log "Enabling PAT..."
sysctl -q -w net.ipv4.ip_forward=1 net.ipv4.conf.eth0.send_redirects=0 && (
   iptables -t nat -C POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE 2> /dev/null ||
   iptables -t nat -A POSTROUTING -o eth0 -s ${VPC_CIDR_RANGE} -j MASQUERADE ) ||
       die

sysctl net.ipv4.ip_forward net.ipv4.conf.eth0.send_redirects | log
iptables -n -t nat -L POSTROUTING | log

log "Configuration of PAT complete."
exit 0

Non dimenticare di eseguirlo all'avvio da /etc/rc.d/rc.local
Tim Sylvester,

18

Ho installato un AMI NAT Amazon e verificato la relativa configurazione:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -t nat
Catena PREROUTING (politica ACCETTO 11 pacchetti, 660 byte)
    pkts byte target prot opt ​​in out destinazione di origine         

Chain INPUT (policy ACCETTA 11 pacchetti, 660 byte)
    pkts byte target prot opt ​​in out destinazione di origine         

OUTPUT a catena (politica ACCETTO pacchetti 357, 24057 byte)
    pkts byte target prot opt ​​in out destinazione di origine         

Chain POSTROUTING (policy ACCETTA 0 pacchetti, 0 byte)
    pkts byte target prot opt ​​in out destinazione di origine         
     357 24057 MASQUERADE all - * eth0 10.200.0.0/16 0.0.0.0/0

[root @ ip-10-200-0-172 ec2-user] # cat / proc / sys / net / ipv4 / ip_forward 
1

Inoltre, la macchina deve avere un IP pubblico e il controllo Sourc / Dest deve essere disabilitato.

Questa macchina può quindi essere utilizzata come istanza NAT.

Il routing per altri host è configurato a livello EC2 (utilizzando la funzione "Tabella di routing").


1
Sì, il controllo sorgente / dest è la cosa che mi ha fatto inciampare quando ho dovuto farlo.
Sirex,

Qualcuno sta registrando NAT? Sto pensando che dovrei essere in grado di inserire una dichiarazione di registrazione all'inizio del postrouting in questo modo: iptables -t nat -I POSTROUTING -j LOG --log-livello 4 Sembra funzionare, qualcuno ha un suggerimento migliore?
Jorfus,

3

Ci sono alcune istruzioni che mi hanno aiutato.

Appunti:

  • 10.0.0.23 - IP privato dell'istanza, che ho deciso di creare come "nat-instance", questa istanza con EIP.
  • 10.0.0.0/24 - sottorete vpc

Su "nat-instance", come utente root:

sysctl -q -w net.ipv4.ip_forward=1 net.ipv4.conf.eth0.send_redirects=0
iptables -t nat -C POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE 2> /dev/null || iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE

dopodichè:

[sysctl file]
net.ipv4.ip_forward = 1
net.ipv4.conf.eth0.send_redirects = 0

[iptables]
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  10.0.0.0/24          0.0.0.0/0 

tramite Console AWS:

Grant all traffic from 10.0.0.0/24 (into security groups)
Set disabled source/dest. check (right click on "nat" instance)

In altri casi senza EIP:

sudo route add default gw 10.0.0.23

UPD : Ho scoperto che ogni nuova istanza nel mio VPC ha rilevato correttamente Internet dopo aver eseguito il ping di gw predefinito.

Così:

[ec2-user@ip-10-0-0-6 ~]$ ping google.com
PING google.com (173.194.33.71) 56(84) bytes of data.
^C
--- google.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2356ms

[ec2-user@ip-10-0-0-6 ~]$ ping 10.0.0.23
PING 10.0.0.230 (10.0.0.23) 56(84) bytes of data.
64 bytes from 10.0.0.23: icmp_seq=1 ttl=64 time=1.22 ms
64 bytes from 10.0.0.23: icmp_seq=2 ttl=64 time=0.539 ms
64 bytes from 10.0.0.23: icmp_seq=3 ttl=64 time=0.539 ms
^C
--- 10.0.0.23 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2500ms
rtt min/avg/max/mdev = 0.539/0.768/1.228/0.326 ms
[ec2-user@ip-10-0-0-6 ~]$ ping google.com
PING google.com (173.194.33.70) 56(84) bytes of data.
64 bytes from sea09s15-in-f6.1e100.net (173.194.33.70): icmp_seq=1 ttl=55 time=13.5 ms
64 bytes from sea09s15-in-f6.1e100.net (173.194.33.70): icmp_seq=2 ttl=55 time=14.2 ms

Lo sapevo, questo non è un problema, ma può risparmiare un po 'di tempo

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.