yeonghoon.kim

  • 게시판
  • 갤러리

OpenVPN 구축

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

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 4119
공지 현금, 저축, 투자, 지출, 예산, 보험 내역(2024-05-30) 김영훈 2024.03.10 3752
37 [바이브코딩 - 클로드] kospiAlarm 작업 메모 김영훈 2025.10.29 109
36 infra-base 기본 서버 설정 메모 김영훈 2026.01.20 171
35 임시 파킹 페이지 김영훈 2026.01.20 308
34 monitoring 설정 김영훈 2026.01.23 130
33 ollama-chatbot 테스트 메모 김영훈 2026.01.27 355
» OpenVPN 구축 김영훈 2026.01.28 143
31 GitLab CI/CD 테스트 김영훈 2026.01.28 216
30 Traefik 설정 김영훈 2026.01.28 353
29 openclaw 구축 작업 노트 [2] 김영훈 2026.02.01 341
28 smtp-relay 설정 김영훈 2026.02.06 195
27 WAF honeypot 설정 김영훈 2026.02.07 104
26 OpenClaw cron regression 대응 김영훈 2026.02.08 186
25 DGX Ollama 구축 김영훈 2026.02.11 183
24 원격 LLM 챗봇 테스트 김영훈 2026.02.11 140
23 Docker Ollama 트러블슈팅 김영훈 2026.02.11 128
22 GPU 모니터링 대시보드 구축 김영훈 2026.02.11 150
21 DGX Spark LLM 벤치마크 김영훈 2026.02.11 132
20 LLM 모델 선정 김영훈 2026.02.12 141
19 OpenClaw 모델 삭제 사고 김영훈 2026.02.13 114
18 ARM Kubernetes 구축 2 - VM 생성과 클러스터 설치 김영훈 2026.02.14 138
쓰기 태그
 첫 페이지 7 8 9 10 11 12 13 14 15 16 끝 페이지