Cara mengkonfigurasi NAT khusus untuk digunakan di Amazon VPC

15

Saya memiliki kotak Ubuntu yang ingin saya gunakan sebagai instance NAT (antara lain). Saya lebih suka menghindari penggunaan AMI NAT yang disediakan oleh Amazon, dan alih-alih mengkonfigurasi NAT sendiri.

Saat ini, host saya memiliki antarmuka jaringan tunggal (seperti yang ditunjukkan pada http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Haruskah saya dapat mengkonfigurasi host Ubuntu saya sebagai instance NAT untuk host lain di jaringan Amazon saya?

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  

Saya mencoba mengonfigurasi aturan NAT di host Ubuntu (10.200.0.51). Tuan rumah kedua saya berada di jaringan yang berbeda (10.200.10.41/24). Jadi saya menulis:

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

Tetapi mesin kehilangan koneksi.

Apa kesalahpahaman saya mengatur penggunaan instance NAT dan perutean di Amazon?

jjmontes
sumber
Satu komentar kecil, Anda tidak perlu: route add default gw 10.200.0.51 AWS akan secara otomatis mengirim lalu lintas melalui kotak NAT Anda jika Anda mengkonfigurasi rute default Anda dengan benar di konsol AWS.
Slawomir

Jawaban:

22

Anda dapat memeriksa skrip Amazon untuk mengkonfigurasi NAT pada mesin Linux, ini dilengkapi dengan ami-vpc-nat AMI default mereka, di /usr/local/sbin/configure-pat.sh

Ini terlihat seperti ini:

#!/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
sumber
Jangan lupa untuk menjalankannya saat boot dari /etc/rc.d/rc.local
Tim Sylvester
18

Saya telah menginstal Amazon NAT AMI dan memeriksa konfigurasi yang relevan:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -x -t nat
Chain PREROUTING (polis MENERIMA 11 paket, 660 byte)
    pkts byte target prot opt ​​in out sumber tujuan         

Chain INPUT (polis ACCEPT 11 paket, 660 byte)
    pkts byte target prot opt ​​in out sumber tujuan         

Chain OUTPUT (paket ACCEPT 357, 24057 byte)
    pkts byte target prot opt ​​in out sumber tujuan         

Chain POSTROUTING (polis MENERIMA 0 paket, 0 byte)
    pkts byte target prot opt ​​in out sumber tujuan         
     357 24057 MASQUERADE semua - * 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

Selain itu, mesin perlu memiliki IP publik, dan pemeriksaan Sourc / Dest perlu dinonaktifkan.

Mesin ini kemudian dapat digunakan sebagai instance NAT.

Routing untuk host lain dikonfigurasi pada level EC2 (menggunakan fitur "Routing table").

jjmontes
sumber
1
ya, sumber / tujuan memeriksa adalah hal yang membuat saya tersandung ketika saya harus melakukan ini.
Sirex
Adakah yang melakukan pencatatan NAT? Saya pikir saya harus bisa memasukkan pernyataan logging di awal postrouting seperti: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Tampaknya bekerja, ada yang punya saran yang lebih baik?
jorfus
3

Ada beberapa instruksi yang membantu saya.

Catatan:

  • 10.0.0.23 - ip privat dari instance, yang saya putuskan untuk menjadikannya "nat-instance", instance ini dengan EIP.
  • 10.0.0.0/24 - subnet vpc

Pada "nat-instance", sebagai pengguna 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

sesudah ini:

[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 

melalui AWS Console:

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

Dalam kasus lain tanpa EIP:

sudo route add default gw 10.0.0.23

UPD : Saya sudah tahu, bahwa setiap instance baru di VPC saya mendeteksi internet dengan benar setelah melakukan ping default gw.

Begitu:

[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

Saya tahu, ini bukan masalah, tetapi bisa menghemat waktu

Victor Perov
sumber