Devops

가상화 소프트웨어로 자체 서버 구축

hand-mk 2024. 12. 4. 00:11

✔️ 서론

사이드 프로젝트 서비스를 배포할 때 비용이 다방면으로 발생한다. 그중 가장 골치 아프고, 신경이 많이 쓰이는 것은 당연 서버비용 일 것이다. 필자는 AWS 프리티어도 모두 사용한 상태였기에 몇 개월 공짜 클라우드 서비스.. 쓸 수 있는 건 다 써본 것 같다. 더 이상 옮겨 다니기도 싫어서 내 집 마련을 위해 온프레미스 서버 구축을 하기로 마음먹었다. 서버를 구축하면서 겪었던 상황들을 구체적으로 포스팅하고자 한다.

 

✔️ 본론

조금은 무식한 나는 '일단 해보면서' 배우는 걸 좋아하고 학교 수업에서 어느정도의 이론은 익혔기에 혼자 해보자고 해서 시작한 내용이다. 틀린 부분도 있을 수 있기에 따끔한 지적은 저를 발전시키니.. 마음껏 부탁드린다 :)

가상머신 소프트웨어 VMware를 사용하여 1대의 호스트 PC에서 가상머신을 구축할 것 이다.

 

💡 가상머신이란?
실제 존재하는 컴퓨터가 아닌 말 그대로 가상의 컴퓨터
호스트 컴퓨터의 환경 아래에서 운영되는 가상머신에는 호스트 컴퓨터의 메모리, CPU, HDD, CD/DVD 등 일부분을 사용하여 하드웨어적인 부분들을 할당할 수 있다.

 

VMWare를 사용하는 방법은 조금만 서칭을 해보면 좋은 정보가 많으니 생략한다.

 

1. 가상머신 사양

만든 가상머신의 사양은 다음과 같다.

가상머신 사양

이렇게 사양을 정한 건 큰 이유는 없으나, 그 당시 GCP 가상머신을 체험판으로 사용하고 있었는데 무리 없이 서버를 운영하고 있었기 때문에 해당 가상머신의 사양과 맞추려고 하다 보니 이렇게 세팅이 되었다.

 

2. 운영체제

운영체제는 ubuntu-20.04-desktop-amd64 를 설치했다.
ISO 파일을 Ubuntu 홈페이지에서 다운로드한 후 CD 넣듯이 넣어서 시동시키면 설치 과정이 나온다. 윈도우 설치 하듯이 본인 환경에 맞게 세팅 후 설치하면 된다.

Ubuntu 설치

3. 네트워크 설정

본 작업에서 가장 오랜 시간이 걸렸던 구간인 것 같다.. 서버를 구축하면서 네트워크 이론이 중요하다는 걸 다시금 깨달았다.

혹시라도 이 글을 읽고 있는 누군가 시도해보고 싶은데 IP, Class, Subnet, Gateway, Router, Portforward 이 중 하나의 개념이라도 잘 모르겠다고 한다면 공부하고 도전해 보는 걸 추천한다.

 

기본적으로 가상화 소포트웨어로 생성된 가상머신의 네트워크를 구성하는 방식은 3가지가 있다. Bridge, NAT, Host-Only 가 있지만 이를 가상머신 네트워크에 도입해 생각해 보면 이렇게 정리할 수 있다.

  1. Bridge - 호스트 네트워크와 동일한 서브넷에서 IP 주소를 할당받는 것이다. 즉, 가상 머신은 호스트와 같은 네트워크에 속하게 된다.
  2. NAT - 호스트 IP에서 가상머신에 사설 IP 가 부여된다. 공인 IP는 호스트 IP 가 된다.
  3. Host-Only - Local 가상머신끼리만 통신이 가능하다.

필자는 이 중 NAT 방식을 선택했다.
Bridge 방식의 경우 호스트 컴퓨터와 가상 머신이 동일한 네트워크에서 돌아가는 스니핑의 위험성이 있었고, 가상 머신의 IP에 직접적으로 접근이 가능하기 때문에 선택하지 않았다.

 

NAT 방식은 사설 IP 주소를 공인 IP 주소로 변환하여 외부와 통신하는 방식이다. 외부에서는 사설 IP 주소가 암호화되어 접근되기 때문에 보안상 유리하다.

 

또한 VMWare는 친절하게도 Virtual Network Editor라는 기능을 제공하고 있어 손쉽게 네트워크 설정이 가능하다.

Virtual Network Editor

 

VMnet 0 은 Bridge 방식, VMnet1 은 Host-only 방식, VMnet8은 NAT 방식이다. 

NAT Setting을 통해 호스트와 가상 머신과 포트포워딩이 가능하다. 포트포워딩을 하지 않게 되면 외부 네트워크에서 들어왔을 때 호스트 컴퓨터(가상머신의 게이트웨이 역할)에서 가상 머신 네트워크 어딘가로 뻗어 나가야 할지 지정하지 않은 것이랑 똑같다.

그렇기 때문에 필자의 경우 Springboot, MariaDB를 사용하고 SSL 인증서를 발급하여 https 로의 접근만 허용할 것이기 때문에 해당 포트들을 포트포워딩 해줘야 한다.

 

포트포워딩

 

지금까지 한 것은 '호스트 컴퓨터(가상머신의 게이트웨이 역할) 에서 가상머신 네트워크로 들어갈 때' 의 설정을 한 것이다.
결국 호스트 컴퓨터도 공유기(또는 라우터) 를 통해 외부 네트워크의 접근이 가능한 것이기 때문에 자택의 공유기도 포트포워딩이 필요했다.

각자의 네트워크 게이트웨이 설정으로 포트포워딩을 해줘야 한다.
필자의 경우 KT 를 사용하고 있어 172.30.1.254 에서 세팅해 주었다.

 

💡 호스트 os가 window 의 경우 Windows Defender 에서 사용하는 포트의 방화벽을 열어줘야 한다.

 

이렇게까지 하면 네트워크 설정은 '거의' 끝났다.
현재의 아키텍쳐를 단순히 도식화하면 다음과 같다.

네트워크 아키텍쳐

이제 DNS 서버만 연결하고 SSL 인증서를 발급받으면 된다.

 

4. DNS 연결

필자는 CloudFlare를 사용했다. 일단 무료이기도 하고 프리 멤버쉽에도 불구하고 꽤 많은 기능을 제공하기에 편리하다.
구입한 도메인과 네트워크 공인 IP를 프록싱 하면 무리 없이 접근이 가능하다.

CloudFlare 도메인 프록싱

5. SSL 인증서 발급

SSL 인증서는 기존의 Certbot으로 발급받던 방식 말고 CloudFlare 에서 발급받을 수 있는 방법이 있다고 해서 해당 방법을 적용해 보았다.

왼쪽 탭에 SSL/TLS -> 원본 서버에서 Cloudflare는 Let’s Encrypt와 같은 CA와 협력하여 SSL/TLS 인증서를 발급해 준다고 한다.

CloudFlare SSL 인증서 발급

 

인증서 생성을 통해 생성하면 인증서와 개인 Secret 키가 나오게 된다.
이 두 개를 /etc/nginx/sites-available/default 에서 ssl_certificat와 ssl_certificate_key에 지정한 위치에 각각 저장하고

systemctl restart nginx

nginx를 재시작하면 SSL 이 자동으로 적용된다.

 

6. Docker Container 실행

Docker Container를 이용하여 가상머신에서 다른 로컬에서 작업하고 빌드한 프로젝트 이미지를 받고 실행하였다.

가상머신에서 Docker를 설치하는데 Mac에서 작업할 땐 못 보던 에러가 발생했다.

문제를 바로잡을 수 없습니다. 망가진 고정 패키지가 있습니다

라는 에러였는데 libseccomp2 패키지에 대한 버전이 맞지 않아서 생긴 문제였다.
그래서 공식 사이트에서 2.5.1 버전을 직접 받아와 설치했다.

 

curl -O http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
dpkg -i libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb

 

7. 결과

집에서 접속 테스트

가상머신에서 실행한 스프링 부트 서버가 다른 네트워크에서 접속되는 걸 확인했다.

 

도메인 SSL 적용 확인 테스트

테스트 계정으로 도메인이랑 ssl 적용도 잘 된 것을 확인했다.

 

✔️ 결어

가상머신을 세팅하는 데에는 큰 어려움이 없었으나, 네트워크 개념에서 많이 막혔다. 특히 NAT 방식의 구동원리와 Bridge와의 차이. 이 글을 끝까지 읽어봤다면 NAT 방식을 설명하면서 '호스트 컴퓨터는 가상머신의 게이트웨이..' 라고 자주 언급했을 것이다. 이 구조를 이해 못 해서 삽질을 아주 아주 많이 했다는 소리다.
서버를 직접 구축해 보니 욕심이 많이 난다. 더 안정적이고 다양한 기능을 하는 서버로 다음 포스팅을 기약하겠다.

 

✔️ 참고 자료

[네트워크]

게이트웨이

서브넷마스크

IP

IP Class

NAT

DHCP

 

[Docker 오류]

libseccomp2 의존성 문제

 

'Devops' 카테고리의 다른 글

VMWare 프리징 및 부팅 속도 저하 해결  (1) 2025.01.05