1. 소개
정적 커스텀 경로는 VPC의 기본 라우팅 동작에 영향을 미칩니다. 이제 IPv6 커스텀 경로에서 새로운 다음 홉 속성인 next-hop-gateway, next-hop-instance, next-hop-address를 지원합니다. 이 Codelab에서는 멀티 NIC VM 인스턴스로 연결된 두 개의 VPC를 사용하여 이러한 새 다음 홉 옵션과 함께 IPv6 맞춤 경로를 사용하는 방법을 설명합니다. 또한 ULA 주소 지정과 GUA 주소 지정을 혼합하고 새 맞춤 경로 기능을 사용하여 ULA VPC에 대한 연결성을 공개 인터넷에 제공하는 방법을 보여줍니다.
학습할 내용
- ILB 이름을 지정하여 next-hop-ilb 다음 홉이 있는 IPv6 맞춤 경로를 만드는 방법
- ILB의 IPv6 주소를 지정하여 next-hop-ilb 다음 홉이 있는 IPv6 맞춤 경로를 만드는 방법
필요한 항목
- Google Cloud 프로젝트
2. 시작하기 전에
Codelab을 지원하도록 프로젝트 업데이트
이 Codelab에서는 $variables를 사용하여 Cloud Shell에서 gcloud 구성을 구현합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export projectname=$(gcloud config list --format="value(core.project)")
전체 실습 아키텍처
두 가지 유형의 커스텀 경로 다음 홉을 모두 보여주기 위해 ULA 주소 지정을 사용하는 클라이언트 VPC와 서버 VPC라는 두 가지 VPC를 만듭니다.
클라이언트 VPC가 서버에 액세스하려면 두 ILB 사이에 샌드위치된 멀티 NIC 게이트웨이 인스턴스 그룹 앞에 있는 ILB를 가리키는 next-hop-ilb (ILB 이름 사용)를 사용하는 맞춤 경로를 활용합니다. 기본 ::/0 경로를 삭제한 후 클라이언트 인스턴스로 다시 라우팅을 제공하려면 ILB를 가리키는 next-hop-ilb(ILB 주소 사용)가 있는 맞춤 경로를 활용합니다.
3. 클라이언트 VPC 설정
클라이언트 VPC 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create client-vpc \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional \
--enable-ula-internal-ipv6
클라이언트 서브넷 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create client-subnet \
--network=client-vpc \
--project=$projectname \
--range=192.168.1.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=internal \
--region=us-central1
이 명령어를 사용하여 할당된 IPv6 서브넷을 환경 변수에 기록합니다.
export client_subnet=$(gcloud compute networks subnets \
describe client-subnet \
--project $projectname \
--format="value(internalIpv6Prefix)" \
--region us-central1)
클라이언트 인스턴스 실행
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create client-instance \
--subnet client-subnet \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
클라이언트 VPC 트래픽에 대한 방화벽 규칙 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create allow-gateway-client \
--direction=INGRESS --priority=1000 \
--network=client-vpc --action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
클라이언트 인스턴스에 IAP를 허용하는 방화벽 규칙 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create allow-iap-client \
--direction=INGRESS --priority=1000 \
--network=client-vpc --action=ALLOW \
--rules=tcp:22 --source-ranges=35.235.240.0/20 \
--project=$projectname
클라이언트 인스턴스에 대한 SSH 액세스 확인
Cloud Shell에서 클라이언트 인스턴스에 로그인합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
성공하면 클라이언트 인스턴스의 터미널 창이 표시됩니다. SSH 세션을 종료하여 Codelab을 계속 진행합니다.
4. 서버 VPC 설정
서버 VPC 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create server-vpc \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional \
--enable-ula-internal-ipv6
서버 서브넷 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create server-subnet \
--network=server-vpc \
--project=$projectname \
--range=192.168.0.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=internal \
--region=us-central1
이 명령어를 사용하여 할당된 서브넷을 환경 변수에 기록합니다.
export server_subnet=$(gcloud compute networks subnets \
describe server-subnet \
--project $projectname \
--format="value(internalIpv6Prefix)" \
--region us-central1)
서버 VM 실행
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances create server-instance \
--subnet server-subnet \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
클라이언트에서 서버에 액세스할 수 있도록 방화벽 규칙 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create allow-client-server \
--direction=INGRESS --priority=1000 \
--network=server-vpc --action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
IAP를 허용하는 방화벽 규칙 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create allow-iap-server \
--direction=INGRESS --priority=1000 \
--network=server-vpc --action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20 \
--project=$projectname
ULA 서버 인스턴스에 Apache 설치
Cloud Shell에서 클라이언트 인스턴스에 로그인합니다.
gcloud compute ssh server-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
서버 VM 셸 내에서 다음 명령어를 실행합니다.
sudo apt update && sudo apt -y install apache2
Apache가 실행 중인지 확인
sudo systemctl status apache2
기본 웹페이지 덮어쓰기
echo '<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>' | sudo tee /var/www/html/index.html
SSH 세션을 종료하여 Codelab을 계속 진행합니다.
5. 게이트웨이 인스턴스 만들기
다중 NIC 게이트웨이 인스턴스 템플릿 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute instance-templates create gateway-instance-template \
--project=$projectname \
--instance-template-region=us-central1 \
--region=us-central1 \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet,no-address \
--can-ip-forward \
--metadata=startup-script='#! /bin/bash
sudo sysctl -w net.ipv6.conf.ens4.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens5.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens4.accept_ra_defrtr=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1'
다중 NIC 게이트웨이 인스턴스 그룹 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute instance-groups managed create gateway-instance-group \
--project=$projectname \
--base-instance-name=gateway-instance \
--template=projects/$projectname/regions/us-central1/instanceTemplates/gateway-instance-template \
--size=2 \
--zone=us-central1-a
게이트웨이 인스턴스 확인
시작 스크립트가 올바르게 전달되었는지, v6 라우팅 테이블이 올바른지 확인합니다. 게이트웨이 인스턴스 중 하나에 SSH로 연결
Cloud Shell에서 다음을 실행하여 게이트웨이 인스턴스를 나열합니다.
gcloud compute instances list \
--project=$projectname \
--zones=us-central1-a \
--filter name~gateway \
--format 'csv(name)'
인스턴스 이름 중 하나를 기록하고 다음 명령어에서 사용하여 인스턴스에 SSH로 연결합니다.
Cloud Shell에서 게이트웨이 인스턴스 중 하나에 로그인합니다.
gcloud compute ssh gateway-instance-<suffix> \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
게이트웨이 VM 셸 내에서 다음 명령어를 실행하여 IPv6 전달을 확인합니다.
sudo sysctl net.ipv6.conf.all.forwarding
이 명령어는 IPv6 전달이 사용 설정되었음을 나타내는 '1' 값을 반환해야 합니다.
인스턴스의 IPv6 라우팅 테이블 확인
ip -6 route show
ULA 및 GUA 서브넷 경로를 모두 보여주는 샘플 출력으로, 기본 경로는 GUA 인터페이스를 가리킵니다.
::1 dev lo proto kernel metric 256 pref medium
2600:1900:4000:7a7f:0:1:: dev ens4 proto kernel metric 256 expires 83903sec pref medium
2600:1900:4000:7a7f::/65 via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
fd20:3df:8d5c::1:0:0 dev ens5 proto kernel metric 256 expires 83904sec pref medium
fd20:3df:8d5c::/64 via fe80::4001:c0ff:fea8:1 dev ens5 proto ra metric 1024 expires 84sec pref medium
fe80::/64 dev ens5 proto kernel metric 256 pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
SSH 세션을 종료하여 Codelab을 계속 진행합니다.
6. 부하 분산기 구성요소 만들기
두 VPC에서 경로를 만들기 전에 게이트웨이 인스턴스 양쪽에 내부 패스 스루 부하 분산기를 만들어 트래픽을 전달해야 합니다.
이 Codelab에서 만든 부하 분산기는 다음으로 구성됩니다.
- 상태 점검: 이 Codelab에서는 포트 22를 타겟팅하는 간단한 상태 점검을 만듭니다. 상태 확인은 배포된 상태로 작동하지 않습니다. 상태 확인을 허용하고 게이트웨이 인스턴스에서 특수 경로를 만들기 위한 방화벽 규칙을 추가해야 합니다. 이 Codelab에서는 IPv6 전달에 중점을 두므로 모든 백엔드가 비정상일 때 최후의 수단으로 모든 백엔드로 전달하는 기본 내부 패스 스루 부하 분산기의 트래픽 분산 동작을 사용합니다.
- 백엔드 서비스: 백엔드 서비스에는 TCP 프로토콜을 사용합니다. 하지만 부하 분산기는 라우팅 목적으로 생성되므로 백엔드 서비스 프로토콜과 관계없이 모든 프로토콜이 전달됩니다.
- 전달 규칙: VPC당 전달 규칙을 만듭니다 .
- 내부 IPv6 주소: 이 Codelab에서는 전달 규칙이 서브넷에서 IPv6 주소를 자동으로 할당하도록 합니다.
상태 점검 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute health-checks create tcp tcp-hc-22 \
--project=$projectname \
--region=us-central1 \
--port=22
백엔드 서비스 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute backend-services create bes-ilb-clientvpc \
--project=$projectname \
--load-balancing-scheme=internal \
--protocol=tcp \
--network=client-vpc \
--region=us-central1 \
--health-checks=tcp-hc-22 \
--health-checks-region=us-central1
gcloud compute backend-services create bes-ilb-servervpc \
--project=$projectname \
--load-balancing-scheme=internal \
--protocol=tcp \
--network=server-vpc \
--region=us-central1 \
--health-checks=tcp-hc-22 \
--health-checks-region=us-central1
백엔드 서비스에 인스턴스 그룹 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute backend-services add-backend bes-ilb-clientvpc \
--project=$projectname \
--region=us-central1 \
--instance-group=gateway-instance-group \
--instance-group-zone=us-central1-a
gcloud compute backend-services add-backend bes-ilb-servervpc \
--project=$projectname \
--region=us-central1 \
--instance-group=gateway-instance-group \
--instance-group-zone=us-central1-a
전달 규칙 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute forwarding-rules create fr-ilb-clientvpc \
--project=$projectname \
--region=us-central1 \
--load-balancing-scheme=internal \
--network=client-vpc \
--subnet=client-subnet \
--ip-protocol=TCP \
--ip-version=IPV6 \
--ports=ALL \
--backend-service=bes-ilb-clientvpc \
--backend-service-region=us-central1
gcloud compute forwarding-rules create fr-ilb-servervpc \
--project=$projectname \
--region=us-central1 \
--load-balancing-scheme=internal \
--network=server-vpc \
--subnet=server-subnet \
--ip-protocol=TCP \
--ip-version=IPV6 \
--ports=ALL \
--backend-service=bes-ilb-servervpc \
--backend-service-region=us-central1
Cloud Shell에서 다음 명령어를 실행하여 두 전달 규칙의 IPv6 주소를 기록합니다.
export fraddress_client=$(gcloud compute forwarding-rules \
describe fr-ilb-clientvpc \
--project $projectname \
--format="value(IPAddress)" \
--region us-central1)
export fraddress_server=$(gcloud compute forwarding-rules \
describe fr-ilb-servervpc \
--project $projectname \
--format="value(IPAddress)" \
--region us-central1)
7. 부하 분산기 주소를 사용하여 부하 분산기 라우트 만들기 및 테스트
이 섹션에서는 부하 분산기의 IPv6 주소를 다음 홉으로 사용하여 클라이언트 및 서버 VPC 모두에 경로를 추가합니다.
서버 주소 기록
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances list \
--project $projectname \
--zones us-central1-a \
--filter="name~server-instance" \
--format='value[separator=","](name,networkInterfaces[0].ipv6Address)'
그러면 서버 인스턴스 이름과 IPv6 접두사가 모두 출력됩니다. 샘플 출력
server-instance,fd20:3df:8d5c:0:0:0:0:0
서버 주소를 기록해 둡니다. 나중에 클라이언트 인스턴스의 curl 명령어에서 사용합니다. 안타깝게도 환경 변수는 SSH 세션을 통해 전송되지 않으므로 이를 저장하는 데 쉽게 사용할 수 없습니다.
클라이언트에서 ULA 서버 인스턴스로 curl 명령어 실행
새 경로를 추가하기 전에 동작을 확인합니다. 클라이언트 인스턴스에서 server-instance1을 향해 curl 명령어를 실행합니다.
Cloud Shell에서 클라이언트 인스턴스에 로그인합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
클라이언트 인스턴스 내에서 server1 인스턴스의 ULA IPV6 주소를 사용하여 curl을 실행합니다. 이 명령어는 curl이 너무 오래 기다리지 않도록 5초의 짧은 제한 시간을 설정합니다.
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
클라이언트 VPC에 아직 서버 VPC로 향하는 경로가 없으므로 이 curl 명령어는 시간 초과되어야 합니다.
문제를 해결해 보겠습니다. 지금은 SSH 세션을 종료합니다.
클라이언트 VPC에 커스텀 경로 추가
클라이언트 VPC에 ULA 접두사로 향하는 경로가 없기 때문입니다. 이제 주소별로 클라이언트 측 ILB를 가리키는 경로를 만들어 추가해 보겠습니다.
참고: IPv6 내부 패스 스루 부하 분산기에는 /96 주소가 할당됩니다. 주소를 다음 명령어에 전달하기 전에 주소에서 /96 마스크를 제거해야 합니다. (아래에서 bash 인플레이스 대체가 사용됨)
Cloud Shell에서 다음을 실행합니다.
gcloud compute routes create client-to-server-route \
--project=$projectname \
--destination-range=$server_subnet \
--network=client-vpc \
--next-hop-ilb=${fraddress_client//\/96}
클라이언트 인스턴스로 다시 SSH 연결합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
클라이언트 인스턴스 내에서 서버 인스턴스에 대한 curl을 다시 시도합니다. (이 명령어는 curl이 너무 오래 기다리지 않도록 5초의 짧은 제한 시간을 설정합니다.)
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
서버 VPC에 아직 게이트웨이 인스턴스를 통해 클라이언트 VPC로 돌아가는 경로가 없으므로 이 curl 명령어는 여전히 시간 초과됩니다.
SSH 세션을 종료하여 Codelab을 계속 진행합니다.
서버 VPC에 커스텀 경로 추가
Cloud Shell에서 다음을 실행합니다.
gcloud compute routes create server-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc \
--next-hop-ilb=${fraddress_server//\/96}
클라이언트 인스턴스로 다시 SSH 연결합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
클라이언트 인스턴스 내에서 서버 인스턴스에 대한 curl을 다시 시도합니다.
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
이제 이 curl 명령어가 성공적으로 실행되어 클라이언트 인스턴스에서 ULA 서버 인스턴스로의 엔드 투 엔드 도달 가능성이 있음을 보여줍니다. 이제는 next-hop-ilb를 다음 홉으로 사용하는 IPv6 맞춤 경로를 통해서만 이 연결을 설정할 수 있습니다.
샘플 출력
<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[fd20:3df:8d5c:0:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>
SSH 세션을 종료하여 Codelab을 계속 진행합니다.
8. 부하 분산기 이름을 사용하여 부하 분산기 라우트 만들기 및 테스트
또는 next-hop-ilb가 IPv6 주소 대신 부하 분산기의 이름을 참조할 수도 있습니다. 이 섹션에서는 이를 수행하는 절차를 살펴보고 클라이언트와 서버 간에 여전히 연결이 설정되어 있는지 테스트합니다.
이전 경로 삭제
인스턴스 이름을 사용하는 커스텀 경로를 삭제하여 커스텀 경로를 추가하기 전의 환경으로 복원해 보겠습니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute routes delete client-to-server-route --quiet --project=$projectname
gcloud compute routes delete server-to-client-route --quiet --project=$projectname
클라이언트에서 ULA 서버 인스턴스로 curl 명령어 실행
이전 경로가 삭제되었는지 확인하려면 클라이언트 인스턴스에서 server-instance1을 향해 curl 명령어를 실행합니다.
Cloud Shell에서 클라이언트 인스턴스에 로그인합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
클라이언트 인스턴스 내에서 server1 인스턴스의 ULA IPV6 주소를 사용하여 curl을 실행합니다. 이 명령어는 curl이 너무 오래 기다리지 않도록 5초의 짧은 제한 시간을 설정합니다.
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
클라이언트 VPC에 더 이상 서버 VPC로 향하는 경로가 없으므로 이 curl 명령어는 시간 초과되어야 합니다.
클라이언트 및 서버 VPC에 커스텀 경로 추가
클라이언트 및 서버 VPC 모두에서 커스텀 경로를 다시 추가하지만 ILB의 주소 대신 명령어에 ILB의 이름과 리전을 사용합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute routes create client-to-server-route \
--project=$projectname \
--destination-range=$server_subnet \
--network=client-vpc \
--next-hop-ilb=fr-ilb-clientvpc \
--next-hop-ilb-region=us-central1
gcloud compute routes create server-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc \
--next-hop-ilb=fr-ilb-servervpc \
--next-hop-ilb-region=us-central1
클라이언트 인스턴스로 다시 SSH 연결합니다.
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
클라이언트 인스턴스 내에서 서버 인스턴스에 대한 curl을 다시 시도합니다. (이 명령어는 curl이 너무 오래 기다리지 않도록 5초의 짧은 제한 시간을 설정합니다.)
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
이제 이 curl 명령어가 성공적으로 실행되어 클라이언트 인스턴스에서 ULA 서버 인스턴스로의 엔드 투 엔드 도달 가능성이 있음을 보여줍니다.
9. 삭제
커스텀 경로 정리
Cloud Shell에서 다음을 실행합니다.
gcloud compute routes delete client-to-server-route --quiet --project=$projectname
gcloud compute routes delete server-to-client-route --quiet --project=$projectname
LB 구성요소 정리
Cloud Shell에서 다음을 실행합니다.
gcloud compute forwarding-rules delete fr-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute forwarding-rules delete fr-ilb-servervpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-servervpc --region us-central1 --quiet --project=$projectname
gcloud compute health-checks delete tcp-hc-22 --region us-central1 --quiet --project=$projectname
인스턴스 및 인스턴스 템플릿 삭제
Cloud Shell에서 다음을 실행합니다.
gcloud compute instances delete client-instance --zone us-central1-a --quiet --project=$projectname
gcloud compute instances delete server-instance --zone us-central1-a --quiet --project=$projectname
gcloud compute instance-groups managed delete gateway-instance-group --zone us-central1-a --quiet --project=$projectname
gcloud compute instance-templates delete gateway-instance-template --region us-central1 --quiet --project=$projectname
서브넷 정리
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets delete client-subnet --region=us-central1 --quiet --project=$projectname
gcloud compute networks subnets delete server-subnet --region=us-central1 --quiet --project=$projectname
방화벽 규칙 삭제
Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules delete allow-iap-client --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server --quiet --project=$projectname
gcloud compute firewall-rules delete allow-gateway-client --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server --quiet --project=$projectname
VPC 정리
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks delete client-vpc --quiet --project=$projectname
gcloud compute networks delete server-vpc --quiet --project=$projectname
10. 축하합니다
다음 홉이 next-hop-ilb로 설정된 정적 커스텀 IPv6 경로를 성공적으로 사용했습니다. 또한 이러한 경로를 사용하여 엔드 투 엔드 IPv6 통신을 확인했습니다.
다음 단계
다음 Codelab을 확인하세요.
- IPv6 주소를 사용하여 온프레미스 호스트에서 Google API에 액세스
- IP 주소 지정 옵션 IPv4 및 IPv6
- IPv6 정적 경로 다음 홉 인스턴스, 다음 홉 주소, 다음 홉 게이트웨이 사용