본문 바로가기

생활코딩

라즈베리파이 - 홈서버 구성

최근에 라즈베리파이로 홈서버를 구성하여 간단한 웹 애플리케이션을 하나 올리고 외부에서 접속 가능하게 했습니다. 이 내용을 전체적인 관점에서 정리해 보려고 합니다.

 

우선 전체 구성도는 대략적으로 다음과 같습니다.

1. 외부망 연결

외부망 연결은 주 서버가 되는 라즈베리파이 5를 직접 연결하지 않고, 공유기(그림에서 편의상 무선 접속지점인 AP로 표기해 뒀습니다)를 거치도록 했습니다. 라즈베리파이 5에 유선망을 직접 연결하는 불편함도 있었지만, 무엇보다 공유기 쪽에 기본적인 네트워크 관리 기능이 있어서 일차적인 보안은 공유기에서 하는 것으로 결정했기 때문에 공유기를 관문으로 하게 됐습니다. 이렇게 함으로써 라즈베리파이 5쪽에서는 방화벽 같은 쪽은 크게 신경 쓰지 않을 수 있었습니다.

공유기 쪽에서 HTTPS인 443 포트만 열어 두고 이 포트를 라즈베리파이 5의 443 포트로 포트 포워딩하게 설정했습니다.

 

2. Web Server

웹 서버는 nginx를 쓰기로 결정했습니다. 그냥 데비안 패키지를 사용하기로 해서 설치는 크게 문제가 없었습니다만, 필요에 의한 부가적인 설정들에 시간이 들었는데 진행한 작업들은 다음과 같습니다.

2.1  ModSecurity 추가

웹 보안 위협에 대응하기 위해 유명한 WAF(Web Application Firewall) 중에 하나인 ModSecurity를 설치했습니다.

https://intotherealworld.tistory.com/61

 

라즈베리파이 - nginx - ModSecurity 설치

요즘 간단한 웹앱을 하나 만들어서 라즈베리파이 5에서 홈서버로 운영하려고 하고 있습니다. 앱은 간단한 것이어서 금방 만들었고, duckdns를 이용해 공인 도메인도 설정하고, Let's Encrypt를 사용하

intotherealworld.tistory.com

2.2 GeoIP 추가

특정 국가 접속 차단을 위해 GeoIP 기반 접속 차단 기능을 추가했습니다.

https://intotherealworld.tistory.com/63

 

라즈베리파이 - nginx - 특정 국가 접속 차단

일전에 ModSecurity를 사용하여 보안을 강화할 때 IP 주소들을 좀 살펴보니 공격의 출처는 대부분 - 아니 모두가 외국이었습니다. 그래서, 특정 국가들에 대해서 좀 차단을 해야겠다는 생각에 nginx에

intotherealworld.tistory.com

2.3 접속 로그 분석

접속 로그 분석을 위해 goaccess를 사용했습니다.

https://intotherealworld.tistory.com/64

 

GoAccess - nginx 접속 로그 분석

웹서버 접속 로그 분석툴인 GoAccess 사용 및 설정에 대한 내용을 정리 차원에서 적어둡니다. 1. 설치웬만한 리눅스 배포본에 대해서는 패키지로 제공하기 때문에 패키지로 설치하는 것이 편합니

intotherealworld.tistory.com

 

3. DBMS

DBMS가 필요하여 MySQL(정확히는  MariaDB)를 설치했습니다.

https://intotherealworld.tistory.com/58

 

라즈베리파이 MySQL 설치

라즈베리파이에 MySQL 설치하는 걸 매번 잊어버리는 것 같아 정리 차원에서 적어둡니다. MySQL vs MariaDB라즈베리파이 64bit 최신 OS는 리눅스 Debian bookworm을 포팅한 ARM64 버전입니다. 보통 Linux에 설치

intotherealworld.tistory.com

 

4. Web Application Server

웹 애플리케이션은 Spring Boot 기반으로 개발했습니다. 그래서, WAS는 Embedded Tomcat으로 지정했습니다. Undertow도 검토를 하기는 했는데, 가족만 사용할 거라 트래픽 등에 대한 고려는 필요 없어서 기본을 사용했습니다.

Spring Boot 애플리케이션이 Docker 이미지로 만들어지고 이를 라즈베리파이 5에서 Docker로 기동하게 했습니다.

 

5. Git Server

소스 형상 관리를 위해 GitHub을 사용해도 됐지만, 암호 같은 민감 정보들과 관련된 보안을 챙기거나 기타 접속 시 (약간의) 불편함 등이 있어서 Git Server를 하나 마련하기로 했습니다. 마침, 놀고 있던 라즈베리파이 3가 있어서 이 쪽에다가 Git Server를 구축했습니다.

https://intotherealworld.tistory.com/60

 

라즈베리파이 - Git 서버 설치하기 (Gitea)

요즘 몇가지 백엔드 프로그램들을 라즈베리파이에서 돌리려고 하고 있는데 소스 배포가 문제였습니다. 배포에 필요한 파일을 서버로 복사해서 실행 시키는 것도 한 두번이지 계속은 어려울 거

intotherealworld.tistory.com

 

6. Docker Registry Server

라즈베리파이5에 필요할 때마다 필요한 환경을 구축하는 게 귀찮아서 애플리케이션 쪽은 Docker 기반으로 운영하기로 했는데 Docker 이미지를 라즈베리파이5로 옮기는 것도 일이더군요. 그래서, 외부 Docker Registry 서비스를 사용할까 검토해 봤는데, 아무래도 무료 버전은 여러 모로 한계가 보여서 이 것도 내부적으로 구축하기로 결정했습니다.

https://intotherealworld.tistory.com/62

 

라즈베리파이 - Docker Registry 서버 설치

앞선 Git 서버 설치하기 글과 이어지는 글입니다. Git 서버는 Gitea를 통해 잘 설치했고, 이번에는 라즈베리파이 3B에 Docker Registry 서버 설치입니다. 순서 상으로는 Gitea를 나중에 설치 했고, Docker Reg

intotherealworld.tistory.com

 

7. 배포

CI/CD 자동화를 고려해 봤는데, 배보다 배꼽이 더 크더군요. 그래서, 젠킨스나 Ansible 등의 사용은 안 하기로 결정했습니다. 지금은 단순하게 다음과 같이 배포를 합니다.

 

  1. 노트북에서 Docker 이미지 빌드
  2. Docker Registry 서버(라즈베리파이3)로 push
  3. 라즈베리파이5에서 Docker Image pull 하여 재기동

블루/그린 배포도 고려는 했는데, 지금은 필요하지 않아 적용하지는 않았습니다. 추후, nginx 설정에서 reverse proxy 설정을 변경하는 식의 블루/그린 배포는 도입하지 않을까 생각됩니다.

 

8. 도메인과 인증서

8.1 도메인

도메인은 무료 DDNS 서비스인 Duck DNS를 사용했습니다. DDNS는 동적(Dynamic) DNS라는 의미인데 IP 주소가 동적으로 변하는 것을 반영해 주는 DNS  서비스입니다. 가정용 인터넷의 경우 고정 IP 주소를 별도로 신청하지 않는 한 기본적으로 동적 IP 주소 체계입니다. 즉, IP 주소가 변경될 수 있습니다. 그래서, 이런 동적 IP 주소를 갖는 서버에서 고정된 도메인 주소로 일관되게 접속할 수 있으려면 IP 변경 시마다 도메인 네임 시스템에 반영이 돼야 합니다.

Duck DNS는 이런 요구 사항을 모두 충족시켜 주는 무료 서비스입니다. 사용법도 매우 쉽습니다. 그냥 가입하고 원하는 호스트 이름을 등록하면 끝입니다. 그리고, 동적으로 변하는 IP 주소를 반영하는 방법도 https://www.duckdns.org/install.jsp 에서 떠먹여 주듯이 알려 주고 있습니다.

8.2 인증서

웹사이트를 HTTPS로 접속하게 하려면 해당 도메인에 대한 TLS 인증서가 필요합니다. 이게 상용은 가격도 만만치 않고, 발급 요청 등 여러 가지 귀찮음이 많은데, 고맙게도 Let's Encrypt라는 비영리 인증 기관이 무료로 TLS 인증서를 제공해 주고 있습니다. 거기다가 certbot을 사용하면 nginx나 apache에 인증서를 손쉽게 설치할 수 있습니다. 사용이 쉽기는 한데, 이와 관련해서는 추후에 별도의 글로 한 번 정리해 보려고 합니다.

 

이렇게 Duck DNS와 Let's Encrypt의 도움으로 도메인과 TLS 인증서를 설정 및 설치했습니다.

 

9. 정리 및 여담

이런 과정들을 거쳐서 홈서버 구축을 마쳤습니다. 진행하면서 느꼈던 몇 가지 점들을 적어보면 다음과 같습니다.

 

"도메인, 인증서 문제가 매우 쉽게 해결됐다."

전에는 이와 관련해서 쉽지가 않았는데, 세상 참 많이 좋아졌더군요. 세상에는 참 고마운 사람과 단체들이 많은 거 같습니다.

 

"필요한 것들은 웬만하면 다 있다."

이제는 당연한 얘기기는 하지만 오픈 소스 생태계는 역시 위대한 것 같습니다.

 

"라즈베리파이의 서버 가능성"

일단 데비안 bookworm 버전을 기반으로 하고 있기 때문에 일반적인 리눅스를 사용하듯이 하면 된다는 점과 웬만한 패키지나 애플리케이션들이 ARM64 아키텍처를 지원한다는 점 때문에 기능성 면에서는 크게 문제가 없어 보입니다.

성능적인 측면에서는 특별히 부하테스트를 해 본 것은 아니어서 뭐라고 평하기는 어려운데, 경험에 기반에서 얘기해 보면, 적어도 3는 워드프레스 최신 버전을 돌리기가 어렵습니다. 그리고, 5는 지금 제가 사용하는 정도에서는 아주 충분하게 느껴졌습니다.

요즘이야 본격적으로 서버를 가동하려고 하면 클라우드 환경을 먼저 고려하겠지만, 간단히 인터넷을 통해 연결돼야 하는 경우이거나 서버 설정 관련 학습을 해야하는 상황이라면 충분히 좋은 선택지로 보입니다.

 

"보안 위협"

세계는 넓고, 할 일 없는 사람들은 많다를 다시 한번 느끼게 되네요. 어제 통계만 봐도 비정상 접속 시도가 정상 접속의 거의 4배에 육박하더군요. 아래와 같은 시도가 꾸준히 들어옵니다. 재밌게도 국내에서 들어오는 시도는 없는데요, 당연히 국내에서 이런 시도는 VPN 등을 통해서 해외로 우회하여 들어오겠죠. 어쨌든 이런 노력들이 보다 밝은 영역으로 전환된다면 얼마나 좋을까 하는 생각이 듭니다.