지난 팀 프로젝트 때 서버를 담당하지 않아서 아쉬움이 있었고, 서버 구성도 완전치 않아 코드를 커밋하고 push한 후에 다시 서버에 들어가 pull 받고, 다시 빌드하고, 실행하는 과정을 거쳐야 했습니다.
이러한 점들을 보완하기 위해 직접 노트북에 서버를 구성해보고, CI/CD 환경까지 만들면서 작업하는 내용을 정리해보려고 합니다.
먼저 서버를 구축하기에 앞서 알아야 하는 내용은 공인 IP 와 사설 IP 입니다.
공인 IP 는 인터넷에서 사용되는 주소로, IP 주소 할당 기관에 의해 할당된 주소이며, 인터넷 상에서 유효한 주소입니다.
사설 IP 는 인터넷 미연결 TCP/IP 네트워크를 위한 IP 주소입니다. 인터넷 IP 주소 관리 대상에 포함되지 않으며, 인터넷에서 사용이 불가능한 주소입니다.
우리가 자주 사용하는 와이파이를 예시로 들어보겠습니다. AP 는 Access Point 의 약자로 쉽게 말해서 우리가 생각하는 공유기입니다.
WRT300N 을 보면 외부와 연결된 것을 볼 수 있는데 바로 여기에 공인 IP 가 할당되는 것입니다.
AP 에 연결된 장치의 IP 주소를 보면 192.168.0.2 인 것을 볼 수 있는데 AP 내부에서 각 장치 별로 부여되는 것이 사설 IP 입니다. 이때 사설 IP 는 동적으로 부여되게 됩니다.
그리고 AP 에는 Default 게이트웨이가 있는데 AP 에 연결된 모든 장치들은 인터넷에 접속하기 위해 먼저 게이트웨이 주소로 요청을 보내게 됩니다.
사설 IP 는 인터넷에 연결할 수 없기 때문에 사설 IP 주소와 인터넷 공인 IP 주소 간의 변환 프로토콜 NAT 가 사용됩니다.
내부에 연결된 장치가 인터넷에 접속하려고 하면 라우터의 디폴트 게이트웨이로 요청이 가게 되는데 이때 미리 정의되거나, 동적으로 정의되는 NAT 변환 테이블에 의해 하나의 사설 IP 가 하나의 공인 IP 로 변환됩니다.
이렇게 하면 인터넷에 접속할 때만 공인 IP 주소를 사용할 수 있기 때문에 IP 주소를 절약할 수 있습니다. 하지만 NAT 는 하나의 사설 IP 에 하나의 공인 IP 를 부여하게 되므로, 많은 장치가 있다면 이를 전부 다른 IP 주소로 변환할 수는 없습니다. 그래서 등장한 것이 NAPT 입니다.
NAPT 는 하나의 공인 IP 주소에 여러 개의 사설 IP 주소를 변환할 수 있습니다. 하나의 공인 IP 에 포트번호를 사용하여 사설 IP 주소와 공인 IP 주소 변환을 하면서 포트 번호 변환을 동시에 수행하는 것입니다.
홈서버를 구축할 때 알아야 하는 내용이 바로 이 NAPT 의 개념과, 사설 IP 는 동적으로 할당된다는 점입니다.
현재 저의 네트워크 환경은 sk 공유기 안에서 iptime 공유기를 사용하고 있었고, 이 iptime 공유기에 서버용 노트북이 연결되어 있습니다.
iptime 의 관리자 화면은 192.168.0.1
이고, 연결된 동적 ip 를 보면 192.168.25.52
인 것을 볼 수 있는데 이 의미는 sk 공유기 내부에서 iptime 공유기가 해당 사설 ip 를 할당 받았다는 의미이고, 관리자 화면으로 접속하기 위해 192.168.25.1
로 접속하였습니다.
앞엣 사설 ip 내부에서는 연결된 기기에 할당되는 ip 는 동적이라고 하였습니다. 예를 들어, 서버의 사설 ip 가 192.168.0.2 로 되어 있는 상태로 모든 설정을 마쳤는데 ip 가 다른 주소로 바뀌어 버리면 설정값을 또 바꿔주어야 합니다.
이를 방지하기 위해 서버의 사설 ip 를 고정시켜야 합니다.
현재 서버용 노트북이 192.168.0.6 에 연결되어 있습니다. DHCP 서버 설정에 들어간 후 사용중인 ip 주소에서 해당하는 ip 를 클릭한 뒤 우측의 등록 버튼을 누르면 해당 사설 ip 가 고정됩니다.
포트 포워딩에 들어가서 공유기의 몇 번 포트로 들어왔을 때 어떤 ip 의 몇 번 포트로 연결할 것인지를 지정합니다.
앞에 sk 공유기가 있기 때문에 조금 다르지만 앞에서 살펴보았던 NAPT 를 생각하면 됩니다. iptime 외부에서 iptime 의 ip 주소의 n 번 포트로 들어오게 되면 iptime 내부 장치의 m 번 포트로 보내주는 역할을 수행합니다.
가비아에서 도메인을 구매한 후, DNS 설정을 들어갑니다. 여기서 DNS 정보를 추가하는데 타입은 A, 호스트는 @ 를 지정합니다. 호스트를 @
로 지정하면 example.com
처럼 바로 접속할 수 있게 됩니다. www
를 지정하면 www.example.com
으로 접속해야 합니다. 그 후 오른쪽에 외부 IP 주소를 작성하면 됩니다.
가비아에서 네임서버를 확인할 수 있습니다. 저는 ns.gabia.co.kr
로 지정되어 있고 이는 DDNS 를 설정할 때 사용됩니다.
그 후 sk 공유기 관리자 화면에서 DDNS 를 설정하는데 DDNS 서버에 위의 네임 서버를 작성하고, DDNS 도메인에 구입한 도메인을 입력하면 됩니다.
이제 외부에서 접속했을 때 iptime 에 연결되어 있는 서버까지 연결되도록 해야 합니다. 이전처럼 포트 포워딩을 사용해서 이를 설정할 수 있는데 포워딩 ip 주소는 현재 iptime 에 부여된( sk 공유기 하위의 ) 사설 ip 주소를 입력합니다.
웹의 기본 포트가 80이기 때문에 외부 포트를 80으로 지정하고, iptime 에서 80번으로 들어오는 요청을 다시 서버의 80으로 보냈기 때문에 sk 공유기에서 iptime 으로 보내는 포트 역시 80 번으로 지정합니다.
즉, sk 공유기 80 ➜ iptime 80 ➜ 서버 80 흐름대로 진행되도록 설정합니다. 추가로 뒤에서 https 도 설정할 것이기 때문에 443 포트도 동일하게 443 으로 연결되도록 설정합니다.
주의!!! 443 포트를 추가하면 문제가 발생할 수도 있습니다. 저는 문제가 발생하였고, 가장 아래에 적어두었습니다.
최종 구축 환경은 위와 같습니다. 이제 가비아에서 구매한 도메인으로 접속하면 포트번호 없이 서버에 접근할 수 있게 됩니다.
NGINX 를 설정하면서 실행에 오류가 뜨길래 혹시나 하는 마음으로 sk 공유기에 443 포트포워딩을 설정하니 문제가 해결되었습니다. 하지만 여기서 집에서 사용하는 공유기가 인터넷 연결이 되지 않는다는 문제가 생겨버렸습니다.
그래서 sk 공유기에 설정한 모든 내용을 지우고, 브릿지 모드로 변경하여 iptime 공유기에 공인 ip 가 할당되도록 변경하였습니다. 하지만 브릿지 모드로 변경하게 되면 sk 공유기의 관리자 페이지의 접속은 불가능해집니다.