0015-openvpn
단순 OpenVPN 구축.
외부에서 내부 서비스 접근하려고 만든 것.
docker-compose.yml
services:
openvpn:
image: ${VPN_IMAGE:-kylemanna/openvpn}
container_name: openvpn
cap_add:
- NET_ADMIN
ports:
- "${VPN_PORT:-51194}:1194/udp"
volumes:
- openvpn_data:/etc/openvpn
environment:
- TZ=Asia/Seoul
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: ovpn-download
ports:
- "8888:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ../clients:/usr/share/nginx/html:ro
restart: unless-stopped
volumes:
openvpn_data:
openvpn은 UDP 포트로 받고, 설정/인증서 파일은 볼륨에 저장.
nginx는 생성된 ovpn 파일 받는 용도.
init.sh
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
COMPOSE_DIR="$SCRIPT_DIR/../docker"
# .env 파일에서 서버 주소 읽기
if [[ -f "$COMPOSE_DIR/.env" ]]; then
source "$COMPOSE_DIR/.env"
fi
VPN_SERVER_ADDR="${VPN_SERVER_ADDR:?'.env 파일에 VPN_SERVER_ADDR를 설정하세요'}"
# 이미지 결정: .env의 VPN_IMAGE > uname -m 자동 감지
if [[ -z "${VPN_IMAGE:-}" ]]; then
ARCH="$(uname -m)"
if [[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]]; then
VPN_IMAGE="nubacuk/docker-openvpn:aarch64"
else
VPN_IMAGE="kylemanna/openvpn"
fi
echo "==> 아키텍처 자동 감지: ${ARCH} -> ${VPN_IMAGE}"
fi
VOLUME="docker_openvpn_data"
echo "==> OpenVPN 서버 설정 생성 (${VPN_SERVER_ADDR})"
docker run -v "${VOLUME}:/etc/openvpn" --rm "${VPN_IMAGE}" \
ovpn_genconfig -u "udp://${VPN_SERVER_ADDR}:${VPN_PORT:-1194}"
echo "==> PKI 초기화 (CA 인증서 + 서버 키 생성)"
docker run -v "${VOLUME}:/etc/openvpn" --rm \
-e EASYRSA_BATCH=1 \
-e EASYRSA_CA_EXPIRE=3650 \
-e EASYRSA_CERT_EXPIRE=3650 \
"${VPN_IMAGE}" \
ovpn_initpki nopass
echo "==> 초기화 완료. 'docker compose up -d'로 서버를 시작하세요."
init.sh는 서버 설정이랑 PKI 초기화용.
create-client.sh
CLIENT_NAME="${1:?'사용법: create-client.sh <클라이언트이름>'}"
VOLUME="docker_openvpn_data"
OUTPUT_DIR="$SCRIPT_DIR/../clients"
mkdir -p "$OUTPUT_DIR"
echo "==> 클라이언트 인증서 생성: ${CLIENT_NAME}"
docker run -v "${VOLUME}:/etc/openvpn" --rm \
-e EASYRSA_BATCH=1 \
-e EASYRSA_CERT_EXPIRE=3650 \
"${VPN_IMAGE}" \
easyrsa build-client-full "$CLIENT_NAME" nopass
echo "==> .ovpn 프로필 추출"
docker run -v "${VOLUME}:/etc/openvpn" --rm "${VPN_IMAGE}" \
ovpn_getclient "$CLIENT_NAME" > "$OUTPUT_DIR/${CLIENT_NAME}.ovpn"
echo "==> 완료: ${OUTPUT_DIR}/${CLIENT_NAME}.ovpn"
클라이언트별 ovpn 파일 생성.
인증서 유효기간은 10년으로 잡음.
amd64 / arm64 둘 다 대응하려고 이미지 자동 선택도 넣었다.
댓글 0
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
|---|---|---|---|---|
| 공지 | 2025 일본 여행 계획 | 김영훈 | 2024.10.10 | 4119 |
| 공지 | 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) | 김영훈 | 2024.03.10 | 3752 |
| 297 | DGX Spark LLM 벤치마크 | 김영훈 | 2026.02.11 | 132 |
| 296 | GPU 모니터링 대시보드 구축 | 김영훈 | 2026.02.11 | 150 |
| 295 | Docker Ollama 트러블슈팅 | 김영훈 | 2026.02.11 | 128 |
| 294 | 원격 LLM 챗봇 테스트 | 김영훈 | 2026.02.11 | 140 |
| 293 | DGX Ollama 구축 | 김영훈 | 2026.02.11 | 183 |
| 292 | OpenClaw cron regression 대응 | 김영훈 | 2026.02.08 | 186 |
| 291 | WAF honeypot 설정 | 김영훈 | 2026.02.07 | 104 |
| 290 | smtp-relay 설정 | 김영훈 | 2026.02.06 | 195 |
| 289 | openclaw 구축 작업 노트 [2] | 김영훈 | 2026.02.01 | 341 |
| 288 | Traefik 설정 | 김영훈 | 2026.01.28 | 353 |
| 287 | GitLab CI/CD 테스트 | 김영훈 | 2026.01.28 | 216 |
| » | OpenVPN 구축 | 김영훈 | 2026.01.28 | 143 |
| 285 | ollama-chatbot 테스트 메모 | 김영훈 | 2026.01.27 | 355 |
| 284 | monitoring 설정 | 김영훈 | 2026.01.23 | 130 |
| 283 | 임시 파킹 페이지 | 김영훈 | 2026.01.20 | 308 |
| 282 | infra-base 기본 서버 설정 메모 | 김영훈 | 2026.01.20 | 171 |
| 281 | [바이브코딩 - 클로드] kospiAlarm 작업 메모 | 김영훈 | 2025.10.29 | 109 |
| 280 | [바이브코딩 - 클로드] fullstack_template 작업 메모 | 김영훈 | 2025.10.18 | 243 |
| 279 | [바이브코딩 - 클로드] reminder_android 작업 메모 | 김영훈 | 2025.10.17 | 85 |
| 278 | [바이브코딩 - 클로드] bingbingsubway 작업 메모 | 김영훈 | 2025.10.12 | 165 |