안녕하세요.
제가 홈 서버를 운영하면서 구축했던 인프라들을 소개하고 설치 및 운영하는 방법을 소개해드리려 합니다.
먼저 홈 네트워크에서 운영중인 웹 서비스들을 포트를 사용하여 접속하는 것이 아닌 도메인 이름과 서브 도메인으로 구분시켜 접속하기 위해 프록시 기능을 제공하는 Nginx Proxy Manager 라는 프로젝트를 소개합니다.
이건 뭔가요?
https://nginxproxymanager.com/
Nginx Proxy Manager
Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt
nginxproxymanager.com
Nginx Proxy Manager(이하 NPM) 은 오픈 소스 프로젝트로 Ngnix 웹 서버의 프록시 기능을 웹 기반 GUI 로 쉽게 제공하고 관리 가능한 프로젝트입니다. 이를 이용해서 Reverse Proxy(역방향 프록시) 기능과 각 도메인에 대한 SSL 인증서를 손쉽게 적용 가능합니다.
- Tabler 기반의 Web GUI
- Layer 4(L4), Layer 7(L7) 프록시 기능 제공
- Nginx 의 Proxy(Layer 7), Redirection, Stream(Layer 4), 404 Host 기능을 GUI 로 제공
- Let's Encrypt 무료 SSL 또는 사용자 정의 SSL 인증서 제공 및 자동 갱신 기능(with DNS Challenge) 제공
- Nginx HTTP Basic Authorization 기능을 GUI 로 제공
- 계정 관리, 권한 및 감사 로그 기능 제공
- docker 이미지 제공
프록시가 뭔가요?
프록시(Proxy) 란 클라이언트와 서버 사이 중개자 역할을 수행하는 서버입니다. 다양한 이유로 프록시 서버를 사용하는데 주 목적은 캐시와 보안성인데요. 중개를 하는 서버이다 보니 네트워크 관리자가 최종 목적지를 숨기고 싶거나 필터링하려는 시도를 통해 보안성을 확보할 수 있습니다. 프록시는 2가지 방식으로 존재합니다.
- Forward Proxy : 내부 네트워크 내 클라이언트에서 외부 웹 서비스의 접근을 내부 프록시 서버를 통해 접근하는 방식
- 캐시 저장: 프록시 서버에 캐시를 저장해서 동일 웹 서비스를 접근 시 속도가 빨라짐
- URL 필터링: 내부 네트워크의 클라이언트가 외부 웹 서비스에 직접 접근하는 것을 막기 위함
- Reverse Proxy : 외부 클라이언트에서 내부 웹 서비스의 접근을 프록시 서버를 통해 접근하는 방식
- 캐시 저장
- 로드 밸런싱: 동일한 기능을 수행하는 서버를 여러개 구축하여 부하를 분산시킬 수 있음
- 보안 강화: 내부 네트워크의 실제 웹 서비스의 정보들을 감출 수 있어 보안성 강화 효과가 있음
Nginx Proxy Manager 는 Forward 나 Reverse 방식 모두 사용 가능하나 주로 Reverse Proxy 를 위해 사용합니다. 만일 해당 프록시를 사용하지 않고 외부에서 내부 웹 서비스를 접근하려 하면 아래 그림과 같이 URL에 포트를 통해 접근해야 합니다. 이 방식은 내부에 웹 서비스가 많을수록 관련된 포트들을 붙어줘야 하므로 불편하며 최근 브라우저에서는 특정 포트에 대해 ERR_UNSAFE_PORT 에러를 발생시켜 접근을 차단하기 때문에 사용이 불가능할 수 있습니다.
설치 방법은?
먼저 라우터에서 443 포트를 Nginx Proxy Manager 가 구축된 서버의 443 포트로 포워딩 설정을 하셔야 합니다. 그 이후 서버에 접속하여 docker 로 설치 및 운영이 가능합니다.
docker command
$ docker run -d \
--name=nginx-proxy-manager \
-p 80:80 \
-p 81:81 \
-p 443:443 \
-v ./data:/data \
-v ./letsencrypt:/etc/letsencrypt \
jc21/nginx-proxy-manager:latest
docker-compose
다음은 docker-compose.yml 에 대한 내용입니다.
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- 80 포트: HTTP 패킷에 대해 proxy 할 포트입니다.
- 81 포트: Nginx Proxy Manager 관리 페이지 접속을 위한 포트입니다.
- 443 포트: HTTPS 패킷에 대해 proxy 할 포트입니다.
- streams 기능을 사용하게 되면 설정한 포트 또한 추가해야 합니다.
- data 디렉토리에는 관리 페이지에서 설정했던 모든 정보들을 관리합니다.
- letsencrypt 디렉토리에는 Let's Encrypt SSL 인증서의 정보들을 관리합니다.
docker-compose.yml 이 존재하는 디렉토리로 이동하신 후 다음 명령으로 컨테이너를 생성 및 실행합니다.
$ sudo docker-compose up -d
접속 및 관리는?
접속
브라우저를 통해 설치한 서버의 ip 와 포트번호 81 을 사용하여 접속하시면 됩니다.
http://[SERVER_IP]:81
다음과 같이 로그인 창이 나오는데 최초 로그인할 계정은 다음과 같습니다.
admin@example.com
changeme
이후 관리 페이지의 관리자 계정 정보를 갱신하게 되고 그 이후부터 설정들을 진행할 수 있습니다.
프록시 추가
Hosts -> Proxy Hosts 로 접근하여 프록시 설정을 추가 및 관리할 수 있습니다.
Add Proxy Host 버튼을 클릭하면 신규 proxy host 설정을 입력할 수 있는데 Details 탭에서 각 항목은 다음과 같습니다.
- Domain Names: 외부에서 접속할 도메인명
- Scheme: 내부 웹 서비스 프로토콜(http or https)
- Forward Hostname / IP: 내부 웹 서비스 IP나 호스트 이름
- Forward Port: 내부 웹 서비스 포트
- Cache Assets: 정적 콘텐츠 캐싱 기능을 활성화
- Block Common Exploits: 프로젝트에서 제공하는 공격 패턴 차단 기능
- Websopckets Support: 웹소켓 기능 활성화
SSL 탭에서 각 항목은 다음과 같습니다.
- SSL Certificate: 해당 프록시에 사용한 인증서 선택, 새로 만드려면 Requests a new SSL Certificate 로 선택
- Force SSL: HTTP 프로토콜(80 포트) 로 접근해도 HTTPS 프로토콜(443 포트) 로 접근시키도록 하는 기능
- HTTP/2 Support: HTTP/2 프로토콜 사용, 기존 HTTP 표준을 확장한 프토콜이며 성능이 개선된 방식
- HSTS Enabled: HTTP Strict Transport Security, 웹 서비스를 보안 연결을 통해서만 접속되도록 강제하는 정책
- HSTS Subdomains: HSTS 정책을 모든 하위 도메인에도 적용시키기 위함, 보통은 이미 서브도메인으로 새 프록시를 생성하는 것이므로 비활성화
- Use a DNS Challenge: Let's Encrypt SSL 인증서를 발급받기 위한 방식 중 하나로 도메인 소유권을 검증하기 위해 HTTP 챌린지를 사용함, 해당 옵션은 DNS 설정을 건드릴 수 있다면 적용하는 방식을 추천함
모든 과정을 완료하고 Save 하면 해당 도메인을 브라우저로 통해 접근 가능합니다.
Reference
'인프라' 카테고리의 다른 글
[인프라 / Docker] MongoDB (with Replica-Set) (0) | 2024.01.08 |
---|---|
[인프라 / Docker] 나만의 전자 도서관 Calibre-Web (1) | 2024.01.04 |
[인프라 / VPN] Tailscale 유사 Site-to-Site 설정(Subnet Router) (1) | 2024.01.03 |
[인프라 / VPN] Tailscale 설명 및 간단 사용 방법 (1) | 2024.01.01 |
[인프라 / Docker] WireGuard VPN (1) | 2023.12.30 |