[Home Server 구축기 #1] 미니PC로 시작하는 Ubuntu 홈서버 구축
👋 소개
안녕하세요! 대학생 개발자 주이어입니다.
오늘은 평소와는 조금 다른 홈 서버 주제로 찾아왔습니다.
최근에 갑자기 홈 서버에 관심이 생겨 직접 구축해보자 생각을 하였고, 그 날 바로 중고로 미니PC를 구매해서 구축을 해보았습니다.
평소에는 AWS EC2나 Railway와 같은 클라우드 서비스를 사용하는 방식으로만 서버를 운영해왔는데, 이번에 직접 서버를 구축하면서 클라우드에서 당연하게 사용하던 기술들이 어떤 원리로 동작하는지 이해할 수 있었습니다.
특히 얼마전 SW마에스트로 활동의 일환으로 AWS(회사 방문)에서 5일간 클라우드 교육을 들었었기 때문에 더욱 와닿았던 것 같습니다.
그래서 오늘은 본격적인 서버 구축에 앞서 미니PC 설치, SSH, SSH-Key, SSH-Config, SSHD, UFW 등 서버 설정에 대해서 정리해보려 합니다.
🗂️ 준비 과정
미니PC 구매
우선 전 새상품을 구매하고 싶었습니다.
하지만 최근 반도체 공급 문제로 인해 CPU, RAM 가격이 몇 배로 올라버리면서 아주 저사양의 미니PC도 40만원에서 60만원 가까이에 판매하고 있었습니다.

그래서 전 당근에서 중고로 사기로 결정했고, 찾아보던 도중 새상품을 중고 가격에 팔고 계신 분을 찾을 수 있었습니다.
해당 상품의 사양은 아래와 같습니다.
- 제품명 : 인텔 파이어뱃 T8 PLUS
- CPU : Alder Lake N95
- RAM : DDR4 8GB
- ROM : SSD 128GB
- OS : Window 11
이러한 사양의 제품을 20만원에 구매할 수 있었습니다.
사실 더 좋은 사양의 미니PC를 더 싼 가격에 살 수 있었습니다.
그럼에도 불구하고 인텔 파이어뱃을 선택한 이유는 디자인 때문이었습니다.
책상에 두고 사용할 생각이었기 때문에 디자인도 어느정도 신경쓰고 있었고 인텔 파이어뱃은 최고의 선택이었습니다.
그렇다고 성능이 많이 차이나는 것도 아니었습니다.

가격 비교를 보여드리기 위해 쿠팡에서 제가 구매한 모델과 비슷한 사양의 미니PC 가격을 찾아보았습니다.
똑같은 제품은 현재 찾아볼 수 없었지만, 40만원대에 가격을 형성하고 있는 것을 알 수 있습니다. (지금 가격이 너무 비쌉니다...)
관련 장비 구매

미니PC 연결을 위한 장비들을 추가로 구매해주었습니다.
각 제품을 왜 구매했는지 아래에 간단히 적어보았습니다.
- LAN : 미니PC에 랜선을 연결하기 위해 구매하였습니다.
- HDMI : 미니PC와 모니터를 연결해 초기 설정을 하기 위해 구매하였습니다.
- DC 12V 전원선 : 미니PC에 전원선이 따로 포함되어 있지 않았기 때문에 구매하였습니다.
- 스위칭허브 : 벽면 랜포트가 하나였기 때문에 이를 메인PC와 미니PC에 각각 할당해줄 수 있는 허브가 필요했습니다.
장비 구매까지 완료하여 미니PC 설치 준비가 끝났습니다.
🖥️ 미니PC 설치 (우분투 설치)
스위칭허브 설치

위와 같이 스위칭허브를 설치해주었습니다.
맨 오른쪽에 꽂혀있는 랜선이 벽면 랜 포트와 연결된 랜선이고, 나머지 두 개는 각각 메인PC와 서버PC에 연결된 랜선입니다.

그림으로 도식화해보면 위와 같습니다.
네트워크를 공부해보셨다면 아시겠지만, 스위치는 OSI 7계층의 L2 계층에서 동작하는 장비이기 때문에 IP주소를 기반으로 클라이언트를 판단할 수 없으며 MAC 주소를 기반으로 판단합니다. 이를 위해 스위치는 각 포트에 연결된 장치(PC)의 MAC 주소를 학습하고 MAC Address Table을 생성합니다. 이후 프레임이 들어오면 목적지 MAC 주소를 조회한 뒤, Table을 확인하여 프레임을 올바른 포트로 내보냅니다.
이렇게 하여 메인PC와 서버PC에 모두 랜선을 연결할 수 있었습니다.
미니PC 설치

미니PC 설치는 그냥 컴퓨터 연결과 똑같이 전원 연결, 모니터 연결, 랜선 연결, 키보드&마우스 연결을 해주었습니다.

미니PC에 기본적으로 윈도우가 깔려있었습니다.
우분투를 설치하기 전에 간단히 테스트해보고 싶어 윈도우 설치를 진행해주었습니다.
(이때 스위칭허브가 도착하기 전이었기 때문에 핸드폰 테더링으로 연결하여 설치를 진행해주었습니다.)
우분투 설치
윈도우를 지우고 우분투를 설치하는 이유는 여러가지 있겠지만, 대표적으로는 세 가지 정도가 있습니다.
- 서버 운영에 최적화된 OS
Ubuntu Server같은 Linux 계열은 처음부터 서버 운영, 원격 관리, 네트워크 서비스 운영, 자동화 등을 고려해서 만들어졌습니다. 따라서 Terminal을 이용한 작업, SSH를 활용한 원격 접속 등이 매우 자연스럽습니다. - 리소스 사용량 차이
Windows와 Ubuntu는 리소스 사용량 차이가 많이 납니다. 사용자 UI, 다양한 백그라운드 서비스 등이 동작하는 Windows에 비해 Ubuntu는 필요한 서비스만 실행 가능합니다. 특히 용량이 작고 성능이 낮은 미니PC의 경우 이러한 리소스 사용량 차이가 크게 납니다. 실제로 Windows의 경우 OS를 까는 것 만으로도 40gb정도의 용량을 차지하지만, Ubuntu는 Destop 버전을 사용하더라도 10gb 내외의 용량을 차지합니다. - 생태계 호환성
대부분의 서버 기술들이 Linux 환경을 기준으로 발전해왔습니다. Docker, Kubernetes, Nginix, Redis... 등도 이에 포함됩니다. 물론 Windows에서도 모두 사용가능하지만 wls를 사용하거나 추가적인 작업이 필요한 경우가 있습니다. 반면 Linux는 훨씬 간편하고 빠르게 적용이 가능하며 호환성 문제가 발생할 확률도 낮습니다.
이러한 이유로 Ubuntu를 선택하였습니다.
이제 진짜 설치해줄 차례입니다.
이전에도 몇 번 OS를 설치해봤었기 때문에 쉽게 진행할 수 있었습니다.
https://ubuntu.com/download/desktop
Download Ubuntu Desktop | Ubuntu
Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.
ubuntu.com
위 사이트에서 Ubuntu Desktop 26.04 LTS(iso 파일)를 다운받아 주었습니다.
최신 버전이라 안정성 측면에서 살짝 걱정이 됐지만, 그래도 LTS라고 하니 공부할 겸 설치해주었습니다.
Ubuntu Server를 까는 것이 서버용으로는 더 가볍고 좋지만, 단순 서버용 느낌보다는 서브PC 느낌을 내고 싶어 Desktop 버전으로 설치하였습니다.
Rufus - 부팅 가능한 USB 드라이브를 간편하게 만들기
rufus.ie
그 후 위 사이트에서 Rufus를 다운받았고, 사용하지 않는 usb를 연결하여 부팅 usb로 만들어주었습니다.
이제 부팅 usb를 미니PC에 꼽고 부팅모드에 접속하여 우분투 설치를 진행해주었습니다.
(따로 사진은 못 찍었습니다.)
⚙️ 서버 초기 설정
SSH 설정
(서버 초기 설정 부분은 대충 어떤 설정을 했구나 라는 느낌으로 훑어보시는 것을 추천드립니다.)
우분투가 성공적으로 설치되었으니 이제 모니터를 제거하더라도 외부에서 접속할 수 있도록 도와주는 SSH를 설정해야합니다.
AWS에서 EC2로 접속할 때 SSH 명령어를 사용하는 것과 똑같습니다.
기본적으로는 SSH 포트가 닫혀있기 때문에 이를 열어주는 작업을 진행해야합니다.
sudo apt install openssh-server
sudo systemctl start ssh
우선 위 명령어를 입력하여 SSH설치 및 실행을 해줍니다.
sudo systemctl status ssh
그리고 위와 같이 입력하여 SSH가 제대로 작동 중인지 확인해 볼 수 있습니다.

상태가 active (running)으로 나온다면 정상적으로 SSH가 실행중인겁니다.
(모든 터미널 사진은 메인PC에서 ssh로 접속하여 실행한 사진입니다.)
그럼 이제 메인PC(windows)에서 정상적으로 SSH로 접속이 가능한지 확인해 봐야합니다.
우선 SSH로 접속하기 위해 우분투 서버의 IP주소를 알아야 합니다.
hostname -I
위와 같이 우분투에서 입력하여 IP주소를 확인합니다.
ssh <username>@<ip address>
(username은 리눅스 사용자 닉네임을 작성하면 됩니다.)
그 후 메인PC powershell에서 위와 같이 명령어를 입력합니다.
password를 입력하라는 문구가 나오면 자신의 리눅스 로그인 비밀번호를 입력하면 됩니다.

그럼 정상적으로 접속이 되실겁니다.
SSH-Key 설정
하지만 이런식으로 비밀번호를 이용하여 접속하는 방법에는 한 가지 문제점이 있습니다.
흔히 말하는 브루트포스 공격에 취약합니다. 무작위로 모든 값을 대입하여 비밀번호를 맞추기 때문에 보안에 문제가 생길 수 있습니다. 또한 비밀번호를 알고 있는 관리자 또는 제 3자가 아무 컴퓨터로 서버에 접속하다보면 문제가 생길 수 있습니다.
이러한 문제를 해결하기 위해서 사용하는 방법이 SSH-Key를 활용한 접속입니다.
SSH-Key는 client에서 생성하며, 공개키와 개인키로 나눠집니다.
개인키는 client만 고유하게 소유하고 있으며 공개키는 사용할 server에 개발자가 직접 넣어줘야 합니다.
공개키는 여러 server가 소유할 수 있습니다.

client는 비밀번호를 입력하지 않고 접속을 요청하며,
server는 client의 공개키를 확인하고 해당 공개키에 대한 인증을 요청합니다.
client는 client만 가지고 있는 개인키를 이용하여 서명한 후 서명값을 전송합니다.
server는 최종적으로 서명값을 확인하고 접속을 허용합니다.
ssh-keygen -t ed25519
메인PC(client)에서 위와 같이 입력하여 SSH-Key를 생성합니다.
ed25519는 암호화 방식을 의미합니다.
C:\Users\<사용자이름>\.ssh\
위와 같은 폴더 위치에 개인키와 공개키가 저장됩니다.
.pub이 붙어있는 파일이 공개키입니다.
type $env:USERPROFILE\.ssh\id_ed25519.pub
위와 같이 입력하여 공개키를 확인 및 복사합니다.
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
(공개키 복사)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
이제 서버에 접속하여 위와 같이 진행해줍니다.
.ssh폴더를 만들고 그 안에 authorized_keys 파일을 만들어 공개키를 넣어줍니다.
이때 .ssh폴더와 authorized_keys파일은 임의로 설정한 이름이 아니라 openssh가 기본적으로 확인하는 공개키 경로입니다.
그후 chmod를 통해 권한 설정을 진행해줍니다.
이제 다시 메인PC에서 접속을 시도해보면 password를 물어보지 않고 SSH-Key 기반으로 바로 접속되는 것을 확인할 수 있습니다.
SSHD 설정
SSH-Key 기반으로 접속이 되는 것은 확인했지만, 그렇다고 비밀번호 로그인을 차단한 것은 아닙니다.
SSH-Key를 가지고 있지 않은 컴퓨터에서 접속을 시도할 경우 여전히 password 입력창이 나오게 됩니다.
password 기반 접속 자체를 막기 위해서는 SSHD 설정을 수정해 주어야 합니다.
sudo nano /etc/ssh/sshd_config
우분투 서버에서 위와 같이 입력하여 sshd_config 파일을 열어줍니다.

그 후 사진에 표시한 설정들을 찾아 주석을 해제하고 설정을 변경해줍니다.
각 설정에 대해서 간단하게 정리해보겠습니다.
- PasswordAuthentication : password를 활용한 인증을 허용할지 결정합니다.
- PubkeyAuthentication : SSH-Key를 활용한 인증을 허용할지 결정합니다.
- PermitRootLogin : root 권한으로 접속하는 것을 허용할지 결정합니다.
이제 password를 사용한 접속은 불가능하며, key 기반의 접속만 가능합니다.


위 2개의 사진처럼 key이외의 인증 방법을 거부하는 것을 확인할 수 있습니다.
UFW 설정
UFW는 우분투에서 사용하는 방화벽 관리 도구로,
서버에 들어오는 요청과 나가는 요청을 제어하는 역할을 합니다.
어떤 포트의 접근을 허용할 것인지, 어떤 요청을 차단할 것인지를 설정하여 서버에 접근할 수 있는 경로를 제한합니다.
저는 이러한 설정을 하면서 AWS의 Security Group이 떠올랐습니다.
물론 AWS의 Security Group은 인프라 레벨에서 동작하는 가상 방화벽이라는 차이점이 있긴 하지만, 특정 포트와 IP에 대한 접근을 제어하는 역할을 한다는 점에서 유사하다고 생각했습니다.
지금까지는 Security Group을 '서버 보안을 위해 필요한 설정' 정도로만 이해했었습니다.
하지만 이번에 직접 방화벽 규칙을 설정하면서 이러한 설정이 어떻게 동작하고, 보안에 얼마나 중요한 설정인지 알게 되었습니다.
그럼 방화벽 규칙을 설정해보도록 하겠습니다.
sudo ufw default deny incoming
sudo ufw default allow outgoing
우선 위와 같이 기본 설정을 바꿔줍니다.
들어오는 요청은 기본적으로 거부하고, 나가는 요청은 기본적으로 허용하겠다는 설정입니다.
즉, 이제 외부에서 들어오는 모든 요청은 거부됩니다.
하지만 SSH 연결을 하기 위해서는 연결 경로(포트)가 필요합니다.
sudo ufw allow 22/tcp
SSH는 기본적으로 22번 포트를 사용합니다.
위와 같이 입력하면 앞으로 22번 포트로 들어오는 tcp 요청은 허용하겠다는 설정이 됩니다.
sudo ufw allow OpenSSH로 입력해도 설정됩니다.
sudo ufw enable
마지막으로 방화벽을 활성화 해줍니다.
sudo ufw status numbered
위 명령어를 입력하여 정상적으로 작동 중인지 확인할 수 있습니다.

Status가 active로 나오며, 설정한 포트에 대해서만 허용 중이라면 정상적으로 적용이 된 것입니다.
저같은 경우 OpenSSH를 설치할 때 자동으로 설정되는 포트와 직접적으로 허용시킨 포트가 중복돼서 나오는 것을 확인할 수 있었습니다.
😊 마무리
이렇게 지금까지 서버 구축을 위한 준비 과정에 대해서 정리해보았습니다.
사실 기술적으로 어려운 부분은 없었지만, 하나씩 복습하자는 느낌으로 정리하다 보니 글이 굉장히 길어진 것 같습니다.
그래도 서버 설정을 끝냈으니 다음 글 부터는 서버 구축, Docker 설정, CI/CD 등 좀 더 기술적인 글들 위주로 적어보려 합니다!
그럼 지금까지 읽어주셔서 감사드리며, 다음에 더 재밌고 유익한 글로 찾아오도록 하겠습니다.
by. 대학생 개발자 주이어
KYT CODING COMMUNITY Discord 서버에 가입하세요!
Discord에서 KYT CODING COMMUNITY 커뮤니티를 확인하세요. 26명과 어울리며 무료 음성 및 텍스트 채팅을 즐기세요.
discord.com
KYT CODING COMMUNITY 가입하기!