Як налаштувати користувальницький NAT для використання в Amazon VPC


15

У мене є поле Ubuntu, яке я хочу використовувати як екземпляр 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?


Один незначний коментар, вам не потрібно було: маршрут додавати за замовчуванням gw 10.200.0.51 AWS автоматично надсилатиме трафік через ваш NAT-поле, якщо ви правильно налаштуєте маршрут за замовчуванням у консолі AWS.
Славомир

Відповіді:


22

Ви можете перевірити сценарій Amazon, щоб налаштувати NAT на машині Linux, він постачається зі стандартним AMI 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

Не забудьте запустити його під час завантаження з /etc/rc.d/rc.local
Тім Сильвестр

18

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

[root @ ip-10-200-0-172 ec2-користувач] # iptables -L -n -v -x -t nat
РЕГУЛЮВАННЯ ланцюга (політика ACCEPT 11 пакетів, 660 байт)
    pkts bytes target prot відключити вихідне місце призначення         

Chain INPUT (політика ACCEPT 11 пакетів, 660 байт)
    pkts bytes target prot відключити вихідне місце призначення         

Ланцюговий вихід (політика ACCEPT 357 пакетів, 24057 байт)
    pkts bytes target prot відключити вихідне місце призначення         

Розміщення ланцюга (політика ACCEPT 0 пакетів, 0 байт)
    pkts bytes target prot відключити вихідне місце призначення         
     357 24057 МАСКВЕРАД усі - * 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 (використовуючи функцію "Таблиця маршрутизації").


1
так, перевірка джерела / дестина - це те, що мене спонукало, коли мені довелося це зробити.
Sirex

Хтось робить NAT-журнал? Я думаю, що я повинен мати змогу вставити протокол журналу на початку структурування так: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Здається, це працює, у кого є краща пропозиція?
jorfus

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

Я знав, це не проблема, але це може заощадити деякий час

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.