Cách định cấu hình NAT tùy chỉnh để sử dụng trong Amazon VPC


15

Tôi có một hộp Ubuntu tôi muốn sử dụng làm ví dụ NAT (trong số những thứ khác). Tôi muốn tránh sử dụng NAT AMI do Amazon cung cấp và thay vào đó tự cấu hình NAT.

Hiện tại, máy chủ của tôi có một giao diện mạng duy nhất (như được hiển thị trong http://docs.amazonwebservice.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html ).

Tôi có thể định cấu hình máy chủ Ubuntu của mình làm phiên bản NAT cho các máy chủ khác trong mạng Amazon không?

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  

Tôi đã thử cấu hình quy tắc NAT trong máy chủ Ubuntu (10.200.0.51). Máy chủ thứ hai của tôi nằm trên một mạng khác (10.200.10.41/24). Vì vậy, tôi đã viết:

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

Nhưng máy bị mất kết nối.

Tôi đang hiểu nhầm gì về việc sử dụng các phiên bản NAT và định tuyến trong Amazon?


Một nhận xét nhỏ, bạn không cần: định tuyến thêm gw 10.200.0.51 AWS mặc định sẽ tự động gửi lưu lượng qua hộp NAT nếu bạn định cấu hình chính xác tuyến mặc định của mình trong bảng điều khiển AWS.
Slawomir

Câu trả lời:


22

Bạn có thể kiểm tra tập lệnh của Amazon để định cấu hình NAT trên máy Linux, nó đi kèm với AMI mặc định của họ, trong /usr/local/sbin/configure-pat.sh

Nó trông như thế này:

#!/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

Đừng quên chạy nó khi khởi động từ /etc/rc.d/rc.local
Tim Sylvester

18

Tôi đã cài đặt Amazon NAT AMI và kiểm tra cấu hình có liên quan:

[root @ ip-10-200-0-172 ec2-user] # iptables -L -n -v -x -t nat
XỬ LÝ Chuỗi (chính sách CHẤP NHẬN 11 gói, 660 byte)
    pkts byte mục tiêu chọn tham gia trong nguồn đích         

Chuỗi INPUT (chính sách CHẤP NHẬN 11 gói, 660 byte)
    pkts byte mục tiêu chọn tham gia trong nguồn đích         

Chuỗi OUTPUT (gói ACCEPT chính sách 357, 24057 byte)
    pkts byte mục tiêu chọn tham gia trong nguồn đích         

XÁC NHẬN Chuỗi (chính sách CHẤP NHẬN 0 gói, 0 byte)
    pkts byte mục tiêu chọn tham gia trong nguồn đích         
     357 24057 MASQUERADE tất cả - * 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

Ngoài ra, máy cần phải có IP công khai và kiểm tra Sourc / Dest cần được tắt.

Máy này sau đó có thể được sử dụng như thể hiện NAT.

Định tuyến cho các máy chủ khác được định cấu hình ở cấp EC2 (sử dụng tính năng "Bảng định tuyến").


1
yeah, kiểm tra nguồn / số phận là thứ khiến tôi vấp ngã khi tôi phải làm điều này.
Sirex

Có ai đang đăng nhập NAT không? Tôi nghĩ rằng tôi nên có thể chèn một tuyên bố đăng nhập khi bắt đầu đăng bài như vậy: iptables -t nat -I POSTROUTING -j LOG --log-level 4 Có vẻ như nó hoạt động, có ai có đề xuất tốt hơn không?
jorfus

3

Có một vài hướng dẫn đã giúp tôi.

Ghi chú:

  • 10.0.0.23 - ip riêng của cá thể, mà tôi đã quyết định thực hiện dưới dạng "nat-instance", ví dụ này với EIP.
  • 10.0.0.0/24 - mạng con vpc

Trên "nat-dụ", với tư cách là người dùng 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

sau đây:

[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 

thông qua Bảng điều khiển AWS:

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

Trong các trường hợp khác không có EIP:

sudo route add default gw 10.0.0.23

CẬP NHẬT : Tôi đã phát hiện ra rằng mỗi phiên bản mới trong VPC của tôi đã phát hiện chính xác internet sau khi gw mặc định gw.

Vì thế:

[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

Tôi biết, đây không phải là một vấn đề, nhưng nó có thể tiết kiệm thời gian

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.