Como configurar um NAT personalizado para uso no Amazon VPC

15

Eu tenho uma caixa do Ubuntu que desejo usar como instância NAT (entre outras coisas). Eu preferiria evitar usar as AMIs NAT fornecidas pela Amazon e, em vez disso, configurar o NAT.

Atualmente, meu host possui uma única interface de rede (como mostrado em http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Devo poder configurar meu host Ubuntu como a instância NAT para os outros hosts na minha rede 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  

Tentei configurar uma regra NAT no host do Ubuntu (10.200.0.51). Meu segundo host está em uma rede diferente (10.200.10.41/24). Então eu escrevi:

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

Mas a máquina perdeu a conexão.

O que estou entendendo errado quanto ao uso de instâncias NAT e roteamento na Amazon?

jjmontes
fonte
Um pequeno comentário, você não precisou: route add default gw 10.200.0.51 A AWS enviará tráfego automaticamente via sua caixa NAT se você configurar corretamente sua rota padrão no console da AWS.
precisa

Respostas:

22

Você pode verificar o script da Amazon para configurar o NAT em uma máquina Linux; ele vem com a AMI ami-vpc-nat padrão, em /usr/local/sbin/configure-pat.sh

Se parece com isso:

#!/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
fonte
Não se esqueça de executá-lo na inicialização de /etc/rc.d/rc.local
Tim Sylvester
18

Instalei uma Amazon NAT AMI e verifiquei a configuração relevante:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -t nat
PREROUTING em cadeia (política ACEITE 11 pacotes, 660 bytes)
    pkts bytes alvo prot opt ​​in out origem destino         

ENTRADA EM Cadeia (política ACEITE 11 pacotes, 660 bytes)
    pkts bytes alvo prot opt ​​in out origem destino         

SAÍDA em cadeia (política ACEITA pacotes 357, 24057 bytes)
    pkts bytes alvo prot opt ​​in out origem destino         

POSTROUTING em cadeia (política ACEITE 0 pacotes, 0 bytes)
    pkts bytes alvo prot opt ​​in out origem destino         
     357 24057 MASQUERADE todos - * 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

Além disso, a máquina precisa ter um IP público e a verificação Sourc / Dest precisa ser desativada.

Esta máquina pode ser usada como instância NAT.

O roteamento para outros hosts é configurado no nível EC2 (usando o recurso "Tabela de roteamento").

jjmontes
fonte
1
Sim, a verificação de origem / destino é o que mais me incomodou quando tive que fazer isso.
Sirex
Alguém está fazendo log de NAT? Estou pensando em poder inserir uma instrução de log no início do pós-roteamento da seguinte maneira: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Parece funcionar, alguém tem uma sugestão melhor?
jorfus
3

Existem poucas instruções que me ajudaram.

Notas:

  • 10.0.0.23 - ip privado da instância, que eu decidi fazer como "nat-instance", esta instância com o EIP.
  • 10.0.0.0/24 - sub-rede vpc

Em "nat-instance", como usuário 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

depois disto:

[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 console da AWS:

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

Em outros casos sem EIP:

sudo route add default gw 10.0.0.23

UPD : Descobri que cada nova instância no meu VPC detectava a Internet corretamente após executar o ping no gw padrão.

Então:

[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

Eu sabia, isso não é um problema, mas pode economizar algum tempo

Victor Perov
fonte