1. 개요
Cloud NAT는 강력한 도구입니다. 이를 통해 Compute Engine 및 Google Kubernetes Engine (GKE) 워크로드는 외부 IP를 사용하여 외부 액세스에 노출되지 않고도 확장 가능하고 안전한 방식으로 인터넷 리소스에 액세스할 수 있습니다.
Cloud NAT는 프록시 없는 설계를 특징으로 하며 Andromeda SDN 레이어에서 직접 NAT를 구현합니다. 따라서 워크로드의 성능에 영향을 미치지 않으며 여러 VM, 리전, VPC로 쉽게 확장할 수 있습니다.
NAT 규칙은 Cloud NAT의 확장 프로그램입니다. Cloud NAT의 NAT 규칙 기능을 사용하면 Cloud NAT를 사용하여 인터넷에 연결하는 방법을 정의하는 액세스 규칙을 만들 수 있습니다. 현재 NAT 규칙은 대상 주소를 기반으로 소스 NAT 주소 선택을 지원합니다.
NAT 규칙이 없으면 Cloud NAT가 사용 설정된 VM은 동일한 NAT IP 주소 집합을 사용하여 모든 인터넷 주소에 연결합니다.
경우에 따라 NAT 사용 사례에서는 Cloud NAT가 특정 대상에 대해 다른 소스 IP 주소를 사용해야 합니다. NAT 규칙은 일치 및 해당 작업을 정의합니다. NAT 규칙을 지정하면 패킷이 각 NAT 규칙과 일치합니다. 규칙이 일치하면 해당 일치에 따른 작업이 수행됩니다.
자세한 내용은 NAT 규칙에 관한 문서 섹션 을 참고하세요.
학습할 내용
- NAT 규칙을 준비하기 위해 Cloud NAT 게이트웨이를 설정하는 방법
- Common Expression Language (CEL)를 사용하여 NAT 규칙을 설계하는 방법
- NAT 규칙을 만들고 NAT 게이트웨이에 연결하는 방법
- 인스턴스에서 NAT 규칙을 테스트하는 방법
- NAT 게이트웨이의 규칙을 업데이트하는 방법
- NAT 규칙을 삭제하고 기본 Cloud NAT 동작으로 되돌리는 방법
필요한 항목
- Google Compute Engine의 기본 지식
- 기본 네트워킹 및 TCP/IP 지식
- 기본 Unix/Linux 명령줄 지식
- Google Cloud의 네트워킹 실습과 같은 GCP의 네트워킹 둘러보기를 완료하는 것이 좋습니다.
- Cloud NAT 기본사항 이해
2. Google Cloud 콘솔 및 Cloud Shell 사용
이 실습에서는 GCP와 상호작용하기 위해 Google Cloud 콘솔과 Cloud Shell을 모두 사용합니다.
Google Cloud Console
Cloud 콘솔은 https://console.cloud.google.com에서 액세스할 수 있습니다.

자습형 환경 설정
- Cloud 콘솔에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.



- 프로젝트 이름은 이 프로젝트의 개인 식별자입니다. 이름 지정 규칙을 준수하는 한 원하는 이름을 사용할 수 있으며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다 (설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID로 식별됨)를 참조해야 하므로 마음에 들지 않으면 다른 임의 ID를 생성하거나 직접 ID를 입력하여 사용 가능한지 확인할 수 있습니다. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다.
- 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.
이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 신규 사용자에게는 미화$300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습의 모든 작업은 브라우저만으로 수행할 수 있습니다.
3. 실습 설정
이 실습에서는 프로젝트를 사용하고 각 프로젝트에 서브넷이 있는 VPC를 두 개 만듭니다. 외부 IP 주소를 예약한 다음 Cloud NAT 게이트웨이 (Cloud Router 포함), 2개의 프로듀서 인스턴스, 1개의 컨슈머 인스턴스를 만듭니다. 기본 Cloud NAT 동작을 검증한 후 Cloud NAT 맞춤 규칙을 만들고 동작을 검증합니다.
네트워킹 아키텍처 개요:

4. 외부 IP 주소 예약
이 실습에서 사용할 모든 외부 IP 주소를 예약해 보겠습니다. 이렇게 하면 소비자 및 프로듀서 VPC 모두에서 관련 NAT 및 방화벽 규칙을 모두 작성하는 데 도움이 됩니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute addresses create nat-address-1 nat-address-2 nat-address-3 producer-address-1 producer-address-2 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
예약된 IP 주소를 환경 변수로 채웁니다.
export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"` export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"` export natip3=`gcloud compute addresses list --filter name:nat-address-3 --format="get(address)"` export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"` export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`
출력은 예상되지 않지만 주소가 올바르게 채워졌는지 확인합니다. 모든 환경 변수의 값을 출력해 보겠습니다.
$ env | egrep '^(nat|producer)ip[1-3]'
출력:
producerip1=<Actual Producer IP 1> producerip2=<Actual Producer IP 2> natip1=<NAT IP 1> natip2=<NAT IP 2> natip3=<NAT IP 3>
5. 프로듀서 VPC 및 인스턴스 설정
이제 프로듀서 리소스의 리소스를 만듭니다. 프로듀서 VPC에서 실행되는 인스턴스는 두 개의 공용 IP 'producer-address-1'과 'producer-address-2'를 사용하여 인터넷 연결 서비스를 제공합니다.
먼저 VPC를 만들어 보겠습니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create producer-vpc --subnet-mode custom
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 producer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
다음으로 us-east4에 서브넷을 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create producer-e4 \ --network producer-vpc --range 10.0.0.0/24 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/producer-e4]. NAME REGION NETWORK RANGE producer-e4 us-east4 producer-vpc 10.0.0.0/24
다음으로 NAT IP 주소가 포트 8080의 프로듀서 인스턴스에 도달하도록 VPC 방화벽 규칙을 만듭니다.
첫 번째 규칙의 경우 Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create producer-allow-8080 \ --network producer-vpc --allow tcp:8080 \ --source-ranges $natip1,$natip2,$natip3
출력:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/producer-allow-8080]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED producer-allow-8080 producer-vpc INGRESS 1000 tcp:8080 False
다음 단계는 두 개의 프로듀서 인스턴스를 만드는 것입니다.
생산자 인스턴스는 Docker Hub에서 사용할 수 있는 Docker 컨테이너에서 IP 에코 서비스를 실행합니다 (소스 코드는 서비스 작성자의 GitHub 저장소에서 제공됨).
필요한 모든 소프트웨어로 인스턴스를 빠르게 프로비저닝하기 위해 Compute Engine의 컨테이너 배포 기능을 사용합니다.
NAT 규칙을 작성할 수 있도록 각 인스턴스에 서로 다른 예약 IP 주소를 프로비저닝합니다.
첫 번째 인스턴스를 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create-with-container producer-instance-1 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \ --container-image=mpolden/echoip --container-restart-policy=always
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-1 us-east4-a e2-medium 10.0.0.2 <producer IP 1> RUNNING
그런 다음 두 번째 인스턴스를 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create-with-container producer-instance-2 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \ --container-image=mpolden/echoip --container-restart-policy=always
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-2 us-east4-a e2-medium 10.0.0.3 <producer IP 2> RUNNING
6. 소비자 VPC, Cloud NAT, 인스턴스 설정
이제 프로듀서 서비스를 만들었으므로 소비자 VPC와 해당 Cloud NAT 게이트웨이를 만들 차례입니다.
VPC와 서브넷을 만든 후 TCP 소스 IP 범위의 IAP를 허용하는 간단한 인그레스 방화벽 규칙을 추가합니다. 이렇게 하면 gcloud를 사용하여 소비자 인스턴스에 직접 SSH할 수 있습니다.
그런 다음 수동 할당 모드에서 간단한 Cloud NAT 게이트웨이와 여기에 연결된 예약된 주소 'nat-address-1'을 만듭니다. Codelab의 후속 부분에서는 게이트웨이의 구성을 업데이트하여 맞춤 규칙을 추가합니다. .
먼저 VPC를 만들어 보겠습니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create consumer-vpc --subnet-mode custom
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/consumer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 consumer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
다음으로 us-east4에 서브넷을 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create consumer-e4 \ --network consumer-vpc --range 10.0.0.0/24 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/consumer-e4]. NAME REGION NETWORK RANGE consumer-e4 us-east4 consumer-vpc 10.0.0.0/24
다음으로 IAP 범위 주소가 포트 22에서 소비자 인스턴스에 도달하도록 허용하는 VPC 방화벽 규칙을 만듭니다.
첫 번째 방화벽 규칙의 경우 Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create consumer-allow-iap \ --network consumer-vpc --allow tcp:22 \ --source-ranges 35.235.240.0/20
출력:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED consumer-allow-iap consumer-vpc INGRESS 1000 tcp:22 False
NAT 게이트웨이를 만들기 전에 먼저 Cloud Router 인스턴스를 만들어야 합니다 (비공개 ASN 번호를 사용하지만 이 실습의 활동과는 관련이 없음). Cloud Shell에서 다음을 실행합니다.
gcloud compute routers create consumer-cr \ --region=us-east4 --network=consumer-vpc \ --asn=65501
출력:
Creating router [consumer-cr]...done. NAME REGION NETWORK consumer-cr us-east4 consumer-vpc
그런 다음 NAT 게이트웨이 인스턴스를 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute routers nats create consumer-nat-gw \
--router=consumer-cr \
--router-region=us-east4 \
--nat-all-subnet-ip-ranges \
--nat-external-ip-pool=nat-address-1
출력:
Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.
소비자 테스트 인스턴스를 만듭니다. 나중에 인스턴스 내에서 참조할 수 있도록 여기에 예약된 프로듀서 IP를 입력합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create consumer-instance --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=consumer-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/consumer-instance]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance us-east4-a e2-medium 10.0.0.2 RUNNING
7. 기본 Cloud NAT 동작 확인
이 시점에서 소비자 인스턴스는 모든 외부 주소와 통신하는 데 동일한 예약 IP 'nat-address-1'을 사용하는 기본 Cloud NAT 동작을 사용합니다.
Cloud NAT에서 새 NAT 규칙 기능을 사용하기 전에 먼저 이 동작을 검증해 보겠습니다.
SSH를 사용하여 소비자 인스턴스에 연결합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute ssh consumer-instance --zone=us-east4-a
이제 인스턴스 셸에 있어야 합니다.
샘플 출력 (간결성을 위해 전체 출력이 잘림)
No zone specified. Using zone [us-east4-a] for instance: [consumer-instance]. External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance:~$
소비자 인스턴스 내에서 먼저 프로듀서 IP를 모두 가져와 환경 변수로 채워 보겠습니다.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
그런 다음 프로듀서 인스턴스에 모두 curl을 시도하고 반환된 소스 IP 주소를 관찰합니다.
<username>@consumer-instance:~$ curl http://$producerip1:8080 34.136.8.83 <username>@consumer-instance:~$ curl http://$producerip2:8080 34.136.8.83
두 엔드포인트에 대해 동일한 IP 주소가 반환되어야 하며, 이 IP 주소는 외부 예약 IP 'nat-address-1'의 값과 같습니다.
마찬가지로 외부 IP 리플렉터 서비스에 대한 curl은 동일한 IP를 표시해야 합니다. 예를 들면 다음과 같습니다.
<username>@consumer-instance:~$ curl http://ifconfig.co 34.136.8.83 <username>@consumer-instance:~$ curl http://ifconfig.me 34.136.8.83 <username>@consumer-instance:~$ curl http://ip.fyr.io 34.136.8.83
지금은 인스턴스의 SSH 세션을 종료합니다. NAT 규칙을 구성한 후 다시 SSH로 돌아갈 것입니다.
8. Cloud NAT 규칙 만들기
NAT 규칙은 Common Expression Language 구문을 사용하여 작성됩니다. 규칙 표현식 언어에 대한 자세한 내용은 규칙 표현식 언어를 참고하세요.
gcloud 명령어를 사용하여 기존 NAT 게이트웨이에 NAT 규칙을 추가할 수도 있습니다. Cloud NAT 규칙을 만드는 두 가지 옵션을 모두 살펴보겠습니다.
먼저 NAT 규칙 YAML 파일을 만들어 보겠습니다.
Cloud Shell에서 다음을 실행합니다.
export projectid=`gcloud config get-value project`
cat <<EOF >natrulesfile.txt
rules:
- ruleNumber: 100
match: destination.ip == '$producerip2'
action:
sourceNatActiveIps:
- /projects/$projectid/regions/us-east4/addresses/nat-address-2
EOF
그런 다음 이 규칙 파일을 사용하여 기존 NAT 게이트웨이를 업데이트합니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats update consumer-nat-gw \
--router=consumer-cr \
--rules=natrulesfile.txt \
--router-region=us-east4
다음과 같은 출력이 예상됩니다.
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
규칙이 성공적으로 구성되었는지 확인합니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules list \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4
다음과 같은 출력이 예상됩니다.
RULE_NUMBER MATCH 100 destination.ip == '35.192.142.134'
gcloud 명령어만 사용하여 동일한 규칙을 다시 만들어 보겠습니다. 먼저 기존 규칙을 삭제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules delete 100 \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --quiet
다음과 같은 출력이 예상됩니다.
Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]
그런 다음 이 gcloud 명령어를 사용하여 규칙을 다시 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules create 100 \ --match='destination.ip == "'$producerip2'"' \ --source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
다음과 같은 출력이 예상됩니다.
Creating Rule [100] in NAT [consumer-nat-gw]...done.
규칙이 성공적으로 생성되었는지 다시 확인하려면 이전 명령어를 반복합니다. 이번에는 규칙의 전체 세부정보를 확인하기 위해 YAML 형식 전환을 추가합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules list\ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --format=yaml
다음과 같은 출력이 예상됩니다.
--- action: sourceNatActiveIps: - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2 match: destination.ip == <actual IP for producer-IP 2> ruleNumber: 100
마지막으로 이제 'nat-address1'과 'nat-address-2' 외부 주소가 모두 'IN_USE'로 표시됩니다. 이를 확인하려면 Cloud Shell에서 다음 명령어를 실행하세요.
$ gcloud compute addresses list
다음과 같은 출력이 표시됩니다 (실제 IP 주소는 예약한 주소와 일치해야 함).
NAME ADDRESS/RANGE TYPE PURPOSE NETWORK REGION SUBNET STATUS nat-address-1 34.136.8.83 EXTERNAL us-east4 IN_USE nat-address-2 34.70.137.35 EXTERNAL us-east4 IN_USE nat-address-3 34.135.103.88 EXTERNAL us-east4 RESERVED producer-address-1 34.66.0.105 EXTERNAL us-east4 IN_USE producer-address-2 35.192.142.134 EXTERNAL us-east4 IN_USE
9. Cloud NAT 규칙 동작 확인
이 시점에서 소비자 인스턴스는 생성된 Cloud NAT 규칙을 사용하여 nat-address-2를 사용하여 producer-address-2와 통신해야 합니다.
이 동작을 검증해 보겠습니다. SSH를 사용하여 소비자 인스턴스에 연결합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute ssh consumer-instance --zone=us-east4-a
이제 인스턴스 셸에 있어야 합니다.
샘플 출력 (간결성을 위해 전체 출력이 잘림)
No zone specified. Using zone [us-east4-a] for instance: [consumer-instance]. External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance:~$
소비자 인스턴스 내에서 먼저 프로듀서 IP를 모두 가져와 환경 변수로 채워 보겠습니다.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
그런 다음 프로듀서 인스턴스에 모두 curl을 시도하고 반환된 소스 IP 주소를 관찰합니다.
<username>@consumer-instance:~$ curl http://$producerip1:8080 34.136.8.83 <username>@consumer-instance:~$ curl http://$producerip2:8080 34.70.137.35
이제 두 엔드포인트에 대해 다른 IP 주소가 반환됩니다. 첫 번째 IP 주소는 기본 동작과 동일해야 합니다. 새 NAT 규칙을 추가한 후 두 번째 IP 주소는 'nat-address-2'와 같아야 합니다.
외부 IP 리플렉터 서비스에 대한 curl은 기본 동작과 동일한 IP를 표시해야 합니다. 예를 들면 다음과 같습니다.
<username>@consumer-instance:~$ curl http://ifconfig.co 34.136.8.83 <username>@consumer-instance:~$ curl http://ifconfig.me 34.136.8.83 <username>@consumer-instance:~$ curl http://ip.fyr.io 34.136.8.83
지금은 인스턴스의 SSH 세션을 종료합니다. 주소 드레이닝을 테스트하기 위해 다시 SSH로 연결할 것입니다.
10. Cloud NAT 규칙 업데이트 및 삭제
기존 Cloud NAT 규칙을 업데이트할 수 있습니다. 예를 들어 새 IP 주소를 연결하고 기존 규칙과 연결된 기존 IP 주소를 드레인할 수 있습니다.
다음과 같이 NAT 규칙 파일을 업데이트합니다.
Cloud Shell에서 다음을 실행합니다.
export projectid=`gcloud config get-value project`
cat <<EOF >natrulesfile.txt
rules:
- ruleNumber: 100
match: destination.ip == '$producerip2'
action:
sourceNatDrainIps:
- /projects/$projectid/regions/us-east4/addresses/nat-address-2
sourceNatActiveIps:
- /projects/$projectid/regions/us-east4/addresses/nat-address-3
EOF
이 새 파일은 이제 'nat-address-2'를 드레인된 상태로 배치합니다. 활성 상태에 'nat-address-3'을 추가합니다. 이렇게 하면 nat-address-2를 사용하는 기존 연결이 정상적으로 종료되는 동시에 nat-address-3만 사용하는 새 연결이 생성됩니다.
그런 다음 이 규칙 파일을 사용하여 기존 NAT 게이트웨이를 업데이트합니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats update consumer-nat-gw \
--router=consumer-cr \
--rules=natrulesfile.txt \
--router-region=us-east4
다음과 같은 출력이 예상됩니다.
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
규칙이 성공적으로 구성되었는지 확인합니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules list \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --format=yaml
다음과 같은 출력이 예상됩니다.
--- action: sourceNatActiveIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3 sourceNatDrainIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2 match: destination.ip == '35.192.142.134' ruleNumber: 100
이제 'nat-address-2'가 드레이닝 상태로 배치되었습니다. 소비자 VPC의 새 연결이 이제 올바른 NAT IP를 사용하는지 확인하는 것은 연습으로 남겨둡니다.
마지막으로 Cloud NAT 게이트웨이에서 NAT 규칙을 삭제하고 기본 동작으로 되돌립니다. 다음 gcloud 명령어를 사용할 수 있습니다. Cloud Shell에서 다음을 실행합니다.
gcloud alpha compute routers nats rules delete 100 \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --quiet
다음과 같은 출력이 예상됩니다.
Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]
더 이상 NAT 규칙이 없는지 확인하려면 NAT 게이트웨이 설명 명령어를 사용합니다.
gcloud alpha compute routers nats describe consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
다음과 같은 출력이 예상됩니다.
enableEndpointIndependentMapping: false name: consumer-nat-gw natIpAllocateOption: MANUAL_ONLY natIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1 sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES
출력 YAML에 'rules:' 섹션이 없는 것을 확인하세요. 구성된 NAT 규칙이 없음을 나타냅니다.
11. 정리 단계
반복되는 요금이 발생하지 않도록 이 Codelab과 연결된 모든 리소스를 삭제해야 합니다.
먼저 모든 인스턴스를 삭제합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances delete consumer-instance \ producer-instance-1 producer-instance-2 \ --zone us-east4-a --quiet
예상 출력 :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].
다음으로 Cloud Router를 삭제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute routers delete consumer-cr \ --region us-east4 --quiet
다음과 같은 출력이 예상됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].
모든 외부 IP 주소를 해제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute addresses delete nat-address-1 \ nat-address-2 nat-address-3 producer-address-1 \ producer-address-2 --region us-east4 --quiet
다음과 같은 출력이 예상됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
VPC 방화벽 규칙을 삭제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules delete consumer-allow-iap \ producer-allow-8080 --quiet
다음과 같은 출력이 예상됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-8080].
서브넷을 삭제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets delete consumer-e4 \ producer-e4 --region=us-east4 --quiet
다음과 같은 출력이 예상됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/consumer-e4]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/producer-e4].
마지막으로 VPC를 삭제합니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks delete consumer-vpc \ producer-vpc --quiet
다음과 같은 출력이 예상됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].
12. 축하합니다.
Cloud NAT 규칙 실습을 완료했습니다.
학습한 내용
- NAT 규칙을 준비하기 위해 Cloud NAT 게이트웨이를 설정하는 방법
- Common Expression Language (CEL)를 사용하여 NAT 규칙을 설계하는 방법
- NAT 규칙을 만들고 NAT 게이트웨이에 연결하는 방법
- 인스턴스에서 NAT 규칙을 테스트하는 방법
- NAT 게이트웨이의 규칙을 업데이트하는 방법
- NAT 규칙을 삭제하고 기본 Cloud NAT 동작으로 되돌리는 방법
다음 단계
- 이 예시와 같이 더 복잡한 NAT 규칙을 만들어 실험해 보세요.
- NAT IP 주소 드레이닝을 살펴보고 연결 영향을 관찰합니다.
- Google Cloud Platform의 네트워킹 자세히 알아보기
©Google, Inc. or its affiliates. All rights reserved. 배포 금지.