Как настроить собственный NAT для использования в Amazon VPC
У меня есть 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?
4 ответа
Я установил 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 (с помощью функции "Таблица маршрутизации").
Вы можете проверить скрипт Amazon для настройки NAT на компьютере с Linux, он поставляется с AMI-vpc-nat AMI по умолчанию, в /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
Есть несколько инструкций, которые мне помогли.
Заметки:
- 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
Я знаю, это не проблема, но это может сэкономить время
Я обнаружил, что проблема заключалась в том, что мы указали интерфейс Ethernet в конфигурации iptables (-o eth0), и его удаление решило мою проблему.
моя предыдущая конфигурация iptable:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
новая конфигурация:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE