Cloud Service Practice 05
0.0.0.0/0 라우팅이 퍼블릭 서브넷의 길을 여는 방식
인터넷 게이트웨이가 이미 붙어 있는데도 왜 라우팅 테이블에 0.0.0.0/0 경로를 추가하고 서브넷 연결까지 해야 하는지 헷갈린다.
근거 · 교안 p27-p36
1장: 인터넷 게이트웨이는 ‘다리’일 뿐, ‘길 안내판’은 아니다
솔라는 자신의 노트북 화면을 만족스럽게 바라봤다. 가상 공간에 자신만의 작은 네트워크(VPC)를 만들고, 그 안에 서버(EC2 인스턴스)를 한 대 배치했다. 그리고 방금, 이 작은 네트워크를 바깥 세상과 연결해 줄 ‘인터넷 게이트웨이’라는 부품을 네트워크의 대문에 딱 붙였다. 이제 이 안에 있는 서버는 당연히 인터넷을 쓸 수 있을 터였다.
“자, 다 됐어! 이제 내 서버도 구글이랑 통신할 수 있겠지.”
솔라가 의기양양하게 말하며 서버에 접속했다. 옆에서 조용히 지켜보던 언니 루나가 물었다.
“정말? 어떻게 확신해?”
“응? 당연하지. 여기 봐봐.”
솔라는 AWS 콘솔 화면을 가리켰다. 그림처럼 VPC에 인터넷 게이트웨이가 ‘연결됨(Attached)’ 상태로 표시되어 있었다. 마치 집 현관문에 우편함을 단 것처럼, 외부와 통하는 창구가 명확히 보였다.
“이렇게 인터넷으로 나가는 문을 달아줬는데, 그럼 인터넷이 돼야지. 안 그래? 아까 설명서에도 ‘인터넷과 통신하려면 인터넷 게이트웨이가 필요하다’고 써 있었는걸.”
솔라는 인터넷에 떠도는 어떤 글귀를 떠올렸다. ‘EC2 인스턴스에서 인터넷으로 통신하려면 인터넷 게이트웨이로 패킷을 전달하는 라우팅 설정이 필요합니다.’ 솔라는 이 문장에서 ‘라우팅 설정’이라는 뒷부분은 그냥 넘어갔다. 게이트웨이를 연결하는 것 자체가 그 설정이라고 생각했기 때문이다.
“그럼, 한번 확인해 볼까?”
루나의 말에 솔라는 자신 있게 검은 터미널 창을 열었다. 전 세계 누구나 접속할 수 있는 구글의 공개 주소로 신호를 보내보기로 했다.
ping 8.8.8.8
명령어를 입력하고 엔터를 쳤다. 깜빡이는 커서 옆으로 응답이 돌아오길 기다렸다.
1초, 2초, 3초…
아무런 소식이 없었다. 화면에는 정적만 흘렀다. 잠시 후, 터미널은 ‘Destination Host Unreachable’ 혹은 그냥 아무런 응답 없이 멈춰버렸다.
“어? 왜 안 되지? 분명히 게이트웨이를 붙였는데.”
솔라는 당황했다. VPC 대시보드로 돌아가 인터넷 게이트웨이가 제대로 연결되어 있는지 다시 확인했다. ‘연결됨’. 틀림없었다. 서버도 분명히 ‘실행 중’ 상태였다. 대체 뭐가 문제일까.
“연결이 안 되는 게 아니라, 길을 못 찾는 걸지도 몰라.”
루나가 조용히 말했다.
“길을 못 찾는다고? 길이 여기 있는데?”
솔라는 여전히 VPC와 인터넷 게이트웨이가 선으로 이어진 다이어그램을 가리켰다. 루나는 고개를 저으며 비유를 들어 설명하기 시작했다.
“우리가 사는 동네(VPC)와 외부 도시(인터넷) 사이에 커다란 강이 흐른다고 상상해 봐. 방금 솔라 네가 한 일은, 그 강 위에 아주 튼튼하고 멋진 ‘다리(인터넷 게이트웨이)’를 건설한 거야.”
“응, 그렇지. 다리를 놨으니 건너갈 수 있어야지.”
“맞아. 다리는 존재해. 하지만 동네 골목골목을 돌아다니는 자동차(데이터 패킷)들이 그 다리의 존재를 알까? 동네를 빠져나가려는 차가 사거리에 도착했을 때, 어디에도 ‘외부 도시 방면은 이쪽’이라는 길 안내판이 없다면 어떻게 될까?”
루나의 말에 솔라는 잠시 생각에 잠겼다. 수많은 갈림길에서 이정표 없이 헤매는 자동차들의 모습이 그려졌다. 운전자는 외부로 나가는 길이 어딘지 몰라 동네 안만 뱅뱅 돌 것이다.
“차가… 동네 밖으로 나가지 못하고 계속 안에서만 맴돌겠네.”
“바로 그거야. 인터넷 게이트웨이는 ‘다리’ 그 자체일 뿐이야. 트래픽이 그 다리를 건너도록 지시하는 ‘길 안내판’은 아니거든. 지금 솔라 네 서버가 보낸 신호는, 안내판이 없어서 동네 밖으로 나가는 길을 찾지 못하고 VPC 안에서 사라져 버린 거야.”
그제야 솔라는 깨달았다. 인터넷 게이트웨이를 VPC에 ‘연결’하는 행위는, 그저 물리적인 통로를 마련해 둔 것에 불과했다. 그 통로를 실제로 이용하게 하려면, 네트워크 내부의 트래픽에게 ‘저쪽으로 가라’고 알려주는 명시적인 지시가 필요하다는 것을. 아까 스쳐 지나갔던 ‘라우팅 설정이 필요하다’는 문장의 의미가 비로소 선명하게 다가왔다.
“아… 그럼 다리를 만들어 놓기만 하고, 이정표를 세우지 않은 거구나.”
솔라는 자신의 실수를 인정했다. 단순히 문을 다는 것과, 그 문을 이용하는 방법을 알려주는 것은 전혀 다른 차원의 문제였다.
“그럼 이제 뭘 해야 할지 알겠네.”
“응. 길 안내판을 세워야지.”
솔라가 대답했다. 하지만 곧 새로운 질문이 떠올랐다.
“그런데… 그 길 안내판에는 뭐라고 써야 하지? 세상의 모든 인터넷 주소를 목적지로 다 적어둘 수는 없잖아. ‘어디든 VPC 바깥으로 가는 거면 무조건 저 다리로 가!’라고 알려주는, 그런 만능 안내판 같은 게 필요할 것 같은데.”
2장: 0.0.0.0/0 경로는 외부로 가는 ‘모든 길’의 이정표
솔라는 VPC 관리 화면의 ‘라우팅 테이블’ 섹션을 뚫어져라 쳐다봤다. 언니의 비유가 머릿속을 맴돌았다. 다리는 놨지만 길 안내판이 없다는 말. 이제 그 안내판을 만들 차례였다. 화면 중앙에는 마치 텅 빈 게시판 같은 테이블이 놓여 있었다.
기본적으로 생성된 경로가 한 줄 있었다. 10.0.0.0/16을 향하는 트래픽은 local에서 처리하라는 내용이었다. ‘동네(VPC) 안에서 오가는 건 동네 안에서 해결한다’는 뜻으로 보였다. 솔라의 관심사는 그게 아니었다. 동네 밖, 즉 인터넷으로 나가는 길을 알려주는 만능 안내판. 솔라는 ‘경로 추가’ 버튼을 눌렀다. 대상(Destination)과 타겟(Target)을 입력하는 칸이 새로 나타났다.
“‘어디든 VPC 바깥으로 가는 거면 무조건 저 다리로 가!’… 이걸 어떻게 표현하지?”
잠시 고민하던 솔라는 인터넷 검색에서 본 기억을 더듬었다. ‘인터넷 전체 주소를 뜻한다’는 설명과 함께 등장했던 이상한 숫자 조합.
“혹시… 이건가?”
솔라는 대상 칸에 0.0.0.0/0을 입력했다. 그리고 타겟 칸을 클릭하자, 선택지 목록에 조금 전 만들었던 ‘인터넷 게이트웨이’가 보였다. 솔라는 망설임 없이 그것을 선택했다.
| 대상 (Destination) | 타겟 (Target) |
|---|---|
10.0.0.0/16 | local |
0.0.0.0/0 | igw-xxxxxxxx |
테이블에 새로운 한 줄이 추가된 것을 보자 솔라의 얼굴에 화색이 돌았다. 완벽했다. 첫 번째 줄은 ‘내부 통신 규칙’, 그리고 두 번째 줄은 ‘그 외 모든 외부 통신은 인터넷 게이트웨이로!’라는 명시적인 지시. 이것이야말로 자신이 찾던 만능 안내판이었다.
“좋아, 이번에야말로 진짜 되겠지.”
솔라는 자신만만하게 다시 서버의 터미널 창을 띄웠다. 이제 다리도 있고, 그 다리로 가는 길을 가리키는 완벽한 이정표도 세웠다. 실패할 이유가 없었다.
ping 8.8.8.8
또다시 엔터 키를 눌렀다. 그러나 기대와 달리 화면은 1분 전과 똑같았다. 깜빡이는 커서는 대답이 없었고, 시간만 흘렀다. 결국 돌아온 것은 똑같은 실패 메시지였다.
“말도 안 돼! 왜 또 안 되는 거야?”
솔라의 목소리가 커졌다. 그녀는 방금 자신이 추가한 라우팅 규칙을 다시 확인했다. 0.0.0.0/0 경로는 분명 인터넷 게이트웨이를 향하고 있었다.
“다리도 있고, 안내판도 세웠잖아. 그런데 왜 차는 아직도 길을 잃는 건데?”
솔라의 질문에 루나는 마우스를 움직여 라우팅 테이블 화면을 가리켰다.
“안내판은 잘 만들었어. ‘모든 외부행 차량은 저 다리를 이용하시오’라고 정확하게 쓰여 있네. 0.0.0.0/0이 바로 그 ‘모든 외부행’이라는 뜻이니까.”
“그런데 왜!”
“그럼 그 안내판, 지금 어디에 있어?”
루나의 엉뚱한 질문에 솔라는 잠시 말을 잃었다.
“어디 있긴, 여기 라우팅 테이블에 있지.”
“그래. 우리 동네 비유로 돌아가 보자. 동네 모든 교통 규칙을 담은 ‘교통 규칙집’을 동사무소에 아주 멋지게 만들어 비치해 둔 거야. 그런데 솔라 네 서버, 즉 자동차는 지금 A번가에 있거든. A번가에 있는 자동차가 동사무소 안에 있는 규칙집을 보고 운전할까?”
루나의 비유를 듣고 나서야 솔라는 무언가 중요한 것을 놓치고 있음을 깨달았다. 규칙을 만드는 행위와, 그 규칙을 특정 장소에 적용하는 행위는 별개였다.
“아니… 그럴 리 없지. 운전자는 자기 눈앞에 있는 신호등이나 표지판을 보겠지.”
“바로 그거야. 지금 솔라 네가 만든 건 ‘퍼블릭 통신용 교통 규칙집’이야. 하지만 아직 그 규칙집을 A번가 입구에 가져다 놓지 않았어. 그래서 A번가를 달리는 차들은 여전히 어느 쪽이 외부로 나가는 길인지 모르는 거지.”
루나는 화면의 ‘서브넷 연결(Subnet Associations)’ 탭을 클릭했다. 그 안에는 ‘다음 서브넷이 이 라우팅 테이블과 명시적으로 연결되었습니다’라는 제목 아래 텅 빈 목록만 보였다.
솔라는 허탈한 웃음을 터뜨렸다. 인터넷 게이트웨이를 VPC에 연결하는 것만으로 충분하지 않았듯, 훌륭한 라우팅 규칙을 만드는 것만으로도 충분하지 않았다. 그 규칙을 ‘누가’ 따를지 정해주는 마지막 단계가 남아있었다.
“알겠다. 그럼 이제 이 완벽한 길 안내판을 내 서버가 있는 동네 입구에다 실제로 갖다 놔야 하는 거구나.”
솔라는 자신이 만든 EC2 인스턴스가 어느 서브넷에 있는지 떠올렸다. 그리고 텅 빈 서브넷 연결 목록을 바라보며 중얼거렸다.
“규칙집을 만들었으니, 이제 이걸 읽어야 할 대상을 지정해 줘야 하는 거네. 대체 한 번에 되는 게 없네.”
3장: 서브넷 연결: ‘길 안내판’을 서브넷에 할당하는 마지막 단계
솔라는 라우팅 테이블 화면의 ‘서브넷 연결’ 탭을 노려보았다. ‘다음 서브넷이 이 라우팅 테이블과 명시적으로 연결되었습니다’라는 제목 아래, 텅 빈 목록이 그녀의 마지막 실수를 조롱하는 듯했다. 규칙집은 완벽하게 만들었지만, 정작 그 규칙을 읽어야 할 대상에게 전달하지 않은 것이다.
“규칙집을 만들었으니, 이제 이걸 읽어야 할 대상을 지정해 줘야 하는 거네. 대체 한 번에 되는 게 없네.”
솔라는 투덜거리면서도 마우스를 움직였다. 더 이상 망설일 이유가 없었다. 그녀는 ‘서브넷 연결 편집’ 버튼을 눌렀다. 화면에는 그녀의 VPC 안에 있는 서브넷들의 목록이 나타났다. 솔라는 자신의 EC2 인스턴스가 어느 서브넷에 속해 있는지 기억을 더듬어 찾아냈다. 그리고 그 서브넷 옆의 작은 체크박스를 클릭했다. ‘저장’ 버튼을 누르자, 아까까지 텅 비어 있던 목록에 방금 선택한 서브넷 ID가 한 줄 추가되었다.
| 라우팅 테이블 | 연결된 서브넷 |
|---|---|
rtb-xxxxxxxx (My-Public-RT) | subnet-yyyyyyyy |
이제 다리(인터넷 게이트웨이)가 있고, ‘외부로 가는 길은 이쪽’이라고 쓰인 길 안내판(0.0.0.0/0 경로)이 있으며, 그 안내판을 서버가 있는 동네 입구(서브넷)에 세워두기까지 했다. 세 번째 시도였다.
“자… 이제는 정말로… 제발.”
솔라는 떨리는 마음으로 다시 터미널 창을 열었다. 두 번의 실패를 안겨주었던 바로 그 명령어. 그녀는 다시 한번 입력했다.
ping 8.8.8.8
엔터.
첫 1초는 이전과 같았다. 하지만 2초가 되기 전, 화면에 새로운 줄이 나타났다.
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=2.45 ms
“어…?”
솔라는 눈을 비볐다. 분명히 응답이 왔다. 구글의 서버에서 보낸 신호가 솔라의 서버까지 무사히 도착했다는 증거였다. 잠시 후 두 번째, 세 번째 응답이 연달아 화면에 찍혔다. 막혔던 길이 마침내 뚫린 순간이었다.
“됐다! 드디어! 성공이야!”
솔라가 환호성을 질렀다. 옆에서 지켜보던 루나가 조용히 웃으며 말했다.
“이제 자동차가 길을 찾았나 보네.”
“응! 근데 이상하네. 왜 이렇게 귀찮게 만든 거지? 그냥 라우팅 테이블 만들면 VPC 전체에 다 적용해 주면 편하잖아. 어차피 같은 동네인데.”
솔라의 질문에 루나가 답했다.
“정말 그럴까? 만약 우리 동네에 아주 중요한 비밀 연구소가 있는 ‘보안 구역’이 있다면 어떨까? 그 구역에 있는 차들은 절대로 동네 밖으로 나가면 안 된다는 규칙이 있다면? 모든 길에 ‘외부 도시 방면’ 안내판을 세우는 게 맞을까?”
루나의 비유에 솔라는 잠시 생각에 잠겼다. 외부와 연결되면 안 되는 구역도 있을 수 있다. 그런 곳에는 ‘외부로 나가는 길’ 안내판을 세우면 안 된다. 오히려 ‘외부로 나가는 길 없음’이라는 안내판이 필요할 수도 있다.
“아… 그래서 서브넷마다 다른 길 안내판, 즉 다른 라우팅 테이블을 지정할 수 있게 한 거구나. 인터넷이 되는 ‘퍼블릭 서브넷’과 인터넷이 안 되는 ‘프라이빗 서브넷’을 나누기 위해서.”
“바로 그거야. ‘서브넷 연결’은 단순히 규칙을 적용하는 마지막 단계가 아니야. VPC라는 큰 마을 안에서, 각 구역(서브넷)의 교통 정책을 독립적으로 설정할 수 있게 해주는 아주 중요한 기능인 거지.”
이제야 모든 조각이 맞춰졌다. 솔라는 머릿속에 흩어져 있던 세 가지 핵심 요소를 차례로 정리하기 시작했다. 이전의 실패들이 오히려 선명한 이정표가 되어주었다.
“알겠어. 이제 완벽히 이해했어.”
솔라는 마치 자신만의 점검 목록을 만들 듯 손가락을 꼽으며 말했다.
“앞으로 내 서버가 인터넷에 연결되지 않으면, 딱 세 가지만 확인할 거야.”
그녀는 노트북 화면을 보며 진지한 표정으로 말을 이었다.
- 다리(인터넷 게이트웨이)가 있는가? : VPC에 인터넷 게이트웨이가 잘 ‘연결(Attached)’ 되어 있는가?
- 길 안내판(라우팅 규칙)이 올바른가? : 라우팅 테이블에 목적지가
0.0.0.0/0이고, 타겟이 그 인터넷 게이트웨이인 경로가 명시적으로 작성되어 있는가? - 길 안내판이 제자리에 있는가? : 그리고 가장 중요한 것. 그 라우팅 테이블이 내 서버가 속한 ‘서브넷’에 명시적으로 ‘연결’되어 있는가?
솔라는 자신의 세 단계 점검 목록을 보며 만족스러운 미소를 지었다. 이제 그녀에게 ‘퍼블릭 서브넷’은 더 이상 모호한 개념이 아니었다. 그것은 명확한 목적을 가진 세 가지 구성 요소가 정교하게 맞물려 작동하는 하나의 시스템이었다. 성공적으로 응답을 주고받는 터미널 화면은 그 시스템이 완벽하게 작동하고 있다는 증거였다.