Cómo configurar un NAT personalizado para usar en Amazon VPC

15

Tengo un cuadro de Ubuntu que deseo usar como instancia NAT (entre otras cosas). Preferiría evitar usar las AMI de NAT proporcionadas por Amazon, y en su lugar configurar NAT yo mismo.

Actualmente, mi host tiene una única interfaz de red (como se muestra en http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

¿Debería poder configurar mi host Ubuntu como la instancia NAT para los otros hosts en mi red de 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  

Intenté configurar una regla NAT en el host de Ubuntu (10.200.0.51). Mi segundo host está en una red diferente (10.200.10.41/24). Entonces escribí:

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

Pero la máquina perdió la conexión.

¿Qué estoy entendiendo mal al regir el uso de instancias NAT y enrutamiento en Amazon?

jjmontes
fuente
Un comentario menor, no fue necesario: ruta agregar gw predeterminado 10.200.0.51 AWS enviará automáticamente el tráfico a través de su casilla NAT si configura correctamente su ruta predeterminada en la consola de AWS.
Slawomir

Respuestas:

22

Puede verificar el script de Amazon para configurar NAT en una máquina Linux, viene con su AMI ami-vpc-nat predeterminada, en /usr/local/sbin/configure-pat.sh

Se parece a esto:

#!/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
Martín
fuente
No olvide ejecutarlo en el arranque desde /etc/rc.d/rc.local
Tim Sylvester
18

He instalado un Amazon NAT AMI y verifiqué la configuración relevante:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -t nat
PREROUTING en cadena (política ACEPTA 11 paquetes, 660 bytes)
    pkts bytes objetivo prot optar entrada salida destino         

ENTRADA de cadena (política ACEPTA 11 paquetes, 660 bytes)
    pkts bytes objetivo prot optar entrada salida destino         

Salida de cadena (política ACEPTA 357 paquetes, 24057 bytes)
    pkts bytes objetivo prot optar entrada salida destino         

POSTROUTING en cadena (política ACEPTAR 0 paquetes, 0 bytes)
    pkts bytes objetivo prot optar entrada salida destino         
     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

Además, la máquina debe tener una IP pública, y la verificación Sourc / Dest debe estar deshabilitada.

Esta máquina se puede usar como instancia NAT.

El enrutamiento para otros hosts se configura a nivel EC2 (utilizando la función "Tabla de enrutamiento").

jjmontes
fuente
1
sí, la verificación de origen / destino es lo que me hizo tropezar cuando tuve que hacer esto.
Sirex
¿Alguien está haciendo un registro NAT? Estoy pensando que debería poder insertar una declaración de registro al comienzo del postrouting de esta manera: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Parece que funciona, ¿alguien tiene una mejor sugerencia?
jorfus
3

Hay pocas instrucciones que me ayudaron.

Notas:

  • 10.0.0.23 - ip privada de instancia, que decidí hacer como "nat-instance", esta instancia con EIP.
  • 10.0.0.0/24 - subred vpc

En "instancia nat", como usuario 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

después de este:

[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 

a través de la consola de AWS:

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

En otros casos sin EIP:

sudo route add default gw 10.0.0.23

UPD : descubrí que cada nueva instancia en mi VPC detectó Internet correctamente después de hacer ping a gw predeterminado.

Entonces:

[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 sé, esto no es un problema, pero puede ahorrar algo de tiempo.

Victor Perov
fuente