Comment configurer un NAT personnalisé pour une utilisation dans Amazon VPC

15

J'ai une boîte Ubuntu que je souhaite utiliser comme instance NAT (entre autres). Je préférerais éviter d'utiliser les AMI NAT fournies par Amazon et plutôt configurer NAT moi-même.

Actuellement, mon hôte possède une interface réseau unique (comme indiqué dans http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Dois-je être en mesure de configurer mon hôte Ubuntu en tant qu'instance NAT pour les autres hôtes de mon réseau 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  

J'ai essayé de configurer une règle NAT dans l'hôte Ubuntu (10.200.0.51). Mon deuxième hôte est sur un réseau différent (10.200.10.41/24). J'ai donc écrit:

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

Mais la machine a perdu la connexion.

Qu'est-ce que je comprends mal en utilisant l'utilisation des instances NAT et le routage dans Amazon?

jjmontes
la source
Un commentaire mineur, vous n'aviez pas besoin de: route ajouter par défaut gw 10.200.0.51 AWS enverra automatiquement le trafic via votre boîte NAT si vous configurez correctement votre route par défaut dans la console AWS.
Slawomir

Réponses:

22

Vous pouvez vérifier le script d'Amazon pour configurer NAT sur une machine Linux, il est livré avec leur AMI ami-vpc-nat par défaut, dans /usr/local/sbin/configure-pat.sh

Cela ressemble à ceci:

#!/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
Martin
la source
N'oubliez pas de l'exécuter au démarrage à partir de /etc/rc.d/rc.local
Tim Sylvester
18

J'ai installé une Amazon NAT AMI et vérifié la configuration appropriée:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -t nat
PRÉROUDAGE de la chaîne (la politique ACCEPTE 11 paquets, 660 octets)
    pkts bytes target prot opt ​​in out source destination         

ENTRÉE en chaîne (la politique ACCEPTE 11 paquets, 660 octets)
    pkts bytes target prot opt ​​in out source destination         

SORTIE de chaîne (politique ACCEPTE 357 paquets, 24057 octets)
    pkts bytes target prot opt ​​in out source destination         

Chaîne POSTROUTING (la politique ACCEPTE 0 paquets, 0 octets)
    pkts bytes target prot opt ​​in out source destination         
     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

De plus, la machine doit avoir une adresse IP publique et la vérification Sourc / Dest doit être désactivée.

Cette machine peut ensuite être utilisée comme instance NAT.

Le routage pour les autres hôtes est configuré au niveau EC2 (à l'aide de la fonction "Table de routage").

jjmontes
la source
1
oui, le contrôle source / dest est la chose qui m'a fait trébucher quand j'ai dû faire ça.
Sirex
Quelqu'un fait-il une journalisation NAT? Je pense que je devrais être en mesure d'insérer une instruction de journalisation au début de la postrouting comme ceci: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Cela semble fonctionner, quelqu'un a-t-il une meilleure suggestion?
jorfus
3

Il y a peu d'instructions qui m'ont aidé.

Remarques:

  • 10.0.0.23 - IP privée d'instance, que j'ai décidé de faire comme "nat-instance", cette instance avec EIP.
  • 10.0.0.0/24 - sous-réseau vpc

Sur "nat-instance", en tant qu'utilisateur 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

après ça:

[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 

via AWS Console:

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

Dans d'autres cas sans EIP:

sudo route add default gw 10.0.0.23

UPD : J'ai découvert que chaque nouvelle instance de mon VPC détectait correctement Internet après avoir envoyé une requête ping à gw par défaut.

Donc:

[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

Je le savais, ce n'est pas un problème, mais ça peut faire gagner du temps

Victor Perov
la source