Sign In

Proxmox에 Nginx Proxy Manager(NPM) 설치 가이드

공인IP가 연결된 Proxmox 환경에서 LXC 컨테이너로 NPM을 설치하고 포트포워딩까지 설정하는 전체 과정을 정리합니다.

목차

전체 구조 이해

인터넷 ↓ 공인IP (Proxmox 호스트, vmbr0) ↓ iptables DNAT (80, 443) NPM LXC 컨테이너 (10.0.0.2) ↓ 리버스 프록시 ┌─────────────────────────────────────┐ VM1 (10.0.0.10) VM2 (10.0.0.11) VM3 (10.0.0.12)
Proxmox 호스트: 공인IP 보유, iptables로 포트포워딩 담당
NPM LXC: 모든 웹 트래픽의 진입점, 도메인 기반 라우팅 및 SSL 관리
VM들: 실제 서비스 운영

LXC 컨테이너 생성

템플릿 다운로드

Proxmox GUI에서 템플릿이 없을 경우 먼저 다운로드해야 합니다.
GUI 방법:
Datacenter → 노드(pve) → local 스토리지 → CT Templates 탭 → Templates 버튼 → Debian/Ubuntu 선택 → Download
CLI 방법:
pveam update pveam available pveam download local debian-12-standard_12.7-1_amd64.tar.zst pveam list local

컨테이너 생성 설정값

항목
권장값
OS
Debian 12 (권장) 또는 Ubuntu 22.04
CPU
1 core
RAM
512MB
Disk
8GB
Network
vmbr0, Static IP

네트워크 설정

IPv4/CIDR: 10.0.0.2/24 ← /24 필수! Gateway: 10.0.0.1
⚠️ CIDR 서브넷 마스크(/24)를 반드시 입력해야 합니다. 없으면 네트워크 통신이 안 됩니다.

LXC 기본 로그인

ID: root PW: 컨테이너 생성 시 설정한 비밀번호
접속 방법:
# Proxmox GUI: 컨테이너 선택 → Console 클릭 # Proxmox 호스트에서: pct enter 100 # 100은 컨테이너 ID # SSH: ssh root@10.0.0.2

Docker 및 NPM 설치

Docker 설치

apt update && apt install docker.io docker-compose -y

NPM docker-compose.yml 작성

mkdir ~/npm && cd ~/npm nano docker-compose.yml
version: '3' services: npm: image: jc21/nginx-proxy-manager:latest ports: - "80:80" - "443:443" - "81:81" volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt

NPM 실행

docker-compose up -d docker ps # 실행 확인

NPM 초기 로그인

URL: http://10.0.0.2:81 Email: admin@example.com Password: changeme
⚠️ 로그인 후 즉시 비밀번호를 변경하세요!

Proxmox iptables 포트포워딩 설정

/etc/network/interfaces 수정

nano /etc/network/interfaces
auto vmbr0 iface vmbr0 inet static address 공인IP/24 gateway 게이트웨이IP bridge-ports eno1 bridge-stp off bridge-fd 0 # IP 포워딩 활성화 post-up echo 1 > /proc/sys/net/ipv4/ip_forward # NPM으로 포워딩 (80, 443) post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.0.0.2:80 post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 10.0.0.2:443 post-up iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 10.0.0.2:80 post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to 10.0.0.2:443 post-down iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o vmbr0 -j MASQUERADE
⚠️ 81번 포트(관리자 페이지)는 보안상 외부에 열지 않는 것을 권장합니다.
내부에서만 http://10.0.0.2:81 로 접속하세요.

IP 포워딩 영구 활성화

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # 네트워크 재시작 ifreload -a

규칙 확인

iptables -t nat -L -n -v cat /proc/sys/net/ipv4/ip_forward # 1이면 OK

iptables 규칙 영구 저장

/etc/network/interfaces에 없는 규칙이 재부팅 후에도 살아있다면 iptables-persistent가 저장한 규칙 때문입니다.
# 저장된 규칙 확인 cat /etc/iptables/rules.v4 # 불필요한 규칙 삭제 iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 잘못된IP:80 # 현재 상태를 파일에 저장 (덮어쓰기) netfilter-persistent save # 최종 확인 iptables -t nat -L -n -v | grep 80

NPM SSL 인증서 발급

전제 조건

Let's Encrypt는 HTTP Challenge 방식으로 도메인 인증을 합니다.
외부에서 80포트로 접근 가능해야 합니다.
체크리스트:
DNS에서 도메인이 공인IP를 가리키는지 확인
Proxmox iptables에서 80포트가 NPM(10.0.0.2)으로 포워딩되는지 확인
공인IP의 80포트가 ISP나 방화벽에서 차단되지 않는지 확인
# DNS 확인 nslookup 도메인명 # 외부 접근 테스트 (다른 기기에서) curl http://도메인명

NPM에서 Proxy Host 추가

1.
NPM GUI → Proxy Hosts → Add Proxy Host
2.
Domain Names: 사용할 도메인 입력
3.
Scheme: http / Forward Hostname: 백엔드 VM IP / Port: 서비스 포트
4.
SSL 탭 → Let's Encrypt 선택 → 이메일 입력 → Save

트러블슈팅

LXC 템플릿이 없는 경우

Datacenter → Storage → local → Content에 "CT Templates" 체크 확인

SSL 인증서 발급 실패 (Some challenges have failed)

80포트 포워딩 규칙 확인: iptables -t nat -L -n -v | grep 80
DNS 전파 확인: nslookup 도메인
일단 SSL 없이 먼저 Proxy Host 등록 후 테스트

iptables 규칙이 재부팅 후 초기화되는 경우

netfilter-persistent save

iptables 규칙이 재부팅 후 중복 추가되는 경우

# 저장된 규칙 파일 직접 확인 및 수정 cat /etc/iptables/rules.v4 netfilter-persistent save # 현재 상태로 덮어쓰기

80포트가 엉뚱한 VM으로 포워딩되는 경우

iptables는 위에서부터 순서대로 적용됩니다. 먼저 등록된 규칙이 우선입니다.
# 잘못된 규칙 삭제 iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80 -j DNAT --to 잘못된IP:80 # 저장 netfilter-persistent save

최종 구조 요약

외부 접속: http(s)://도메인 ↓ Proxmox 공인IP (iptables: 80, 443 → 10.0.0.2) ↓ NPM LXC (10.0.0.2) - SSL 관리, 도메인 라우팅 ↓ 각 VM 서비스들 (10.0.0.x) NPM 관리자: http://10.0.0.2:81 (내부에서만 접속)