VM 인스턴스의 특수 구성

이 페이지에서는 다음과 같은 Compute Engine 가상 머신(VM) 인스턴스의 특수한 네트워킹 구성을 설명합니다.

  • 인스턴스에 대한 외부 HTTP 연결 설정
  • 인스턴스를 네트워크 프록시로 구성
  • 인스턴스를 VPN 게이트웨이로 구성
  • 인스턴스를 NAT 게이트웨이로 구성
  • 고가용성 및 고대역폭 NAT 게이트웨이 빌드

인스턴스에 대한 외부 HTTP 연결 설정

기본 방화벽 규칙에서는 인스턴스에 대한 HTTP 또는 HTTPS 연결이 허용되지 않습니다. 그러나 연결을 허용하는 규칙을 간단히 추가할 수 있습니다. 인스턴스는 외부 IP 주소가 있어야 VPC 네트워크 외부의 트래픽을 받을 수 있습니다.

gcloud 명령줄 도구 또는 Google Cloud Platform Console을 사용하여 HTTP 또는 HTTPS 연결을 허용하는 방화벽 규칙을 추가할 수 있습니다. 또한 API를 통해 방화벽 규칙을 추가할 수도 있습니다.

콘솔

GCP Console을 사용하여 VPC 네트워크의 모든 인스턴스에 대한 전체 방화벽 규칙을 만들거나, 인스턴스를 만들 때 각각의 옵션을 선택해서 개별 인스턴스의 HTTP, HTTPS 연결 액세스를 허용할 수 있습니다. 후자의 옵션이 더 많은 개별 인스턴스 제어 권한을 제공하므로 먼저 설명합니다.

  1. GCP Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.
  3. 방화벽 섹션에서 HTTP 트래픽 허용HTTPS 트래픽 허용.
  4. 만들기를 클릭하여 인스턴스를 만듭니다.

이러한 체크박스 선택을 통해 VPC 네트워크는 http-server 또는 https-server 태그가 있는 모든 인스턴스에 적용되는 default-http 또는 default-https 규칙을 자동으로 만듭니다. 또한 체크박스 선택에 따라 새 인스턴스에 적절한 태그가 지정됩니다.

기존 default-httpdefault-https 방화벽 규칙이 이미 있는 경우 인스턴스의 세부정보 페이지에서 HTTP 허용 또는 HTTPS 허용 옵션을 사용 설정하여 기존 인스턴스에 방화벽 규칙을 적용할 수 있습니다.

  1. VM 인스턴스 페이지로 이동합니다.
  2. 원하는 인스턴스 이름을 클릭합니다.
  3. 페이지 상단의 편집 버튼을 클릭합니다.
  4. 방화벽 섹션까지 아래로 스크롤합니다.
  5. 원하는 VPC 네트워크 아래에서 HTTP 허용 또는 HTTPS 허용 옵션을 선택합니다.
  6. 저장을 클릭합니다.

비슷한 방법으로, 하나 또는 두 개의 체크박스를 선택 해제하여 인스턴스의 외부 HTTP 또는 HTTPS 액세스를 사용하지 않을 수도 있습니다.

GCP는 모든 인스턴스에 적용되는 전체 방화벽 규칙을 만드는 대신 특정 인스턴스에 HTTP, HTTPS 트래픽 태그를 지정하도록 허용함으로써 프로젝트의 모든 가상 머신에서 외부 트래픽을 허용하는 데서 발생할 수 있는 보안 문제를 제한합니다. 모든 가상 머신 인스턴스에서 HTTP 또는 HTTPS 트래픽을 허용하는 방화벽 규칙을 만들려면 다음과 같이 자체 방화벽 규칙을 만들 수 있습니다.

  1. VPC 네트워크 페이지로 이동합니다.
  2. 방화벽 규칙을 적용할 VPC 네트워크를 선택합니다.
  3. 방화벽 규칙 섹션 아래에서 방화벽 규칙 추가를 클릭합니다.
  4. 방화벽 규칙 이름을 지정하고 프로토콜 및 포트 상자에 tcp:80 또는 tcp:443(HTTPS 트래픽의 경우)을 추가합니다.
  5. 만들기를 클릭합니다.
gcloud 명령줄 도구

프로젝트의 모든 가상 머신에 대한 HTTP, HTTPS 트래픽을 허용하려면 다음 명령어를 사용하여 모든 출처에서 이 VPC 네트워크에 연결된 모든 인스턴스로 들어오는 HTTP 및 HTTPS 요청을 허용하는 방화벽을 만듭니다.

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**예제**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

인스턴스를 네트워크 프록시로 구성

하나의 인스턴스만 외부 액세스 권한을 갖고 다른 모든 인스턴스는 이 인스턴스를 프록시 서버로 사용하여 외부에 연결하도록 VPC 네트워크를 설계할 수 있습니다. 이 구성은 VPC 네트워크 내부 또는 외부에 대한 액세스 권한을 제어하거나 여러 개의 외부 IP 주소를 사용하는 비용을 줄이고자 하는 경우에 유용합니다.

이 예제에서는 Debian 이미지를 사용하는 VM 인스턴스에 네트워크 프록시를 설정하는 방법을 설명합니다. 여기서는 게이트웨이 인스턴스를 Squid 프록시 서버로 사용하지만 이 방법은 프록시 서버를 설정하는 방법 중 하나일 뿐입니다.

Squid 프록시 서버를 설정하려면 다음 안내를 따르세요.

  1. 외부(정적 또는 임시) IP 주소가 있는 하나의 인스턴스를 설정합니다. 이 예제에서는 인스턴스의 이름을 gateway-instance로 지정합니다.
  2. gcloud compute instances create ... --no-address를 지정하여 외부 IP 주소가 없는 여러 개의 인스턴스를 설정합니다. 이 예제에서는 이 인스턴스의 이름을 hidden-instance로 지정합니다.
  3. 내부 전용 인스턴스에 직접 연결할 수 없으므로 한 인스턴스에서 다른 인스턴스로 연결하는 방법을 알아봅니다.
  4. 방화벽을 추가하여 포트 3128에서 TCP 트래픽을 허용합니다.

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. gateway-instanceSquid를 설치하고 VPC 네트워크(RFC 1918, RFC 4193, RFC 4291 IP 공간)의 모든 머신에서 액세스할 수 있도록 구성합니다. 여기서는 gateway-instancehidden-instance가 동일한 VPC 네트워크에 연결되어 있어 상호 연결이 가능하다고 가정합니다.

    user@gateway-instance:~$ sudo apt-get install squid3
    

    로컬 네트워크의 모든 머신에서 Squid3 서버를 사용하도록 합니다. 다음 sed 명령어는 주석을 해제하고 로컬 네트워크와 머신의 Squid 구성 파일에 acl localnet src 항목을 사용 설정합니다.

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid/squid.conf
    
    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo cat <<EOF >>/etc/squid/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid3 start
    
  6. gateway-instance를 프록시로 사용하도록 hidden-instance를 구성합니다. 다음과 같이 ssh를 사용하여 hidden-instance에 연결하고, 포트 3128의 gateway-instance를 가리키도록 프록시 URL 주소를 정의합니다(기본 Squid 구성).

    user@gateway-instance:~$ ssh hidden-instance
    
    user@hidden-instance:~$ sudo -s
    
    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    sudoers를 업데이트하여 이러한 env 변수를 전달합니다.

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    
    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    
    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    
    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    
    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    
  7. sudo를 종료하고 변수를 로드하고 hidden-instance에서 apt-get을 실행합니다. 이제 게이트웨이를 프록시로 사용해서 동작할 것입니다. hidden-instance는 인터넷에 직접 연결되지 않으므로 게이트웨이가 프록시 역할을 하지 않는 경우 apt-get이 작동하지 않습니다.

    root@hidden-instance:~# exit
    
    user@hidden-instance:~$ source ~/.profile
    
    user@hidden-instance:~$ sudo apt-get update
    

인스턴스를 VPN 게이트웨이로 구성

Strongswan VPN 소프트웨어를 사용하여 인스턴스 중 하나에 VPN 게이트웨이를 설정할 수 있습니다. 대부분의 사용자는 Strongswan 대신 클라우드 VPN을 사용하는 것이 좋습니다. 클라우드 VPN을 사용하면 VPN 소프트웨어를 실행하기 위한 인스턴스를 만들고 구성할 필요가 없습니다. 클라우드 VPN이 필요한 기능을 제공하지 않는 경우 Strongswan을 사용하세요.

  1. 온프레미스 네트워크가 연결되는 VPC 네트워크를 만듭니다.

    gcloud compute networks create vpn-network --subnet-mode custom
    
  2. 온프레미스 서브넷과 IP 범위가 겹치지 않는 서브넷을 만듭니다.

    gcloud compute networks subnets create vpn-subnet \
        --network vpn-network \
        --region us-central1 \
        --range 10.0.0.0/24 \
    
  3. vpn-subnet 서브넷에 인스턴스를 만듭니다. 이 인스턴스가 VPN 게이트웨이가 됩니다.

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --subnet vpn-subnet \
        --zone us-central1-a \
        --tags vpn-gateway
    
  4. VPN 게이트웨이의 내부, 외부 IP 주소를 확인하고 기록합니다.

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    외부 IP 주소는 natIP 필드의 값입니다. 내부 IP 주소는 networkIP 필드의 값입니다(예: 10.0.0.2).

  5. VPN 게이트웨이를 통해 온프레미스 네트워크의 클라이언트와 통신하는 인스턴스를 만듭니다.

    gcloud compute instances create test-vpn \
        --subnet vpn-subnet \
        --tags vpn \
        --zone us-central1-a
    
  6. 목적지가 온프레미스 네트워크인 경우 vpn-network 네트워크에 VPN 게이트웨이를 통해 트래픽을 라우팅할 경로를 만듭니다.

    gcloud compute routes create vpnnetwork-to-gateway \
        --destination-range [ON_PREM_IP_RANGE] \
        --next-hop-address [VPN_GATEWAY_INTERNAL_IP] \
        --network vpn-network \
        --tags vpn
    

    [VPN_GATEWAY_INTERNAL_IP] 값은 VPN 게이트웨이의 내부 IP 주소입니다(networkIP 필드의 값).

  7. VPC 네트워크에 다음 방화벽 규칙을 추가하여 수신 트래픽을 허용합니다.

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 \
        --allow tcp:22 \
        --network vpn-network
    
    gcloud compute firewall-rules create  allow-internal \
        --source-ranges 10.0.0.0/24 \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --allow all
    
    gcloud compute firewall-rules create allow-ipsec-nat \
        --source-ranges [ON_PREM_VPN_GATEWAY_EXTERNAL_IP]/32 \
        --allow udp:4500,udp:500 \
        --network vpn-network \
        --target-tags vpn-gateway
    
    gcloud compute firewall-rules create from-onprem \
        --source-ranges [ON_PREM_NETWORK_ADDRESS_SPACE] \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --target-tags vpn
    

    온프레미스 네트워크에 방화벽 규칙을 만들어 VPC 네트워크에서 들어오는 트래픽을 허용합니다.

  8. VPN 게이트웨이 인스턴스에 연결합니다.

  9. VPN 소프트웨어 Strongswan을 설치하고 구성합니다.

    홈 디렉토리에서 이름이 ipsec.conf인 파일을 만듭니다. 다음 내용으로 파일을 채우고 자리 표시자를 사용자 환경의 값으로 대체합니다.

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1-modp2048!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=[VPN_GATEWAY_EXTERNAL_IP_ADDRESS]
      leftsubnet=10.0.0.0/24
      leftauth=psk
      leftikeport=4500
      right=[ON_PREM_EXTERNAL_IP_ADDRESS]
      rightsubnet=[ON_PREM_ADDRESS_SPACE]
      rightauth=psk
      rightikeport=4500
    

    그런 다음 [secret-key]를 비밀 키(문자열 값)로 대체하여 다음 명령어를 실행합니다.

    $ sudo apt-get update
    
    $ sudo apt-get install strongswan -y
    
    $ echo "%any : PSK \"[secret-key]\"" | sudo tee /etc/ipsec.secrets > /dev/null
    
    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    
    $ sudo cp ipsec.conf /etc
    
    $ sudo ipsec restart
    

    VPN 터널을 성공적으로 설정하려면 온프레미스 VPN 게이트웨이도 구성해야 합니다.

    온프레미스 게이트웨이 머신이 Debian 기반 운영 체제를 실행 중인 경우 동일한 단계에 따라 Strongswan을 설치하고 구성할 수 있습니다. 예를 들어 ipsec.conf 파일의 복사본을 만들고 왼쪽과 오른쪽 ID, 서브넷을 전환합니다.

  10. test-vpn 인스턴스에서 온프레미스 머신을 핑하여 VPN 터널을 테스트합니다.

    gcloud compute ssh test-vpn --command 'ping -c 3 [ON_PREM_INTERNAL_ADDRESS]'
    

문제해결

위 안내에 따른 VPN 설정에서 문제가 발생하는 경우 다음 팁을 사용하여 문제를 해결하세요.

  1. 연결 상태를 확인합니다.

    $ sudo ipsec status
    

    myconn이 나열되지 않는 경우 연결을 시작합니다.

    $ sudo ipsec up myconn
    
  2. 두 VPN 엔드포인트가 통신이 가능한지 여부를 확인합니다.

    netcat을 사용하여 VPN과 유사한 트래픽(UDP, 포트 4500)을 전송합니다. 로컬 VPN 엔드포인트에서 다음 명령어를 실행합니다.

    $ echo | nc -u [vpn-vm-gateway-external-address] 4500
    

    수신 측에서 tcpdump를 실행하여 VM 인스턴스가 포트 4500에서 패킷을 수신할 수 있는지 확인합니다.

    $ tcpdump -nn -n host [public-ip-of-local-VPN-gateway-machine] -i any
    
  3. ipsec.conf 파일에 다음 줄을 추가하여 더 자세한 로깅을 활성화합니다.

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    그런 다음 연결을 다시 시도합니다. 연결은 여전히 실패하겠지만 로그에서 오류를 확인할 수 있습니다. 로그 파일은 VM 인스턴스의 /var/log/charon.log에 있습니다.

인스턴스를 NAT 게이트웨이로 구성

경로 컬렉션을 변경하여 더 복잡한 네트워킹 시나리오를 만들 수 있습니다. 이 섹션에서는 내부 전용 가상 머신 인스턴스에서 인터넷으로 트래픽을 라우팅할 수 있는 내부 주소 변환(NAT) 게이트웨이 인스턴스를 설정하는 방법에 대해 설명합니다. 이렇게 하면 하나의 외부 IP 주소를 사용하여 여러 가상 머신 인스턴스에서 트래픽을 전송하면서 인터넷에는 하나의 가상 머신만 노출할 수 있습니다.

  1. 먼저, 이 시나리오의 가상 머신 인스턴스를 호스팅할 VPC 네트워크를 만듭니다.

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
    
  2. us-central1 지역의 서브넷을 만듭니다.

    gcloud compute networks subnets create subnet-us-central \
        --network custom-network1 \
        --region us-central1 \
        --range 192.168.1.0/24
    
  3. 방금 만든 새 네트워크에서 SSH 연결을 허용하기 위한 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create custom-network1-allow-ssh \
        --allow tcp:22 \
        --network custom-network1
    
    gcloud compute firewall-rules create custom-network1-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 192.168.1.0/24 \
        --network custom-network1
    
  4. custom-network1에서 NAT 게이트웨이 역할을 할 가상 머신을 만듭니다.

    gcloud compute instances create nat-gateway --network custom-network1 \
        --subnet subnet-us-central \
        --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags nat
    
  5. 게이트웨이 인스턴스를 사용할 외부 IP 주소가 없는 모든 가상 머신 인스턴스에 no-ip 태그를 지정하거나 외부 IP 주소가 없는 새 가상 머신 인스턴스를 만들어 no-ip 태그를 지정합니다.

    • 기존 인스턴스에 태그를 추가합니다.
    gcloud compute instances add-tags existing-instance --tags no-ip
    
    • 또는 외부 IP 주소가 없는 새 가상 머신을 만듭니다.
    gcloud compute instances create example-instance --network custom-network1 \
        --subnet subnet-us-central \
        --no-address \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags no-ip
    
  6. 게이트웨이 인스턴스를 통해 인터넷을 목적지로 하는 트래픽을 보낼 경로를 만듭니다.

    gcloud compute routes create no-ip-internet-route \
        --network custom-network1 \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    이 경로의 우선순위를 설정하면 다른 경로와 충돌하는 경우 이 경로가 우선 적용됩니다. 1000이 기본 우선순위이며 1000보다 낮은 값이 우선합니다.

  7. 그런 다음 게이트웨이 인스턴스에 로그온하고, NAT를 통해 내부 트래픽을 인터넷으로 전달하기 위한 iptables를 구성합니다.

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    인스턴스에서 iptables를 구성합니다.

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    첫 번째 sudo 명령어는 커널에 IP 전달을 허용할 것임을 알립니다. 두 번째 sudo 명령어는 내부 인스턴스에서 받은 패킷을 NAT 게이트웨이 인스턴스에서 보낸 패킷인 것처럼 가장합니다.

    iptables NAT 규칙을 검사하려면 list 옵션을 사용합니다.

    $ sudo iptables -v -L -t nat
    

    출력이 다음 예와 비슷한지 확인합니다.

    Chain PREROUTING (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 64 packets, 4164 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    64  4164 MASQUERADE  all  --  any    eth0    anywhere             anywhere"
    
  8. (선택 사항) 이후 재부팅 시 이러한 설정이 유지되도록 하려면 다음을 실행합니다.

    $ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
    
    $ sudo apt-get install iptables-persistent
    

고가용성 및 고대역폭 NAT 게이트웨이 빌드

이 섹션에서는 더 탄력적인 고대역폭 배포를 위해 등가 다중 경로(ECMP) 라우팅 및 자동 복구를 사용하도록 설정된 여러 NAT 게이트웨이를 설정하는 방법을 설명합니다.

GCP는 가상 머신에 RFC 1918 비공개 IP 주소를 사용합니다. 이러한 VM에서 공개 인터넷의 리소스에 액세스해야 하는 경우 NAT가 필요합니다. 간단한 시나리오에서는 단일 NAT 게이트웨이 아키텍처로 충분합니다. 그러나 더 높은 처리량 또는 가용성을 위해서는 더 탄력적인 아키텍처가 필요합니다.

게이트웨이 구성

여러 개의 경로가 동일한 우선순위를 가진 경우 GCP는 ECMP 라우팅을 사용하여 트래픽을 분산합니다. 이 경우 ECMP를 통해 트래픽의 일부분을 받기 위해 여러 개의 NAT 게이트웨이를 만듭니다. NAT 게이트웨이는 공개 IP 주소를 사용하여 외부 호스트로 트래픽을 전달합니다.

다음 다이어그램은 이 구성을 보여 줍니다.

다중 게이트웨이 구성

탄력성을 더 높이기 위해 개별적으로 관리되는 크기 1의 인스턴스 그룹에 각 게이트웨이를 배치하고, 간단한 상태 확인을 연결하여 장애 발생 시 게이트웨이가 자동으로 다시 시작되도록 합니다. 게이트웨이가 별도의 인스턴스 그룹에 있으므로 인스턴스 템플릿에 연결된 정적 외부 IP를 갖게 됩니다. 이 예에서는 3개의 n1-standard-2 NAT 게이트웨이를 프로비저닝하지만 원하는 수나 크기의 게이트웨이를 사용할 수 있습니다. 예를 들어 n1-standard-2 인스턴스의 네트워크 트래픽은 4Gbps로 제한됩니다. 더 큰 볼륨의 트래픽을 처리해야 하는 경우에는 n1-standard-8을 선택할 수 있습니다.

  1. VPC 네트워크를 만듭니다(필요한 경우). 이러한 게이트웨이를 기존 VPC에 추가하지 않는 경우에는 VPC 네트워크와 서브넷을 만듭니다. 이 게이트웨이를 기존 VPC에 추가하는 경우에는 두 번째 단계로 건너뛰고 환경에 맞게 적절히 지역을 수정합니다.

    1. Cloud Shell을 사용하여 GCP 프로젝트와 연결된 커스텀 VPC를 만듭니다. 이 VPC의 경우 기본값이 아닌 IP 주소를 사용할 수 있지만 기본 방화벽 규칙은 포함하지 않습니다.

      gcloud compute networks create example-vpc --subnet-mode custom
      
    2. 이 VPC 내에 서브넷을 만들고 지역과 IP 범위를 지정합니다. 이 가이드에서는 10.0.1.0/24us-east1 지역을 사용합니다.

      gcloud compute networks subnets create example-east \
          --network example-vpc --range 10.0.1.0/24 --region us-east1
      
  2. 3개의 정적 IP 주소를 예약하고 저장합니다.

    1. us-east1 지역에 이름이 nat-1인 주소를 예약하고 저장합니다.

      gcloud compute addresses create nat-1 --region us-east1
      
      nat_1_ip=$(gcloud compute addresses describe nat-1 \
          --region us-east1 --format='value(address)')
      
    2. us-east1에 이름이 nat-2인 주소를 예약하고 저장합니다.

      gcloud compute addresses create nat-2 --region us-east1
      
      nat_2_ip=$(gcloud compute addresses describe nat-2 \
          --region us-east1 --format='value(address)')
      
    3. us-east1에 이름이 nat-3인 주소를 예약하고 저장합니다.

      gcloud compute addresses create nat-3 --region us-east1
      nat_3_ip=$(gcloud compute addresses describe nat-3 \
          --region us-east1 --format='value(address)')
      
  3. 예약된 IP로 3개의 인스턴스 템플릿을 만듭니다.

    1. 시작 구성을 복사합니다.

      gsutil cp gs://nat-gw-template/startup.sh .
      

      시작 스크립트에 액세스할 수 없는 경우 시작 스크립트 섹션에서 복사합니다.

    2. nat-1 인스턴스 템플릿을 만듭니다.

      gcloud compute instance-templates create nat-1 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
      
    3. nat-2 인스턴스 템플릿을 만듭니다.

      gcloud compute instance-templates create nat-2 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
      
    4. nat-3 인스턴스 템플릿을 만듭니다.

      gcloud compute instance-templates create nat-3 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_3_ip
      

      n1-standard-2 머신 유형에는 두 개의 vCPU가 있으며 최대 4Gbps의 네트워크 대역폭을 사용할 수 있습니다. 대역폭이 더 필요한 경우 다른 호스트를 선택하는 것이 좋습니다. 대역폭은 vCPU당 2Gbps로, 8vCPU 호스트에서 최대 16Gbps까지 확장됩니다.

  4. 응답을 모니터링하기 위한 상태 검사를 만듭니다.

    gcloud compute health-checks create http nat-health-check --check-interval 30 \
        --healthy-threshold 1 --unhealthy-threshold 5 --request-path /health-check
    
    gcloud compute firewall-rules create "natfirewall" \
        --allow tcp:80 --target-tags natgw \
        --source-ranges "130.211.0.0/22","35.191.0.0/16"
    

    시스템이 실패하고 HTTP 트래픽에 응답할 수 없는 경우 다시 시작됩니다. 이 경우 프로젝트가 필요하므로 기존 프로젝트를 사용하거나 새 프로젝트를 만들 수 있습니다.

  5. 각 NAT 게이트웨이에 인스턴스 그룹을 만듭니다.

    gcloud compute instance-groups managed create nat-1 --size=1 --template=nat-1 --zone=us-east1-b
    gcloud compute instance-groups managed create nat-2 --size=1 --template=nat-2 --zone=us-east1-c
    gcloud compute instance-groups managed create nat-3 --size=1 --template=nat-3 --zone=us-east1-d
    
  6. 자동 복구를 설정하여 응답하지 않는 NAT 게이트웨이를 다시 시작합니다.

    gcloud beta compute instance-groups managed set-autohealing nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-1/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-2/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-3/ { print $1 }')
    
  7. 인스턴스에 기본 경로를 추가합니다.

    gcloud compute routes create natroute1 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-b \
        --next-hop-instance $nat_1_instance
    gcloud compute routes create natroute2 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-c \
        --next-hop-instance $nat_2_instance
    gcloud compute routes create natroute3 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-d \
        --next-hop-instance $nat_3_instance
    
  8. 사용할 인스턴스에 NAT 태그를 지정합니다.

    gcloud compute instances add-tags natted-servers --tags no-ip
    
  9. NAT 기능을 테스트합니다. 게이트웨이가 구성되고 게스트 VM에 태그가 지정된 상태에서 이 예와 같이 VM에 외부 IP를 부여하지 않고 외부 호스트를 핑합니다.

    ping 8.8.8.8

    출력 예:

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=0.618 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.325 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.443 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.314 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=0.386 ms
    

고려할 문제

이 구성은 us-east1 지역에 각각 2Gbps를 지원하는 3개의 NAT 게이트웨이를 제공합니다. 그러나 ECMP 부하 분산은 완벽하지 않으며 개별 흐름은 여러 링크에 분산되지 않습니다.

  • 배포 자동화를 위해 이 구성에 Terraform 모듈을 사용할 수도 있습니다.
  • 이 구성은 임시 또는 비상태 추적 발신 링크에 가장 적합합니다. NAT 게이트웨이 풀의 크기가 변경되는 경우 TCP 연결의 부하가 다시 분산되고, 이로 인해 기존 연결이 재설정될 수 있습니다.
  • 노드는 자동으로 업데이트되지 않으므로 Debian 기본 설치에 위협 요소가 있는 경우 수동으로 업데이트해야 합니다.
  • 이러한 인스턴스는 모두 us-east1 지역에 있습니다. VM이 다른 영역에 있는 경우 해당 영역에 더 가깝게 게이트웨이를 이동하면 더 나은 성능을 얻을 수 있습니다.
  • 게이트웨이당 대역폭은 단방향 기준 코어당 최대 2Gbps입니다. 게이트웨이에 오류가 발생한 동안 트래픽은 나머지 게이트웨이로 분산되지만 실행 중인 흐름이 다시 프로그래밍되지는 않으므로 게이트웨이가 온라인으로 복구될 때 트래픽이 즉시 제자리로 돌아오지는 않습니다. 따라서 규모를 설정할 때 충분한 오버헤드를 허용해야 합니다.
  • 예상치 못한 결과에 대한 알림을 받으려면 Stackdriver를 사용하여 관리형 인스턴스 그룹과 네트워크 트래픽을 모니터링하세요.

시작 스크립트: startup.sh

3a 단계에 언급된 시작 스크립트:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

cat <<EOF > /usr/local/sbin/health-check-server.py
#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess

PORT_NUMBER = 80
PING_HOST = "www.google.com"

def connectivityCheck():
  try:
    subprocess.check_call(["ping", "-c", "1", PING_HOST])
    return True
  except subprocess.CalledProcessError as e:
    return False

#This class handles any incoming request
class myHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    if self.path == '/health-check':
      if connectivityCheck():
        self.send_response(200)
      else:
        self.send_response(503)
    else:
      self.send_response(404)

try:
  server = HTTPServer(("", PORT_NUMBER), myHandler)
  print "Started httpserver on port " , PORT_NUMBER
  #Wait forever for incoming http requests
  server.serve_forever()

except KeyboardInterrupt:
  print "^C received, shutting down the web server"
  server.socket.close()
EOF

nohup python /usr/local/sbin/health-check-server.py >/dev/null 2>&1 &

인스턴스 기반 NAT 게이트웨이를 Cloud NAT로 이전

인스턴스 기반 NAT 게이트웨이가 있지만 Cloud NAT로 마이그레이션하려면 다음을 수행하세요.

  1. 인스턴스 기반 게이트웨이가 있는 동일한 지역에 Cloud NAT를 구성합니다.
  2. 인스턴스 기반 NAT 게이트웨이에 패킷을 보내는 정적 경로를 삭제합니다. 여전히 네트워크에 대한 기본 게이트웨이 경로가 있어야 합니다.
  3. 트래픽은 Cloud NAT를 통과하기 시작해야 합니다.
  4. 모든 항목이 제대로 작동하고 있음을 확인한 후 인스턴스 기반 NAT 게이트웨이를 삭제합니다.

다음 단계

  • VPC 네트워크에 대한 자세한 내용은 VPC 개요를 참조하세요.
  • VPC 네트워크를 만들고 수정하는 방법은 VPC 사용을 참조하세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...