홈서버 구축 일지 with 라즈베리파이
📌 들어가며..
지금까지 여러 프로젝트를 하면서 주로 AWS라는 클라우드 서비스를 이용해서 배포해 왔다. 그런데 AWS 프리티어는 기간이 정해져 있기도 하고, 프리티어라고 해도 결국 비용 문제를 생각하게 된다.
그래서 '언젠간 홈서버를 구축해보자'는 생각을 계속 하고 있었는데, 마침 라즈베리파이를 구할 수 있는 기회가 생겨 홈서버 구축에 도전해 보았다!
이 글은 완벽한 가이드라기보다는 내가 직접 설치하고 설정하면서 겪은 과정을 기록한 글이다. 라즈베리파이로 홈서버를 구축하려고 하시는 분들에게 조금의 참고가 되면 좋을 것 같다.
사용 환경
- 라즈베리파이 : Raspberry Pi 4 (microSD 256GB)
- 인터넷 : KT 기가 인터넷
- OS :Ubuntu 25.04
📌 홈서버 구축 단계
1. OS 설치
라즈베리파이 새 제품을 산 게 아니라 얻은 제품이기 때문에(기존에 깔려있던 우분투 비밀번호도 모르는 상태) 먼저 포맷을 해줬다.

일단 맥북에는 sd카드를 꽂을 수가 없어서 오래전에 쓰던 윈도우 노트북을 가져와 포맷을 해줬고
포맷을 완료했으니 새로운 우분투를 설치해 보자.
아래 링크에서 라즈베리파이 이미지를 다운받았다.
윈도우에서 깔았기 때문에 Download for Windows 로 설치해 줬다.
https://www.raspberrypi.com/software/
Raspberry Pi software – Raspberry Pi
From our operating system to our GitHub repos, explore the software that powers our technology
www.raspberrypi.com
설치하는 과정은 아래 링크를 참고했다. 아주 자세하게 소개되어 있어 쉽게 따라 할 수 있었다.
https://leirbag.tistory.com/121
Raspberry Pi 4에 Ubuntu 22.04 LTS 설치하기
준비물 라즈베리파이, Micro SD 카드 참고한 글 https://ubuntu.com/tutorials/how-to-install-ubuntu-desktop-on-raspberry-pi-4#1-overview How to install Ubuntu Desktop on Raspberry Pi 4 | Ubuntu Ubuntu is an open source software operating system
leirbag.tistory.com


이제 우분투 데스크탑이 깔려있는 SD 카드를 라즈베리파이에 넣어주고 USB로 연결할 수 있는 키보드와 마우스의 USB도 꽂아준다.
마지막으로 전원 연결을 하고 모니터와 연결을 해주면 모니터에서 우분투 초기 설정 화면을 볼 수 있다.
언어 선택, 계정 설정 등 초기 설정까지 해주면 OS 설치는 마무리가 된다.
2. 네트워크 환경 설정
매번 우분투에 접속해야 할 때마다 모니터 연결하고 들어가는 건 정말 귀찮은 일이다.
그래서 홈서버를 편하게 사용하려면 원격 접속 환경을 만들어 두어야 한다.
나는 주로 맥북에서 라즈베리파이에 접속할 계획이고, SSH를 통해 원격 접속을 할 수 있도록 설정을 해줄 것이다.
2.1 SSH 원격 접속 (내부 IP 접속)
ssh로 원격 접속을 하려면, 라즈베리파이에 ssh 서버 프로그램이 설치되고 실행 중이어야 한다.
sudo apt-get update
sudo apt-get install openssh-server
모니터로 연결한 우분투 데스크탑에서 open-ssh-server 패키지를 설치한다.
sudo systemctl start ssh
sudo systemctl enable ssh
SSH를 시작하고, 부팅 시 자동으로 실행되도록 설정해 준다.
sudo systemctl status ssh
SSH 상태를 확인했을 때 아래처럼 초록색으로 running이라고 뜬다면 정상적으로 실행되는 것이다.

이제 맥북에서 접속할 라즈베리파이의 내부 ip를 알아야 한다.
ifconfig
이 명령어를 입력하고 wlan0(wi-fi) 옆에 inet 옆에 있는 주소가 바로 라즈베리파이가 공유기로부터 할당받은 내부 ip이다.
그럼 이 내부 ip로 맥북에서 우분투에 접속해 보자.
ssh [라즈베리파이 사용자명]@[라즈베리파이 내부IP]

goood!
2.2 포트포워딩
지금까지의 설정은 같은 공유기를 사용했을 때만 SSH로 접속이 가능하다. 바로 내부 ip로 접속했기 때문!
다른 공유기로도 개발을 할 수 있기 때문에 포트포워딩을 해줘야 한다.
포트포워딩이란, 쉽게 말해 외부에서 공유기에 요청을 보내면 그 공유기에 연결되어 있는 특정 기기 또는 프로그램에 요청을 전달해 주는 것이다.
즉, "그 공유기에 연결되어 있는 라즈베리파이 SSH로 접속하고 싶어요!"라고 했을 때 사용하는 것이다.
먼저 웹 브라우저에서 172.30.1.254로 접속하면 KT 공유기 관리 페이지가 나온다.

초기 아이디와 비밀번호는 ktuser, homehub이다. 당연히 반드시 변경해줘야 한다.

로그인 후, 장치 설정 -> 트래픽 관리 -> 포트 포워딩 설정으로 이동한다.
나는 22(SSH)와 8080(웹서버)을 열어줬다.
소스 IP 주소와 소스 포트는 특정 IP와 특정 포트에서만 접속을 허용할 때 사용한다고 한다. 추후 보안을 위해 설정해 줄 예정이다.
외부 포트는 외부에서 접속할 때 사용할 포트 번호이다. SSH 포트 번호는 기본적으로 22번이지만, 보안을 위해서 1234처럼 다른 번호로 설정해 주는 게 좋다. 잘 알려진 포트 번호를 피해서 자신이 원하는 숫자로 설정해 주면 된다.
내부 IP 주소는 위에서 확인한 라즈베리파이의 내부 IP 주소를 입력해 준다.
이렇게 모두 입력하고 추가를 눌러 규칙을 저장하면 설정해 준 외부 포트로 외부에서 접속이 가능하다.
2.3 KT WiFi no-ip DNNS 설정
포트포워딩까지 설정해 줘서 외부에서도 접속이 가능하지만 아직 문제가 남았다.

집에서 사용한 인터넷의 공인 IP 주소는 고정되어 있지 않고, 주기적으로 바뀐다.
"나 A공유기로 접속할 거야~" 했을 때 그 A공유기의 주소가 주기적으로 바뀌는 것이다.
그래서 이 주소가 바뀔 때마다 매번 이 주소를 확인해줘야 하는 번거로움이 있다.
그래서 필요한 게 바로 DDNS(Dynamic DNS)

DDNS는 고정된 도메인 주소를 매번 바뀌는 IP 주소와 연결해 주는 서비스이다.
그림처럼 IP가 바뀌더라도, 도메인 주소와 연결해주는 부분만 바꿔주면 되고, 접속할 땐 항상 같은 도메인 주소로 접속할 수 있다.
DDNS 서비스를 무료로 이용할 수 있는 No-IP를 사용했다.
No-IP | Smarter DNS Starts Here
How Customers Use No-IP People and companies across the world use No-IP’s Dynamic DNS and Managed DNS services to access their computers and files remotely, monitor cameras or smart devices, and more.
www.noip.com
여기서 회원가입, 로그인을 해주고

DNS Records -> Create Hostname으로 이동해 원하는 호스트네임과 IPv4에 IP 주소(KT 공유기 관리 페이지에서 상태 정보 -> 시스템 정보 -> IP 주소)를 입력하여 생성해 준다.

여기서 주의할 점이 있다. 우린 무료 버전이기 때문에 30일마다 IP 주소를 갱신해줘야 한다.
갱신이 필요한 시점에 메일이 와서 크게 걱정할 부분은 아니다. 무료니까 이 정돈 감당 가능..

다시 KT 공유기 관리 페이지로 돌아와서 장치설정 -> 부가 기능 -> DDNS 설정으로 들어간다.
DNS 서버 : no-ip
사용자 ID : No-IP 아이디
비밀번호 : No-IP 비밀번호
URL : 방금 만든 호스트네임
적용 누르면 끝!!!
ssh -p [외부 포트] [라즈베리파이 사용자명]@[내 DDNS 주소]
이제 이렇게 접속할 수 있다.
3. 개발 환경 설정
지금까지 설정한 우분투 네트워크 환경을 설정해줬고, 이제 실제 개발 환경을 설치하고 서비스를 배포해줄 차례이다.
실제 개발 환경은 다음과 같다.
- 백엔드 : Spring Boot
- DB : MySQL
- 캐시 : Redis
- 컨테이너 관리 : Docker
- CI/CD : GitHub Actions
사실 우분투에 개발 환경을 설치하는 과정은 AWS EC2에 환경 세팅하는 거랑 거의 동일하다. 이 과정은 이전에 작성했던 글에서 다뤘다.
그래서 이번 글에서는 설치 과정의 세부 내용은 생략하고, 전체적인 배포 흐름과 방화벽 설정 과정만 정리하려고 한다.
전체적인 배포 흐름

방화벽 설정 과정
보안 강화를 위해 방화벽을 설정해보자.
MySQL과 Redis를 외부에서 접근할 수 없도록 하고, Docker 내부 네트워크에서만 접근할 수 있도록 하려고 한다.
Docker 내부 네트워크는 아래 명령어로 알 수 있다.
docker network inspect bridge

출력 결과는 json으로 나오는데, 그 중 Subnet이 Docker 내부 네트워크 대역을 나타낸다.
아래 두 명령어로 3306(MySQL)과 6379(Redis) 포트를 Docker 내부 네트워크에서만 접근 가능하도록 설정할 수 있다.
sudo ufw allow from (Docker 내부 네트워크) to any port 3306
sudo ufw allow from (Docker 내부 네트워크) to any port 6379
마지막으로 방화벽이 잘 설정이 되었는지 확인하려면 아래 명령어로 확인하면 된다.
sudo ufw status
참고
- KT WIFI 포트포워딩 (feat.라즈베리파이) - 2
- 라즈베리파이4에서 KT GiGA Wifi Home 포트포워딩 설정하기
- KT 공유기 no-ip DDNS 설정
- KT 공유기 DDNS 설정하기