추억의 "방능"
공유기를 사용하는 집에서 스타크래프트, 워크래프트 같은 게임을 했던 사람이라면, 방능이라는 단어를 한 번씩 들어봤을거라 생각한다. 내가 만든 게임 방에 다른 사람이 들어올 수 있는 상태를 뜻하는 말로, 그 시절에는 방능이 안되면 포트포워딩을 해야했고, 네이버를 뒤져서 방법을 찾아보면 공유기에서 설정할 수 있다는 말을 듣고 마구잡이로 따라했었다.

최근 스타크래프트 영상을 몇 개 보다보니 갑자기 그 시절이 생각났다. 그 때는 단순 따라하기만했던 블로그의 설정들을 개발자가 된 지금 왜 공유기 설정이 필요했는지, 게임을 호스팅한다는 게 무슨 의미인지 정리해볼 수 있었다.
방장이 호스트인 P2P 통신
스타크래프트, 워크래프트는 P2P 방식이다. 서버가 방을 관리하는 것이 아닌, 내가 직접 방장이자 서버가 되는 구조이다.
요즘 게임들 중에서는 대표적으로 콜 오브 듀티가 P2P 방식인 것으로 잘 알려져 있다.
게임 서버 = 나
P2P는 게임의 메인 서버를 거치지 않고 임의의 사용자를 서버로 만들어버린다. 이런 방식은 개발사에서 서버 비용을 절감할 수 있는 장점이 있지만, 서버로 선정된 유저의 IP가 노출되어 보안에 취약할 수 있고, 다른 참여자 플레이어들보다 더 유리한 환경에서 게임을 할 수 있다. 소위 핑이 튀지 않는다 는 말이다.

왜 아무도 못들어올까?
"나는 인터넷도 잘 되는데? 왜 못들어오는거지?"
나는 게임 접속도 잘 되고, 인터넷도 잘 된다. 그런데 왜 다른 사용자는 접속하지 못할까?
이런 상황에서의 문제는 대부분 공유기 환경과 NAT 때문이다. 우리가 집에서 사용하는 공유기는 내부에 여러 장비를 연결하고, 이들을 하나의 Public IP로 인터넷에 연결해주는 역할 을 한다. 즉, 모든 트래픽은 공유기를 통과 한다.
내가 방을 만들면,
- 다른 유저는 내 PC의 IP:PORT가 아닌 공유기의 Public IP:PORT로 접속을 시도한다.
- 그런데, 공유기는 그 요청이 내 컴퓨터로 가야 한다는 걸 모른다.
- 결국 공유기는 요청을 버린다.
공유기와 NAT
공유기는 단순 허브가 아니다. 내부망과 외부망을 연결하는 라우터 역할을 하며, 이 과정에서 NAT(Network Address Translation)라는 기술을 사용하게 된다.
NAT(Network Address Translation)
내부의 Private IP를 외부 인터넷에 통용되는 Public IP로 변환해주는 기술로 하나의 Public IP로 여러대의 PC가 동시에 인터넷을 사용할 수 있다. 외부에서 내 PC에 요청을 보낼 때는, 외부의 라우팅 테이블에 등록되어 있는 내 공유기의 Public IP를 사용하게 된다.

이러한 NAT 구조의 이점을 간략하게 언급하자면
- IPv4 주소의 절약: 기기마다 Public IP를 줄 수 없을 만큼 IPv4 주소는 부족하다. 위 그림처럼 NAT를 통해 다수의 Private IP 대역을 Public IP로 묶을 수 있다면, 수십 대의 기기를 Public IP 하나로 인터넷에 연결할 수 있다.
- 보안 이점: Private IP 대역은 외부에서 바로 접근할 수 없다. 기본적인 방화벽 역할을 한다.
- 내부망 관리 편의성: 같은 Private IP 대역 안에서는 기기 간 통신이 자유롭다.
그래서 왜 방에 못들어가는데?
우리는 방능자가 아닌 방을 들어가려 할 때 무한 로딩이 걸리다가 결국 방에 입장할 수 없었다. 다시 아래 그림을 보자.

게임 방에 입장하고자 하는 유저는 Public IP:6112로 접속을 시도한다. 그러나 NAT에는 이 포트가 어느 내부 IP:PORT에 매핑되어야 하는지에 대한 정보가 없다. NAT 구조에서는 외부에서 먼저 시작된 연결 요청에 대해 사전 정의된 포트 매핑이 없으면, 공유기는 해당 요청을 내부로 전달하지 않고 조용히 버린다(DROP). 이 때 라우터는 내부 네트워크를 스캔하거나 브로드캐스트하지 않으며 연결은 실패로 끝난다.

그래서 우리는 구글링을 통해 공유기 방능 방법을 찾아보고 포스팅의 내용대로 포트포워딩 설정을 하게 된다.
포트포워딩

포트포워딩이란 라우터가 특정 포트로 들어온 요청을 특정 내부 IP:PORT로 연결해주는 규칙을 등록하는 것이라고 표현하겠다. 위 그림처럼 포트포워딩 설정을 등록했을 때, 비로소 공유기를 통해 내부 PC까지 요청이 도달할 수 있다.
부록 - DMZ 설정
방능 설정을 검색하면 DMZ 설정이 간편하다는 내용들이 많다. DMZ도 동일한 문제를 해결하는 하나의 방법이다.
DMZ는 우리에겐 아프지만 친숙한 비무장지대처럼 네트워크에서도 비슷한 의미로 사용된다. 외부 네트워크와 내부 네트워크의 중간 지점으로, DMZ 설정을 통해 특정 IP를 지정할 수 있다. DMZ 설정을 하게 되면 모든 포트를 하나의 내부 IP로 전달하는게 가능해져 편리하게 Private IP를 등록하는 것 만으로 방능이 가능해진다.
하지만 모든 요청을 다 받을 수 있기 때문에, 다른 프로세스도 외부에서 접근이 가능해진다. 극단적인 예시를 들면, 누군가가 내 카카오톡에 접근도 가능하다는 뜻이 되겠다. 그래서 일반적으로는 포트포워딩으로 필요한 포트만 열어두는 것이 더 안전하다.
마무리
어릴 때는 그저 "방능이 안돼!"라는 말만 반복하며 공유기 설정을 따라 했지만, 지금은 그 이면에 있는 NAT 구조와 포트포워딩 개념을 이해하게 되었다. 단순히 게임만 즐기던 시절과는 다르게, 이제는 내가 만든 방이 곧 하나의 서버가 된다는 사실을 인지하게 되었고, 외부 요청이 공유기에서 막히는 구조 또한 명확히 설명할 수 있게 됐다. 그 과정에서 포트포워딩이라는 설정이 왜 필요한지, 그리고 어떻게 작동하는지도 스스로 설명할 수 있다.
그냥 게임을 하던 시절엔 몰랐던 걸, 개발자가 된 지금 다시 돌아보니 더 재밌고, 더 깊이 이해된다. 특히, 단순 CS 지식만 학습해오던 걸 실제 사례들에 적용해보면서 이런 원리였구나!! 라는 생각을 하면서 바라보게 되니 더 머리 속에도 잘 남고 무엇보다도 재밌다. 앞으로도 이런 실제 경험이나 사례를 CS에 녹여내는 방향으로도 포스팅을 해봐야겠다.