홈 서버 구축하면서 배운 것들-hero-image

Tech

홈 서버 구축하면서 배운 것들

집에서 서버를 돌리려고 포트포워딩을 하다가 이중 NAT를 만난 이야기, 그리고 DMZ와 DDNS를 처음 배운 기록


집에 있는 우분투 서버를 팀원들과 같이 쓰고 싶어서 포트포워딩을 시작했는데, 생각보다 훨씬 복잡한 여정이 됐다. 기록 겸 정리해본다.

원래는 공유기 하나면 끝나는 줄 알았다

이전에는 공유기가 하나뿐이어서 포트포워딩이 간단했다. 공유기 관리자 페이지 들어가서 “외부 포트 → 내부 IP:포트” 규칙 하나 추가하면 끝. 그래서 ipTIME 공유기에서 SSH(22), HTTP(80), HTTPS(443) 포트를 우분투 서버(192.168.0.4)로 포워딩해놓고 당연히 될 줄 알았다.

ipTIME 포트포워드 설정 — SSH, HTTP, HTTPS를 192.168.0.4로 SSH(22), HTTP(80), HTTPS(443)를 우분투 서버로 포워딩해뒀다

근데 외부에서 접속이 하나도 안 됐다.

알고 보니 공유기가 하나가 아니었다

ipTIME의 “인터넷 설정 정보”에서 외부 IP를 확인했는데, 이상하게 그것도 192.168.x.x 형태의 사설 IP였다.

ipTIME의 외부 IP 주소가 192.168.219.103으로 사설 IP였다 분명 “외부 IP”라고 써있는데 사설 IP 대역이었다

진짜 공인 IP를 확인해보니 완전히 다른 값이 나왔다.

정리하면 이런 구조였다.

인터넷 → LG U+ 모뎀(진짜 공인 IP 보유) → ipTIME 공유기 → 우분투 서버

집 구조를 보면 왜 이렇게 됐는지 이해가 됐다. 신발장 쪽에 통신사 게이트웨이가 하나 있고, 거실에 와이파이 공유기가 하나 더 있는데, 거리가 멀어서 내 방까지는 와이파이 신호가 매우 약하거나 자꾸 끊기는 문제가 있었다. 그래서 편의상 내 방에 ipTIME 공유기를 하나 더 물려서 쓰고 있었던 거였는데, 그게 이렇게 이중 NAT를 만들어낼 줄은 몰랐다.

집에 인터넷이 들어오는 통신사 모뎀이 이미 자체적으로 NAT(사설 IP 변환)를 하고 있었고, 그 뒤에 내가 편의상 붙여놓은 ipTIME 공유기가 또 한 번 NAT를 하고 있었던 거다. 이게 바로 이중 NAT라는 거였다. 포트포워딩을 아무리 ipTIME에서 완벽하게 해놔도, 그 앞단인 통신사 모뎀에서 막혀있으면 트래픽이 애초에 ipTIME까지 도달하지도 못한다.

실제로 확인해보니 통신사 모뎀 쪽에서 80번 포트로 들어오는 요청은 모뎀 자신의 관리자 페이지를 띄워버리고 있었다. 포트포워딩 규칙은 정확했는데, 문 앞에 경비실이 하나 더 있었던 셈이다.

통신사 모뎀 관리 페이지에서 확인한 실제 장비 구성도 통신사 모뎀 관리 페이지에서 찾은 실제 토폴로지 — LGU_B37B가 진짜 인터넷 창구였고, 그 밑에 와이파이 확장기(LGU_EC9C)가 따로 매달려 있었다

DMZ - 처음 들어본 개념

이걸 해결하려면 통신사 모뎀에서도 뭔가 설정을 해줘야 했는데, 여기서 DMZ라는 걸 처음 알게 됐다.

일반 포트포워딩은 “이 포트만 딱 집어서 넘겨줘”라면, DMZ는 “이 장비로 오는 건 포트 상관없이 다 넘겨버려”라는 설정이다. 통신사 모뎀에 DMZ를 걸어서 ipTIME 공유기(192.168.219.103)로 모든 트래픽을 넘기도록 하고, 실제로 어떤 포트를 열지는 그 뒤에 있는 ipTIME의 포트포워딩 규칙이 걸러주는 방식으로 역할을 나눴다.

통신사 모뎀 NAT 설정의 DMZ 서버 설정 화면 통신사 모뎀의 DMZ 설정 — ipTIME 공유기(192.168.219.103)로 전부 넘기도록 등록

통신사 모뎀: DMZ로 전부 ipTIME에 위임
ipTIME: 22, 80, 443 포트만 선별해서 우분투로 전달

이렇게 하니 통신사 모뎀은 한 번만 설정해두면 되고, 앞으로 포트를 추가하거나 뺄 일이 있으면 ipTIME 쪽만 건드리면 되는 구조가 됐다.

DDNS - 도메인 없이도 이름으로 접속하기

또 하나 새로 배운 건 DDNS였다. 집 인터넷은 IP가 고정이 아니라 통신사가 주기적으로 바꾸는 유동 IP라서, 숫자 IP로 접속 주소를 공유하면 언젠가 끊길 수밖에 없다.

이걸 해결하려고 No-IP라는 무료 DDNS 서비스에 가입해서 내이름.serveirc.com 같은 서브도메인을 하나 발급받았다. 도메인을 따로 사지 않아도, 이 무료 서브도메인이 내 IP가 바뀔 때마다 자동으로 최신 주소를 따라가도록 갱신해준다.

갱신 방법도 두 가지가 있다는 걸 알게 됐다.

  • 공유기 자체에 내장된 DDNS 클라이언트 기능 사용
  • 서버(우분투)에 별도 프로그램(noip-duc)을 설치해서 서버가 직접 갱신

나는 공유기가 No-IP를 지원하길래 공유기 쪽에서 처리하도록 했다. 24시간 켜져있는 장비가 관리하는 게 더 안정적이라는 생각이었다.

통신사 모뎀에 등록한 DDNS 설정 통신사 모뎀의 DDNS 설정 — No-IP 계정 정보와 발급받은 서브도메인을 등록했다

최종 구조

다 설정하고 나니 이런 흐름이 완성됐다.

인터넷

LG U+ 모뎀 (DDNS로 내 서브도메인과 현재 IP를 계속 동기화, DMZ로 ipTIME에 전달)

ipTIME 공유기 (필요한 포트만 선별해서 포워딩)

우분투 서버

이제 팀원들은 숫자 IP도 몰라도 되고, ssh user@내이름.serveirc.com 한 줄이면 바로 서버에 접속할 수 있다.

DMZ와 DDNS가 모두 설정 완료된 통신사 모뎀 홈 화면 DMZ와 DDNS가 모두 적용된 최종 상태 — DDNS 상태에 내 서브도메인이 정상적으로 뜬다

배운 것 정리

  • 공유기가 여러 겹으로 연결되어 있으면(이중 NAT) 포트포워딩도 각 단계마다 다 해줘야 한다.
  • 진짜 공인 IP인지 확인하려면 공유기 관리 페이지 말고 외부 사이트에서 직접 조회해봐야 한다.
  • DMZ는 “전체 개방”, 포트포워딩은 “선택적 개방” — 이중 NAT 환경에서는 앞단은 DMZ로 위임하고 뒷단에서 세밀하게 제어하는 조합이 유용하다.
  • DDNS는 도메인을 사지 않아도 유동 IP 환경에서 안정적인 접속 주소를 만들어준다.
  • 뭔가 안 될 때는 “설정이 틀렸나”보다 “중간에 내가 모르는 장비가 하나 더 있는 건 아닌가”부터 의심해보는 게 좋다.