💾 홈 서버 구축 결심
“야 그래도 개발을 업으로 삼고 있으면 집에서 서버 한 대는 굴리고 있어야하지 않냐?”
라고 거들먹 거릴 수 있는 사람이 되기 위해서, 집에서 간단한 홈 서버를 구축해보려고 한다.
3년 전, 막연히 ‘집에서 데스크탑으로 게임을 하고 싶다.’ 생각이 들어 무작정 당근으로 구매한 저사양 데스크탑. 막상 구매하고 나니 게임하는 빈도도 높지 않았고(예전부터 게임을 끈기있게 오래하질 못함), 요즘은 캠핑이나 바이크 같이 바깥을 돌아다니는 취미가 많아져 방 구석에서 먼지만 쌓이고 있었다.
그래서 이 데스크탑을 홈 서버로 활용해보기로 마음먹고, 지난 4월부터 24시간 켜두며 전기세를 체크, GPU 가 돌아가지 않는다면 체감하기 어려운 미미한 수준의 전기세가 나오는 것을 확인했다.
이제부터 본격적으로 홈 서버를 구축하면 된다!
💾 홈 서버 스펙
- AMD Ryzen 5 5600 6-Core Processor
- MemTotal 16GB
- SSD 256GB, HDD 1TB
💾 홈 서버 구축 목표
- 서비스보다는 서버환경 구축 자체에 집중한다.
- 만들고 싶은 서비스가 있으면 바로 파이프라인 구성 후 배포해서 확인해볼 수 있는 환경을 만든다.
- 첫 스텝은 단일 애플리케이션 CI-CD 파이프라이닝
- 두 번째 스탭은 컨테이너화(도커라이징)
- 세 번째 스탭은 데스크탑 리소스 모니터링 환경 구축
- 마지막 스탭으로 컨테이너 오케스트레이션(k8s, argo 등) 도입
일단 큰 목표는 이러한데, 세부적인 계획은 차차 세워나가야겠다. HDD 수명 다 해서 한 차례 날려먹고, 데이터 다중화 필요성 느끼고… 하다보면 클라우드 이용을 고려해볼 것 같다. (NAS 도 고려해볼만 한데, HDD 수명의 한계와 전기세 등 여러가지 포인트를 고려해봤을 때 최종적으로 클라우드로 넘어갈 것 같음.)
💾 홈 서버 OS 설치
우선 홈 서버용 데스크탑에 기존에 설치된 WindowOS 를 밀고, 서버용 OS 를 새로 설치해야 한다. 굳이 서버용 OS 를 설치하는 이유는, 서버용 OS 엔 GUI 가 없기 때문에 데스크탑용 OS 보다 훨씬 가벼워서 리소스 활용에 유리하기 때문이다. (서버 자체 성능 + 전기세 절감)
사용 경험이 많고 커뮤니티가 활발한 Ubuntu Server 를 설치하기로 했다.
당연히 OS 설치용 별도 USB 를 준비해야 한다.
커피 한 잔 가격으로 64GB USB 를 2개나 구매할 수 있다. 심지어 하나만 구매하고 싶은데 그럴 방법도 없다.
공CD 3개에 나눠서 Linux Fedora OS 이미지를 굽던 시절이 있었는데…
라떼는 2GB USB 하나에 3만원이 넘었었는데…
격세지감을 느끼며 USB 를 준비했다면 https://ubuntu.com/download/server 에서 ISO 파일을 다운로드 받고, disktutil
등 명령어 통해 부팅 가능한 USB 를 만들면 된다.
(내가 설치할 때 기준 Ubuntu Server 24.04.2 LTS 가 최신 버전이었다.)
USB 를 만들었다면, 홈 서버 데스크탑에 USB 를 꽂고 BIOS 에 진입해 부팅 우선순위를 USB 로 변경한 후 재부팅하면 된다.
이후부터는 오랜 세월에 걸쳐 잘 프로세싱된 Ubuntu Server 설치 마법사(너무 옛날 표현인가?)의 안내에 따라 설치를 진행하면 된다.
💾 SSH 연결 설정
OS 설치가 완료되었지만 항상 방 구석에 설치된 데스크탑에 모니터, 키보드, 마우스를 연결해두고 관리할 순 없다.
언제든 원격에서 접속해서 간편하게 접속/관리 할 수 있도록 SSH 연결 설정을 진행하도록 하자.
우선 홈 서버 데스크탑에 SSH 서버를 설치해야한다.
$ sudo apt update
$ sudo apt install openssh-server
설치가 완료되었으면, 홈 서버 데스크탑의 private IP 를 확인한다. 그리고 Ubuntu Server ID/PW 를 이용해 SSH 접속이 되는지 확인한다.
$ ssh {ID}@{홈서버-프라이빗-IP}
접속이 잘 된다면, 이제 조금이라도 더 안전한 접속을 위해 공개키/개인키 방식의 인증으로 변경해보자.
(ID/PW 방식은 무차별 대입 공격에 취약하기 때문에 최소한의 보안을 챙기고자 했다.)
$ ssh-keygen -t ed25519 -C "{키 관련 코멘트}"
위 명령어를 이용하면 ~/.ssh/id_ed25519
(개인키), ~/.ssh/id_ed25519.pub
(공개키) 파일이 생성된다.
발급된 공개키를 홈 서버 데스크탑의 ~/.ssh/authorized_keys
파일에 추가해주자.
$ cat ~/.ssh/id_ed25519.pub | ssh {ID}@{홈서버-프라이빗-IP} 'cat >> ~/.ssh/authorized_keys'
이제 홈 서버 데스크탑에 ID/PW 방식이 아닌 공개키/개인키 방식으로 접속이 가능하다.
그리고 공개키/개인키를 제외하고는 더 이상 ID/PW 방식의 접속을 허용하지 않도록 설정을 변경해주자.
$ ssh {ID}@{홈서버-프라이빗-IP}
$ sudo vi /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
$ sudo systemctl restart sshd
이제 홈 서버 데스크탑에 ID/PW 방식이 아닌 공개키/개인키 방식으로만 접속이 가능하다.
💾 외부 네트워크에서 SSH 접속 설정
집이 아닌 사무실이나 외부 환경에서도 홈 서버에 SSH 접속을 하기 위해선 공유기 설정을 변경해주어야 한다.
우선 각자 환경의 공유기 모델을 확인하고, 그 특성을 파악해야한다.
각 공유기 모델마다 지원하는 기능과 범위가 다 다르기 때문.
나는 ipTIME A2003MU 모델을 사용하고 있다.
(세팅을 하다보니 ‘돈 좀 더 들여서 좋은 모델을 살 걸 그랬나…’ 하는 아쉬움이 남는다. 역시 아는 만큼 보인다.)
요즘은 홈 서버 구축 경험기를 블로그에 올리는 사람들이 많아, 구글링을 통해 쉽게 정보를 얻을 수 있었다.
나는 A2003MU 모델 기준으로 설정을 진행하고자 한다.
우선 공유기 관리자 페이지에 접속한다. 대부분 브라우저에 http://192.168.0.1
private IP 를 입력하면 접속할 수 있다.
192.168.0.0 ~ 192.168.255.255 범위는 국제 표준에 따라 사설 네트워크에서 사용하도록 예약된 IP 대역이다.
때문에 대부분의 가정용 공유기에서 해당 대역을 활용한다.
초기에 설정해둔 공유기 관리자 계정으로 로그인에 성공하면, 관리도구 메뉴로 진입이 가능하다.
고급 설정 > NAT/라우터 관리 > 포트포워드 설정
메뉴로 진입하여 SSH 포트포워딩 설정을 진행한다.
내 경우 홈 서버의 IP 가 17 로 끝나기 때문에, 외부 IP 22번 포트로 들어오는 요청을 내부 192.168.0.17 IP 의 22번 포트로 포워딩 되도록 설정해주었다.
포트포워딩 설정이 완료되었으면, https://whatismyipaddress.com/ 에 접속하여 외부 IP 를 확인한다.
그리고 외부 IP 를 활용해 SSH 접속이 되는지 확인해보자.
$ ssh {ID}@{외부-IP}
접속이 잘 된다면 성공!
💾 도메인 연결 설정
외부 IP 를 활용해 SSH 접속이 가능하지만, 숫자로 구성된 IP 를 항상 외우고 다니는 건 너무 미련한 짓이다. 그래서 도메인을 구매하고, 구매한 도메인과 외부 IP 를 연결해줄 수 있는데, ipTIME 공유기에서는 DDNS(Dynamic Domain Name System) 라는 자체 DNS 를 제공하고 있다.
고급 설정 > 특수기능 > DDNS 설정
메뉴로 진입하여 DDNS 설정을 진행한다.
원하는 호스트 이름을 입력하고 저장하면 빠른 시간 내에 호스트이름.iptime.org
도메인이 외부 IP 와 연결된다.
이제 도메인을 활용해 SSH 접속이 가능하다!
단, 이 때 공유기의 설정에 따라 DNS 를 통한 SSH 접속이 안될 수도 있다. 내부-외부-내부 루프백이 안되는 경우가 있는데, 이 때는 공유기 설정을 변경해주어야 한다. 만약 공유기가 별도 설정을 지원하지 않는다면, 모바일 기기 핫스팟과 같은 외부 네트워크를 활용해 접속을 테스트 해보면 된다.
$ ssh {ID}@{호스트이름}.iptime.org
💾 마치며
요즘은 Cloudflare 를 많이 활용한다던데… 아직까지 나는 이렇게 직접 세팅을 하는게 더 재밌는거 같다.
짧은 기간 운영해보다가 불편함이 느껴지면 그 떄 가서 Cloudflare 를 도입해보면 되겠지!
다음 포스트에서는 단일 애플리케이션 CI-CD 파이프라이닝을 구축해보도록 하겠다.
1화 끝.
댓글남기기