일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 설계
- 해커랭크
- 프린터
- 3D
- 아두이노
- 3D Printer
- 3d프린터
- 3D 프린터
- 라즈베리파이
- Arduino
- 자작
- C언어
- 프로젝트
- DIY
- ESP
- fusion360
- Hypercube
- 하드웨어
- 오픈소스 하드웨어
- 코딩테스트
- ESP-IDF
- esp32
- 퓨전360
- 리눅스
- Fusion 360
- IOT
- SQLITE3
- 오픈소스
- 쏘카
- C++
- Today
- Total
09LABS
[Network] 라즈베리파이에 Nginx Proxy Manager를 설치해보자 본문
홈 서버를 운영하면서 한가지 불안한 점이 있었다.
공유기를 타고 바로 내 홈서버에 접속이 가능하다는 점이었는데 포트포워딩으로 일부 포트만 열어둬서 찝찝함이 없지않아 있다.
예전에 라즈베리파이를 공유기에 꽂아놓고 포트를 전부 개방했다가 해킹당해서 라즈베리파이를 포맷하게 된 적이 있었다.
물론 그 때 라즈베리파이의 비밀번호를 변경하지 않았던 탓도 있었다.
다행히 최근에는 Raspberry Pi Imager에 사용자 계정을 커스텀으로 설정할 수가 있다.
아무튼 홈서버를 보호하고자 직장 동료에게 물어보니 성능이 그렇게 좋지 않은 라즈베리파이로 Reverse Proxy 역할을 하게 해주면 안전하게 기기를 관리할 수 있게 된다고 들었다.
그럼 Proxy와 Reverse Proxy의 차이는 뭘까?
Proxy? Reverse Proxy?

그림에서 가장 큰 차이점은 Proxy 서버가 클라이언트쪽에 있거나, 서버쪽에 있는 것에 따라 Forward Proxy, Reverse Proxy로 나뉜다.
Forwared Proxy 서버는 캐싱을 통해 부하를 줄이는 효과도 줄 수 있으며 클라이언트측 보안을 위해서 사용할 수 있다.
간단한 예로 사내망의 클라이언트가 인터넷에 접속을 할 때 Forward Proxy에 Rule을 추가하면 유해 사이트 접속을 차단할 수 있다.집에 Forward Proxy를 두면 불법 토토를 방지...
Reverse Proxy는 Forward Proxy와 반대로 서버 보안, 로드밸런싱, 캐싱을 목적으로 사용할 수 있다.
로드밸런싱은 서버의 과도한 트래픽 유입이 방지하기 위해 여러 대의 Reverse Proxy를 서버 앞단에 둘 수 있다.
물론 작고 귀여운 홈서버에는 로드밸런싱이 굳이 필요하진 않겠지만 해커들의 무작위 공격을 방지할 수도 있다. (이상한 패턴 감지)
서버 보안 측면에서는 클라이언트가 접근하고자 하는 서버의 정보를 숨기는 역할을 한다.
클라이언트는 서버로 접속할 때 Reverse Proxy의 URL로 접속하기 때문에 서버의 정보를 알지 못한 채 서비스를 이용하게 된다.
Nginx on Raspberry Pi
우리의 작고 강력한 킹갓 라즈베리파이는 작고 소중한 홈서버를 보호할 리버스 프록시 서버의 역할로는 충분하다.
보통 Nginx는 웹서버로 흔히들 알고있다. 물론 정적 웹서버를 아주 간단하게 띄울 수 있으니 유용하게 사용한다.
하지만 Nginx에 기능만 활성화 시키면 Proxy 서버로 사용할 수 있다.
다들 Nginx를 CLI로 설치하고 나서 가장 당황하는 것이 conf 파일을 수정하는 것인데 이게 상당히 귀찮다...
요즘은 Nginx UI, Nginx Proxy Manager와 같은 GUI 툴이 있어서 관리와 설정을 쉽게 반영할 수 있다.

Nginx Proxy Manager는 Docker에 설치하는 것이기 때문에 리소스가 부족하지 않을까 걱정했다.
ChatGPT에게 질문해본 결과 충분히 3B+ 모델에서도 감당이 가능하고 인터페이스나 커뮤니티 지원도 훨씬 좋다는 피드백을 받았다.
준비물
- 라즈베리파이 (최소 3B 이상 권장)
- 충전기 (5V 2.5A 이상 권장)
- 랜선
1. Raspbian 설치
https://www.raspberrypi.com/software/
Raspberry Pi OS – Raspberry Pi
From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.
www.raspberrypi.com
먼저 위 페이지에 접속해서 Raspberry Pi Imager를 다운로드 받는다.

라즈베리파이 3B를 사용할 경우 OS는 필히 Lite 버전을 설치하는 것을 권장한다.
Desktop 버전을 설치했다가 바탕화면에서 멈춰있는 경험을 했다...
4B 이상은 Desktop 버전을 설치해도 괜찮으나 굳이 리버스 프록시 서버에 Desktop 버전을 설치할 필요는 없다.

SD카드에 OS 설치가 완료되면 언마운트 했다가 다시 마운트하고 SD카드에 ssh라는 빈 파일을 하나 만든다.
SD카드의 경로가 F:\ 라면 F:\ssh 와 같이 생성하면 된다. VS Code나 Notepad++와 같은 편집기를 권장한다.
2. apt upgrade & Docker 설치
$ sudo apt-get update
$ sudo apt-get upgrade -y
OS 설치를 완료한 뒤 부팅이 완료되면 위와 같이 입력해서 모든 패키지를 새 버전으로 업데이트 한다.
$ curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
그 다음 위 명령어를 입력하면 라즈베리파이에 Docker engine이 설치된다.
$ sudo gpasswd -a pi docker
Docker Group에 사용자 계정을 추가한다.
pi는 기본 사용자명이기 때문에 만약 Rasbperry Pi Imager에서 계정명을 변경했으면 해당 계정 이름을 입력하면 된다.
위 명령어 실행 후 재시작하면 docker 명령어를 사용할 수 있게 된다.
$ sudo apt-get install -y python3-full python3-pip
이제 Docker Compose를 설치하기 전 Python3와 pip를 설치해준다.
$ sudo apt-get install -y docker-compose
위 명령어를 입력해서 Docker Compose를 설치한다.
Docker Compose는 여러 개의 컨테이너를 하나의 서비스로 정의해서 관리할 수 있는 도구이다.
Docker 명령어로 여러 개의 컨테이너를 띄우려면 docker run 명령어를 사용해서 컨테이너를 하나씩 실행해야 하지만 Docker Compose를 사용하면 YAML로 정의된 Manifest에 서비스와 컨테이너를 정의하고 docker-compose 명령 한 번으로 컨테이너 여러 개를 한 번에 실행할 수 있다.
3. Nginx Proxy Manager 설치
$ sudo mkdir -p /opt/stacks/nginxproxymanager
$ cd /opt/stacks/nginxproxymanager
Docker Compose까지 설치가 완료되면 위 명령어를 입력해서 Nginx Proxy Manager의 데이터를 기록할 폴더를 생성한다.
$ sudo nano compose.yaml
그 다음 YAML 파일을 작성할 수 있도록 nano 편집기로 파일을 연다.
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'yobasystems/alpine-mariadb:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
MARIADB_AUTO_UPGRADE: '1'
volumes:
- ./mysql:/var/lib/mysql
위와 같이 YAML 매니페스트를 작성 후 ctrl+x키 입력 후 엔터를 치면 nano 편집기가 종료되며 내용이 파일에 기록된다.
$ docker compose up -d
[+] Running 36/41
⠏ app [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 262.1MB / 338.3MB Pulling 127.9s
✔ b47565bb13c5 Pull complete 44.4s
✔ 80ee10acd8e3 Pull complete 45.5s
✔ 3d54d5509f0a Pull complete 81.5s
✔ d0befc9d6b42 Pull complete 82.7s
✔ 19e2e7931fb8 Pull complete 84.9s
✔ c223caf066db Pull complete 88.6s
✔ 3747cfb47804 Pull complete 89.5s
⠏ 19c59b2f76d0 Extracting [=======================================> ] 35.32MB/45.19MB 123.9s
✔ f2c83aa05d1a Download complete 28.7s
✔ 23c413e9ce10 Download complete 29.6s
✔ 18f9bb6dfe42 Download complete
[+] Running 3/3
✔ Network nginxproxymanager_default Created 0.6s
✔ Container nginxproxymanager-db-1 Started 3.6s
✔ Container nginxproxymanager-app-1 Started
이제 드디어 Nginx Proxy Manager를 실행시켜볼 차례이다.
위와 같이 docker compose up -d 명령어를 입력하면 Docker Image를 다운로드 하고 서비스에 정의된 컨테이너가 실행된다.
$ hostname -I
192.168.0.2 172.17.0.1 172.18.0.1
라즈베리파이 IP 주소는 위 명령어로 확인할 수 있다.
일반적으로 공유기에 연결되어 있으면 192.168로 시작하는 주소를 볼 수 있다. (공유기마다 살짝 다를 수 있음)
그 다음 PC에서 웹브라우저를 켠 뒤 http://<IP주소>:81/과 같이 입력하면 Nginx Proxy Manager 페이지로 접속할 수 있다.
4. Nginx Proxy Manager 초기 설정

ID : admin@example.com
Password : changeme
Nginx Proxy Manager에 접속해서 초기 계정과 비밀번호를 입력한 뒤 로그인 한다.

로그인을 완료하면 위와 같이 이메일과 사용자 정보를 변경하라고 한다.
기본값을 놔두면 보안에 취약하므로 변경한다.

계정을 변경하면 비밀번호도 변경하라고 나온다.
비밀번호도 변경 후 Save 버튼을 눌러준다.
5. Proxy Host 추가

이제 Reverse Proxy 역할을 할 수 있도록 Proxy Host를 추가한다.
상단 메뉴에서 Hosts를 누르면 Proxy Host를 추가할 수 있다.
Add Proxy Host를 눌러서 새 프록시 호스트를 추가한다.

필요에 따라 기능은 켜고 끄면 된다. 일반적으로 다 켜는 것을 권장한다.
Domain Names : 인입될 도메인 (여러 개 추가 가능)
Forward Hostname / IP : 대상 서버 도메인 또는 IP주소
Forward Port : 서비스 포트 (서버 포트)
Cache Assets : 정적 콘텐츠 캐싱
Block Common Exploits : 공격 패턴 차단, SQL Injection 차단 기능
WebSocket Support : 웹소켓 지원

Proxy Host를 추가하면 위와 같이 추가된 호스트 정보를 볼 수 있다.
이제 Ingress 설정을 반영해서 Sub Path로 Grafana Dashboard에 접근해보자.
원래는 클라이언트 -> 공유기 포트포워딩 -> NAS 서버 -> k3d Container -> Ingress Nginx -> Application 순서로 접속했다.
Reverse Proxy가 NAS 서버 앞단에서 프록시 역할을 해주므로 아래와 같이 접속한다.
클라이언트 -> 공유기 -> Reverse Proxy -> NAS 서버 -> k3d Container -> Ingress Nginx -> Application

Grafana Ingress 설정에서 애를 먹었지만 잘 적용되었다.
이렇게 해서 한층 더 안전한 NAS 서버 운영을 할 수 있게 되었다.
집에 굴러다니는 라즈베리파이가 있다면 이런 식으로 리버스 프록시 서버로 활용하면 아주 좋을 것으로 예상된다.

오늘도 하얗게 조져졌다....
'Linux > Raspberry Pi' 카테고리의 다른 글
[fluidd pi] GPIO Control, PSU Control 버튼 만들기 (0) | 2022.09.16 |
---|---|
[Raspberry Pi] 프로그램 자동실행 서비스 등록하기 (2) | 2021.09.16 |
[Raspberry Pi] MySQL root 계정으로 로그인이 안될 때 (0) | 2021.09.13 |
[Raspberry Pi] octoprint 설치방법 (수동설치) (0) | 2019.01.23 |