Amazon VPC에서 사용하기 위해 사용자 지정 NAT를 구성하는 방법


15

NAT 인스턴스로 사용하려는 Ubuntu 상자가 있습니다 (다른 것들 중에서도). Amazon에서 제공하는 NAT AMI를 사용하지 않고 NAT를 직접 구성하지 않는 것이 좋습니다.

현재 내 호스트에는 단일 네트워크 인터페이스가 있습니다 ( http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html 참조 ).

Amazon 네트워크의 다른 호스트에 대한 NAT 인스턴스로 Ubuntu 호스트를 구성 할 수 있습니까?

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  

우분투 호스트 (10.200.0.51)에서 NAT 규칙을 구성하려고했습니다. 두 번째 호스트가 다른 네트워크 (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

그러나 기계의 연결이 끊어졌습니다.

Amazon에서 NAT 인스턴스 사용 및 라우팅을 규제하는 것에 대해 오해하고있는 것은 무엇입니까?


한 가지 사소한 설명은 필요하지 않습니다. route add default gw 10.200.0.51 AWS 콘솔에서 기본 경로를 올바르게 구성하면 AWS가 NAT 상자를 통해 트래픽을 자동으로 보냅니다.
Slawomir 2016

답변:


22

Linux 시스템에서 NAT를 구성하기 위해 Amazon의 스크립트를 확인할 수 있으며 기본 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-user] # iptables -L -n -v -x -t nat
체인 PREROUTING (정책 ACCEPT 11 패킷, 660 바이트)
    pkts 바이트 대상 prot 소스 대상을 옵트 아웃         

체인 입력 (정책 ACCEPT 11 패킷, 660 바이트)
    pkts 바이트 대상 prot 소스 대상을 옵트 아웃         

체인 출력 (정책 ACCEPT 357 패킷, 24057 바이트)
    pkts 바이트 대상 prot 소스 대상을 옵트 아웃         

체인 POSTROUTING (정책 ACCEPT 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-user] # 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 서브넷

"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 콘솔을 통해 :

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 : 기본 gw를 핑 (ping) 한 후 VPC의 각 새 인스턴스가 인터넷을 올바르게 감지했습니다.

그래서:

[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.