Cloud Modernization 19

인터넷 게이트웨이와 라우팅 테이블로 퍼블릭 서브넷 열기

퍼블릭 IP만 있으면 인터넷 통신이 된다고 생각하면 게이트웨이와 라우팅 테이블의 역할을 놓치기 쉽다.

근거 · 교안 p80-p81

인터넷 게이트웨이와 라우팅 테이블로 퍼블릭 서브넷 열기 ?? ???

1장: 루나: 퍼블릭 IP만으론 부족해, 보이지 않는 벽 너머를 상상해봐

1장: 루나: 퍼블릭 IP만으론 부족해, 보이지 않는 벽 너머를 상상해봐

솔라는 노트북 화면에 떠 있는 검은 터미널 창을 노려보고 있었다. 손가락이 키보드 위에서 초조하게 까딱였다. 몇 분째 같은 명령어만 반복해서 입력하고 있었지만, 돌아오는 응답은 늘 같았다.

ping: connect: Network is unreachable

“이상하네….”

솔라는 혼잣말을 중얼거리며 AWS 콘솔 창을 다시 열었다. 새로 만든 EC2 인스턴스의 세부 정보를 꼼꼼히 훑었다. 분명 퍼블릭 서브넷 안에 만들었고, 인터넷에서 접속할 수 있도록 퍼블릭 IP 주소도 새로 할당했다. 모든 게 완벽해 보였다.

“퍼블릭 IP 주소가 있다는 건, 인터넷 세상에 우리 집 주소가 생긴 거나 마찬가지잖아. 그럼 당연히 밖으로 나갈 수도, 밖에서 찾아올 수도 있어야 하는 거 아니야?”

솔라의 생각은 명쾌했다. 인터넷 통신을 위한 공개된 주소가 있으니, 통신은 저절로 이루어져야 했다. 하지만 현실은 달랐다. 인스턴스는 마치 고립된 섬처럼 가상 사설 클라우드(VPC) 안에 갇혀 꿈쩍도 하지 않았다.

그때, 솔라의 어깨너머로 화면을 들여다보던 루나가 조용히 입을 열었다.

“솔라, 네가 만든 그 인스턴스를 하나의 방이라고 생각해봐. 그리고 VPC는 그 방이 속한 집 전체이고.”

“방이랑 집?”

“응. 그리고 방금 네가 할당한 퍼블릭 IP는, 외부 사람들이 우리 집을 찾아올 수 있도록 붙여놓은 주소판 같은 거야. ‘솔라의 방’이라고 적힌 예쁜 문패.”

루나는 손으로 허공에 네모난 집 모양을 그렸다. 그리고 그 바깥에 작은 주소판을 그려 넣는 시늉을 했다.

“그런데 말이야,” 루나가 말을 이었다. “집 주소가 있고 문패가 달려있다고 해서, 집 안에 있는 사람이 저절로 밖으로 나갈 수 있을까? 만약에… 집 전체에 대문이 하나도 없다면?”

“대문이 없다면? 그럼 못 나가지. 벽으로 꽉 막혀 있을 테니까.”

솔라는 당연하다는 듯 대답했다. 그리고 그 순간, 무언가 머리를 스치는 느낌이 들었다. 벽. 보이지 않는 벽.

“아….”

솔라의 입에서 작은 탄성이 터져 나왔다. 그녀는 자신의 인스턴스와 광활한 인터넷 사이에 존재하는 거대한 가상의 벽을 떠올렸다. VPC라는 이름의 집은 외부와 완벽하게 분리된 안전한 공간이다. 퍼블릭 IP라는 주소판을 달아놓는다고 해서, 이 집의 벽이 저절로 허물어지지는 않는다.

“그럼… 인터넷 게이트웨이가 그 ‘대문’ 역할을 하는 거야?”

솔라의 눈이 반짝였다. 막연하게 ‘인터넷 연결 통로’라고만 알고 있던 개념이 구체적인 이미지로 다가왔다. VPC라는 견고한 집에, 외부 인터넷 세상으로 나갈 수 있는 유일한 출입구를 내는 것. 그것이 바로 인터넷 게이트웨이를 VPC에 연결하는 작업의 본질이었다.

루나는 고개를 끄덕였다.

“맞아. 인터넷 게이트웨이는 VPC의 인스턴스와 인터넷 사이의 통신을 허용해줘. 마치 우리 집에 외부로 통하는 대문을 다는 것처럼 말이야. 그 문이 없으면 아무리 주소판이 달려 있어도 집 안의 편지는 밖으로 나갈 수 없고, 외부의 손님도 집으로 들어올 수 없어.”

솔라는 다시 터미널 창을 바라봤다. Network is unreachable. 이제 이 메시지는 단순한 오류 문구가 아니었다. 그것은 ‘대문이 없어서 밖으로 나갈 길을 찾지 못했습니다’라고 외치는, 길 잃은 데이터 패킷의 절박한 목소리처럼 들렸다.

“이제 알겠어. 나는 퍼블릭 IP만 있으면 그냥 바로 인터넷에 연결되는 줄 알았어. 무슨 마법처럼. 하지만 실제로는 아니었네. 외부와 연결되려면 먼저 우리 집(VPC)에 밖으로 나가는 통로, 즉 인터넷 게이트웨이라는 대문을 만들어줘야 하는 거였구나.”

솔라는 방금 전까지 자신을 가로막았던 혼란의 정체를 깨달았다. 인터넷 게이트웨이는 VPC의 인스턴스와 인터넷 간 통신을 허용한다. 기술 문서에 적혀 있던 이 건조한 한 문장이 이제는 전혀 다르게 읽혔다. ‘허용한다’는 것은 단순히 권한을 부여한다는 추상적인 의미가 아니었다. 물리적인 통로를 실제로 열어준다는 구체적인 행위였다.

“좋아! 그럼 이제 인터넷 게이트웨이를 만들어서 내 VPC에 붙이면 문제가 해결되겠네!”

자신감에 찬 솔라의 목소리에 루나는 살짝 미소를 지었다. 그녀는 솔라가 그린 그림 위에 손가락을 가져갔다.

“응, 대문을 다는 건 아주 중요한 첫 단계야. 그런데 솔라, 우리 집에 대문이 생겼다고 해보자. 거실에서 보낼 편지도, 네 방에서 보낼 소포도 모두 그 대문을 통해 나가야 해. 그런데 만약 네 방에서 나온 소포가… 현관 대문이 어디 있는지 몰라서 계속 집 안만 뱅뱅 맴돈다면 어떡하지?”

솔라의 표정이 다시 묘하게 바뀌었다. 대문을 만들었는데, 그 대문으로 가는 길을 모른다고? 길 잃은 트래픽. 그녀의 머릿속에 새로운 질문이 떠올랐다.

2장: 루나: 길을 잃은 트래픽? 라우팅 테이블의 지도가 필요해

솔라는 자신만만하게 키보드의 엔터 키를 눌렀다. 이제는 성공할 것이라는 확신이 있었다. 지난번의 실패는 ‘대문’이 없었기 때문이었고, 방금 그녀는 AWS 콘솔에서 인터넷 게이트웨이라는 근사한 대문을 만들어 VPC에 단단히 붙여주었다. 이제 그녀의 인스턴스가 있는 ‘집’에는 외부로 나갈 통로가 생겼다.

하지만 터미널 창에 나타난 결과는 그녀의 기대를 다시 한번 배신했다.

ping: connect: Network is unreachable

“말도 안 돼….”

솔라의 손가락이 멈췄다. 화면에는 여전히 차가운 실패 메시지만이 떠 있었다. 그녀는 AWS 콘솔 창들을 번갈아 클릭하며 설정을 다시 확인했다. 인스턴스에는 퍼블릭 IP가 할당되어 있고, VPC에는 인터넷 게이트웨이가 분명히 연결되어 있었다. 대문은 활짝 열려 있는데, 왜 아무도 밖으로 나가지 못하는 걸까?

“대문을 만들었는데 왜 여전히 막혀 있는 거지? 내 방에서 나가는 트래픽은 당연히 새로 생긴 저 대문을 향해 가야 하는 거 아니야? 집 안에 출구가 하나뿐인데, 그걸 못 찾을 리가 없잖아.”

솔라의 목소리에는 당혹감과 약간의 짜증이 섞여 있었다. 그녀의 생각 속에서, 트래픽은 마치 지능을 가진 존재처럼 가장 논리적인 경로를 알아서 찾아갈 것 같았다. 하지만 현실의 네트워크는 그렇지 않았다. ‘길 잃은 트래픽’이라는, 조금 전 루나가 던졌던 말이 귓가에 맴돌았다.

“글쎄, 우리 집이 생각보다 복잡하다면 어떨까?”

루나가 솔라의 노트북 옆으로 다가와 라우팅 테이블 설정 페이지를 화면에 띄웠다. 표 형식의 간단한 화면이었다. 단 한 줄의 규칙만이 적혀 있었다.

대상(Destination)타겟(Target)
10.0.0.0/16local

“이건 우리 집 내부의 주소록 같은 거야.” 루나가 첫 번째 줄을 가리키며 말했다. “목적지가 10.0.0.0/16, 즉 우리 VPC 집 안에 있는 다른 방이라면, ‘내부(local)’에서 해결하라는 뜻이지. 네 방에서 안방으로 편지를 보낼 때 굳이 대문 밖으로 나갔다 올 필요는 없으니까.”

솔라는 고개를 끄덕였다. 그건 이해가 됐다. VPC 내부 통신을 위한 규칙이었다.

“그럼… 인터넷으로 보내는 편지는?” 솔라가 물었다. “예를 들어 구글 DNS 서버인 8.8.8.8로 가는 패킷은? 이 주소는 10.0.0.0/16 범위에 없잖아.”

“바로 그거야.” 루나가 말했다. “네 방에서 나온 소포의 주소지가 우리 집이 아닐 때, 이 주소록에는 그 소포를 어디로 보내야 할지 적혀 있지 않아. 집배원은 어리둥절해서 그냥 그 자리에 멈춰 서 버리는 거지. ‘이 주소는 모르겠는데? 어떡하지?’ 하고.”

그제야 솔라는 문제의 핵심을 깨달았다. 트래픽은 스스로 길을 찾는 게 아니었다. 모든 것은 이 ‘라우팅 테이블’이라는 교통 표지판, 혹은 지도에 적힌 대로만 움직인다. 그런데 이 지도에는 집 안의 길만 그려져 있을 뿐, 집 밖으로 나가는 길에 대한 안내가 전혀 없었다. 인터넷 게이트웨이라는 대문을 만들어 놓았지만, 지도에 ‘대문은 저쪽’이라고 표시해주지 않았던 것이다.

“아… 그럼 여기에 규칙을 추가해야 하는구나. ‘우리 집 주소가 아닌 모든 것은 저쪽 대문으로 보내라’고!”

솔라는 ‘라우팅 편집’ 버튼을 눌렀다. 그녀는 이제 무엇을 해야 할지 알 것 같았다.

“‘우리 집 주소가 아닌 모든 것’을 뭐라고 표현하지?”

“네트워크에선 보통 0.0.0.0/0이라고 써.” 루나가 힌트를 주었다. “세상의 모든 주소를 의미하는 가장 넓은 범위의 표현이야.”

솔라는 ‘대상(Destination)’ 칸에 0.0.0.0/0을 입력했다. 그리고 ‘타겟(Target)’ 드롭다운 메뉴를 클릭하자, 조금 전 자신이 만들었던 인터넷 게이트웨이의 ID가 목록에 보였다. 그녀는 망설임 없이 그것을 선택했다.

대상(Destination)타겟(Target)
10.0.0.0/16local
0.0.0.0/0igw-xxxxxx

새로운 규칙이 추가되었다. 이제 이 지도는 완벽해졌다. 집 안으로 가는 길과, 그 외 모든 곳으로 가기 위한 출구의 방향을 모두 알려주고 있었다. 라우팅 테이블은 트래픽 대상을 제공한다. 기술 문서의 이 문장은 더 이상 추상적이지 않았다. 길 잃은 트래픽에게 나아갈 방향을 알려주는 명시적인 명령이었다.

솔라는 떨리는 마음으로 다시 터미널 창으로 돌아가 ping 8.8.8.8 명령어를 입력했다. 잠시 후, 화면에 응답이 하나씩 찍히기 시작했다.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=1.23 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=1.25 ms

“됐다!”

솔라가 환호성을 질렀다. 드디어 그녀의 인스턴스가 보이지 않는 벽을 넘어 세상과 소통하기 시작했다.

“이제 알겠어. 퍼블릭 IP는 주소판, 인터넷 게이트웨이는 대문, 그리고 라우팅 테이블은… 대문으로 가는 길을 알려주는 지도였어. 이 세 가지가 다 있어야만 비로소 밖으로 나갈 수 있는 거구나.”

그녀는 만족스러운 표정으로 성공 메시지가 올라오는 화면을 바라보았다. 주소, 문, 지도. 각자의 역할이 명확해진 기분이었다. 그런데 문득 궁금증이 생겼다.

“언니, 그런데 이 세 가지가 꼭 한 세트처럼 움직이네. 주소판을 보고 찾아온 손님은 대문을 통과해서 들어오고… 들어온 손님은 또 지도를 보고 내 방을 찾아오는 걸까? 나가는 것과 들어오는 것, 이 모든 과정이 이 세 요소의 협주곡처럼 딱 맞아떨어져야 하는 건가?”

솔라는 자신이 만든 그림을 다시 들여다보았다. 개별적으로 존재하던 점들이 선으로 연결되기 시작했지만, 아직 전체 그림이 하나의 유기적인 작품으로 보이지는 않았다. 뭔가 더 중요한 연결고리가 숨어있는 것 같았다.

3장: 루나: 퍼블릭 서브넷 인터넷 통신의 완성, 세 요소의 협주곡

솔라의 노트북 화면에는 조금 전과 같은 ping 성공 메시지가 계속 올라오고 있었다. 하지만 그녀의 시선은 터미널 창이 아닌, 그 옆에 놓인 작은 메모지에 고정되어 있었다. 메모지 위에는 그녀가 방금 직접 그린 간단한 다이어그램이 있었다. 네모난 VPC, 그 안의 서브넷과 인스턴스, 그리고 바깥세상을 상징하는 구름 모양의 인터넷.

그녀는 그림 위에 두 개의 화살표를 그렸다. 하나는 인스턴스에서 시작해 인터넷으로 나가는 화살표, 다른 하나는 인터넷에서 인스턴스로 들어오는 화살표였다. 성공의 기쁨도 잠시, 이 두 화살표의 경로를 생각하자 다시 머릿속이 복잡해졌다. ‘나갈 때는 라우팅 테이블 지도를 보고 인터넷 게이트웨이라는 대문으로 나갔어. 그럼 들어올 때는? 외부에서 내 퍼블릭 IP 주소판을 보고 찾아올 텐데… 대문을 통과한 다음에는 어떻게 내 방까지 찾아오는 거지? 여기에도 지도가 필요한가?’

솔라는 자신이 그린 그림을 다시 들여다보았다. 주소판(퍼블릭 IP), 대문(인터넷 게이트웨이), 지도(라우팅 테이블). 이 세 가지가 각자 역할을 하는 것은 알겠지만, 마치 오케스트라의 악기들처럼 어떻게 정확히 화음을 맞춰 움직이는지는 아직 명확하게 그려지지 않았다. 각자 연주하는 것과 협주를 하는 것은 완전히 다른 이야기였다.

루나는 골똘히 생각에 잠긴 솔라와 그녀의 그림에 그려진 두 개의 화살표를 번갈아 보았다. 그녀는 솔라가 무엇을 고민하는지 정확히 알아챘다.

“마치 세 명의 연주자가 각자의 악보만 보고 연주하는 것 같지? 하지만 사실 이건 완벽한 협주곡이야, 솔라. 한 명이라도 박자를 놓치거나 다른 악보를 보면 음악이 완성되지 않지. 우리, 데이터 패킷이라는 한 명의 주인공이 여행하는 과정을 따라가 볼까? 먼저 집을 나서는 여정부터.”

루나는 솔라의 그림에서 인스턴스로부터 뻗어 나가는 화살표를 손가락으로 짚었다.

“자, 인스턴스가 8.8.8.8로 편지를 보내. 이 편지의 출발지 주소는 뭐지?”

“내 인스턴스의 프라이빗 IP 주소. 10.0.x.x 같은 거.”

“정확해. 그 편지는 먼저 서브넷의 우체국, 즉 라우팅 테이블로 가. 거기서 뭘 확인하지?”

“목적지 주소! 8.8.8.8은 우리 집 주소(10.0.0.0/16)가 아니니까, ‘그 외 모든 것(0.0.0.0/0)’ 규칙을 따라서 인터넷 게이트웨이로 가라고 안내받지.” 솔라는 이제 익숙하게 대답했다.

“완벽해. 이제 편지는 대문, 즉 인터넷 게이트웨이 앞에 도착했어.” 루나가 말을 이었다. “그런데 이 대문을 지키는 문지기는 아주 중요한 일을 하나 더 해. 그냥 문만 열어주는 게 아니야. 편지의 ‘보내는 사람’ 주소를 프라이빗 IP에서 우리가 아는 퍼블릭 IP로 바꿔 붙여줘. 그리고 누가 누구로 바뀌었는지 장부에 기록해 두지.”

“주소를 바꾼다고? 왜?”

“생각해봐. 인터넷 세상은 10.0.x.x 같은 사적인 주소는 알지도 못하고 찾아올 수도 없어. 답장을 받으려면, 인터넷 세상 누구나 아는 공적인 주소, 즉 퍼블릭 IP가 필요하잖아. 마치 회사 사무실에서 편지를 보내면서, 답장은 집으로 받기 위해 봉투에 집 주소를 적는 것과 같아.”

솔라의 눈이 커졌다. 아, 퍼블릭 IP는 단순히 외부에 노출되는 이름표가 아니었다. 밖으로 나가는 트래픽이 다시 돌아올 주소를 알려주는 역할을 했다. 그리고 그 주소 변환을 인터넷 게이트웨이가 담당하고 있었다. 정체성을 바꾸는 것과 행동을 바꾸는 것은 다른 차원의 문제라는 걸 깨달았다. 인터넷 게이트웨이는 트래픽의 ‘정체성’을 잠시 바꿔주는 역할을 했던 것이다.

“그럼 돌아오는 편지는?” 솔라가 재촉하듯 물었다.

“돌아오는 편지의 목적지 주소는 당연히 우리 인스턴스의 퍼블릭 IP겠지. 그 편지는 VPC의 유일한 대문인 인터넷 게이트웨이로 도착해. 그럼 문지기는 아까 적어둔 장부를 확인하는 거야. ‘어라, 이 편지는 아까 10.0.x.x가 보낸 편지의 답장이네!’ 하고 말이야. 그리고 다시 원래대로, 목적지 주소를 퍼블릭 IP에서 인스턴스의 프라이빗 IP로 바꿔서 집 안으로 들여보내 줘.”

그제야 전체 그림이 하나의 유기적인 흐름으로 완성되었다.

  • 나갈 때: 라우팅 테이블이 외부행 트래픽을 인터넷 게이트웨이로 안내하고, 인터넷 게이트웨이는 프라이빗 IP를 퍼블릭 IP로 변환하여 내보낸다.
  • 들어올 때: 인터넷 게이트웨이가 퍼블릭 IP로 온 응답 트래픽을 수신하여, 기록을 보고 원래의 프라이빗 IP로 변환하여 들여보낸다.

퍼블릭 IP, 라우팅 테이블, 인터넷 게이트웨이는 독립적인 부품의 조합이 아니었다. 외부 통신이라는 하나의 목표를 위해 긴밀하게 협력하는 하나의 시스템, 완벽한 협주곡이었다.

“이제 알겠어… 퍼블릭 서브넷의 인스턴스가 인터넷에 나가려면 퍼블릭 IP, 인터넷 게이트웨이 연결, 라우팅 테이블의 기본 경로가 모두 필요하다.는 말이 그냥 조건 목록이 아니었구나. 이 세 가지가 맞물려 돌아가는 전체 통신 과정 그 자체를 설명하는 문장이었던 거야.”

솔라는 후련한 표정으로 노트북 옆의 작은 메모 패드를 집어 들었다. 그리고 ‘인터넷 안될 때 점검 목록’이라고 적고는, 방금 자신이 깨달은 흐름을 바탕으로 세 가지 질문을 써 내려가기 시작했다. 이것은 단순한 체크리스트가 아니라, 문제의 원인을 진단하는 그녀만의 첫 번째 가이드였다.

  1. 퍼블릭 IP는 있는가? (외부 세계가 알아볼 주소판이 있는가?)
  2. 라우팅 테이블에 IGW 경로가 있는가? (집 안에서 대문으로 가는 지도가 있는가?)
  3. VPC에 IGW가 연결되어 있는가? (애초에 대문이 제대로 달려 있는가?)

메모를 마친 솔라는 만족스럽게 웃었다. 이제 Network is unreachable 메시지를 다시 만나도 당황하지 않을 것 같았다. 길 잃은 트래픽을 위해 어디에 어떤 지도를 그려주고, 어떤 문을 열어줘야 할지 정확히 알게 되었으니까. 그녀의 작은 인스턴스는 이제 세상과 자유롭게 소통할 준비를 마쳤다.