วิธีกำหนดค่า NAT แบบกำหนดเองสำหรับใช้ใน Amazon VPC


15

ฉันมีกล่อง Ubuntu ฉันต้องการใช้เป็นตัวอย่างของ NAT (เหนือสิ่งอื่นใด) ฉันต้องการหลีกเลี่ยงการใช้ NAT AMIs ที่จัดทำโดย 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


หนึ่งความคิดเห็นเล็กน้อยคุณไม่จำเป็นต้อง: route เพิ่มค่าเริ่มต้น gw 10.200.0.51 AWS จะส่งทราฟฟิกผ่านกล่อง NAT ของคุณโดยอัตโนมัติหากคุณกำหนดค่าเส้นทางเริ่มต้นของคุณอย่างถูกต้องในคอนโซล AWS
Slawomir

คำตอบ:


22

คุณสามารถตรวจสอบสคริปต์ของ 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

อย่าลืมเรียกใช้ตอนบู๊ตจาก /etc/rc.d/rc.local
Tim Sylvester

18

ฉันติดตั้ง Amazon NAT AMI แล้วและตรวจสอบการกำหนดค่าที่เกี่ยวข้อง:

[root @ ip-10-200-0-172 ผู้ใช้ ec2] # iptables -L -n -v -x -t nat
Chain PREROUTING (นโยบายยอมรับ 11 แพ็คเก็ต 660 ไบต์)
    pkts ไบต์เป้าหมาย prot เลือกไม่ใช้ปลายทางปลายทาง         

Chain INPUT (นโยบายยอมรับ 11 แพ็กเก็ต, 660 ไบต์)
    pkts ไบต์เป้าหมาย prot เลือกไม่ใช้ปลายทางปลายทาง         

Chain OUTPUT (นโยบายยอมรับแพ็คเก็ต 357, 24057 ไบต์)
    pkts ไบต์เป้าหมาย prot เลือกไม่ใช้ปลายทางปลายทาง         

การโพสต์ในเครือ (การยอมรับนโยบาย 0 แพ็กเก็ต, 0 ไบต์)
    pkts ไบต์เป้าหมาย prot เลือกไม่ใช้ปลายทางปลายทาง         
     357 24057 MASQUERADE all - * 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 หรือไม่ ฉันคิดว่าฉันควรจะสามารถแทรกคำสั่งการบันทึกที่จุดเริ่มต้นของ postrouting เช่น: 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 subnet

ใน "nat-instance" ในฐานะผู้ใช้รูท:

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 Console:

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 ของฉันตรวจพบอินเทอร์เน็ตได้อย่างถูกต้องหลังจาก ping 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

ฉันรู้ว่านี่ไม่ใช่ปัญหา แต่สามารถประหยัดเวลาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.