Как настроить собственный NAT для использования в Amazon VPC

15

У меня есть Ubuntu box, который я хочу использовать в качестве экземпляра NAT (среди прочего). Я бы предпочел не использовать NAT AMI, предоставляемые Amazon, и вместо этого сам настраивать NAT.

В настоящее время мой хост имеет единый сетевой интерфейс (как показано на http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Могу ли я настроить свой хост Ubuntu в качестве экземпляра NAT для других хостов в моей сети 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  

Я попытался настроить правило NAT на хосте Ubuntu (10.200.0.51). Мой второй хост находится в другой сети (10.200.10.41/24). Итак, я написал:

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

Но машина потеряла связь.

Что я неправильно понимаю в отношении использования экземпляров NAT и маршрутизации в Amazon?

jjmontes
источник
Один небольшой комментарий, вам не нужно было: route add default gw 10.200.0.51 AWS автоматически отправит трафик через ваш NAT-бокс, если вы правильно настроите маршрут по умолчанию в консоли AWS.
Славомир

Ответы:

22

Вы можете проверить скрипт Amazon для настройки NAT на компьютере с Linux, он поставляется с AMI по умолчанию ami-vpc-nat в /usr/local/sbin/configure-pat.sh

Это выглядит так:

#!/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
Мартин
источник
Не забудьте запустить его при загрузке из /etc/rc.d/rc.local
Тим Сильвестр
18

Я установил Amazon NAT AMI и проверил соответствующую конфигурацию:

[root @ ip-10-200-0-172 ec2-пользователь] # iptables -L -n -v -x -t nat
Цепное ПРЕДУПРЕЖДЕНИЕ (политика ПРИНИМАЕТ 11 пакетов, 660 байт)
    pkts bytes target prot opt ​​in out source source         

Цепной ВХОД (политика ПРИНИМАЕТ 11 пакетов, 660 байт)
    pkts bytes target prot opt ​​in out source source         

Цепной ВЫХОД (политика ПРИНЯТЬ 357 пакетов, 24057 байт)
    pkts bytes target prot opt ​​in out source source         

Цепочка POSTROUTING (политика ПРИНИМАЕТ 0 пакетов, 0 байт)
    pkts bytes target prot opt ​​in out source source         
     357 24057 MASQUERADE все - * eth0 10.200.0.0/16 0.0.0.0/0

[root @ ip-10-200-0-172 ec2-пользователь] # cat / proc / sys / net / ipv4 / ip_forward 
1

Кроме того, у машины должен быть общедоступный IP-адрес, а проверку Sourc / Dest необходимо отключить.

Эта машина может быть использована в качестве экземпляра NAT.

Маршрутизация для других хостов настраивается на уровне EC2 (с помощью функции «Таблица маршрутизации»).

jjmontes
источник
1
да, проверка источника / цели - это то, что сбило меня с толку, когда мне пришлось это сделать.
Sirex
Кто-нибудь делает логи NAT? Я думаю, что я должен быть в состоянии вставить оператор журналирования в начале пост-маршрутизации следующим образом: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Кажется, у кого-нибудь есть лучшее предложение?
Йорфус
3

Есть несколько инструкций, которые мне помогли.

Примечания:

  • 10.0.0.23 - частный ip экземпляра, который я решил сделать как «nat-instance», этот экземпляр с EIP.
  • 10.0.0.0/24 - подсеть vpc

На «nat-instance» от имени пользователя 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

после этого:

[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 

через Консоль AWS:

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

В других случаях без EIP:

sudo route add default gw 10.0.0.23

UPD : я обнаружил, что каждый новый экземпляр в моем VPC правильно обнаруживал интернет после проверки связи с gw по умолчанию.

Так:

[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

Я знаю, это не проблема, но это может сэкономить время

Виктор Перов
источник