yeonghoon.kim

  • 게시판
  • 갤러리

OpenVPN 구축

김영훈 2026.01.28 00:26 조회 수 : 147

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

  • 비추천 0
이 게시물을
목록

댓글 0

번호 제목 글쓴이 날짜 조회 수
공지 2025 일본 여행 계획 김영훈 2024.10.10 4120
공지 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) 김영훈 2024.03.10 3766
37 [바이브코딩 - 클로드] kospiAlarm 작업 메모 김영훈 2025.10.29 111
36 infra-base 기본 서버 설정 메모 김영훈 2026.01.20 172
35 임시 파킹 페이지 김영훈 2026.01.20 309
34 monitoring 설정 김영훈 2026.01.23 133
33 ollama-chatbot 테스트 메모 김영훈 2026.01.27 357
» OpenVPN 구축 김영훈 2026.01.28 147
31 GitLab CI/CD 테스트 김영훈 2026.01.28 217
30 Traefik 설정 김영훈 2026.01.28 354
29 openclaw 구축 작업 노트 [2] 김영훈 2026.02.01 343
28 smtp-relay 설정 김영훈 2026.02.06 196
27 WAF honeypot 설정 김영훈 2026.02.07 106
26 OpenClaw cron regression 대응 김영훈 2026.02.08 187
25 DGX Ollama 구축 김영훈 2026.02.11 185
24 원격 LLM 챗봇 테스트 김영훈 2026.02.11 142
23 Docker Ollama 트러블슈팅 김영훈 2026.02.11 129
22 GPU 모니터링 대시보드 구축 김영훈 2026.02.11 151
21 DGX Spark LLM 벤치마크 김영훈 2026.02.11 135
20 LLM 모델 선정 김영훈 2026.02.12 142
19 OpenClaw 모델 삭제 사고 김영훈 2026.02.13 116
18 ARM Kubernetes 구축 2 - VM 생성과 클러스터 설치 김영훈 2026.02.14 141
쓰기 태그
 첫 페이지 7 8 9 10 11 12 13 14 15 16 끝 페이지