
Docker IPsec VPN Server — Updated!
Docker 기반 IPsec VPN 서버로 IPsec/L2TP, Cisco IPsec 및 IKEv2를 지원하며, 자동 자격 증명 생성 및 다중 플랫폼 클라이언트 구성을 제공합니다.
English | 简体中文 | 繁體中文 | Русский
Docker 기반 IPsec VPN 서버
IPsec/L2TP, Cisco IPsec 및 IKEv2를 지원하는 IPsec VPN 서버를 실행하기 위한 Docker 이미지입니다.
Libreswan(IPsec VPN 소프트웨어) 및 xl2tpd(L2TP 데몬)과 함께 Alpine 3.23 또는 Debian 12 기반입니다.
IPsec VPN은 네트워크 트래픽을 암호화하여, 사용자와 VPN 서버 사이의 누구도 인터넷을 통해 이동하는 데이터를 도청할 수 없도록 합니다. 이는 커피숍, 공항 또는 호텔 객실과 같은 보안되지 않은 네트워크를 사용할 때 특히 유용합니다.
기능:
- 첫 시작 시 VPN 자격 증명 및 IKEv2 구성을 자동 생성
- 강력하고 빠른 암호화(AES-GCM 등)를 지원하는 IKEv2 지원
- iOS, macOS 및 Android 기기를 자동 구성하는 VPN 프로필 생성
- Windows, macOS, iOS, Android, Chrome OS 및 Linux를 VPN 클라이언트로 지원
- IKEv2 사용자 및 인증서 관리를 위한 헬퍼 스크립트 포함
- GitHub Actions를 통해 자동 빌드 및 게시
- Docker 볼륨을 통한 영구 데이터 저장
- 다중 아키텍처:
linux/amd64,linux/arm64,linux/arm/v7
추가 제공:
- VPN: Docker 없는 IPsec, WireGuard, OpenVPN, Headscale
- AI: 로컬 LLM, 채팅, RAG, 음성 및 AI 도구를 위한 셀프 호스팅 AI 스택
- 📚 도서: The Self-Hosted AI Builder’s Guide, AI 시대의 개인정보 보호 도구
빠른 시작
다음 명령을 사용하여 Docker에서 IPsec VPN 서버를 설정하세요:```bash
docker run
--name ipsec-vpn-server
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
VPN 로그인 정보는 무작위로 생성됩니다. [VPN 로그인 정보 확인](#retrieve-vpn-login-details)을 참조하세요.
또는 [Docker 없이 IPsec VPN 설정](https://github.com/hwdsl2/setup-ipsec-vpn)을 할 수도 있습니다. 이 이미지 사용 방법에 대해 자세히 알아보려면 아래 섹션을 읽어보세요.
## 커뮤니티
- 📬 [프로젝트 업데이트 구독](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn) (월 1–2회 이메일) — 무료 VPN 및 AI 배포 가이드(PDF) 받기
- 💬 [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) 커뮤니티에 참여하여 토론하세요
- ⭐ 유용하다고 생각되면 저장소에 별표를 눌러주세요 — 다른 사람들이 발견하는 데 도움이 됩니다
## 요구 사항
- 공용 IP 주소 또는 DNS 이름이 있는 Linux 서버
- Docker 설치
- 방화벽에서 VPN 포트 개방 (UDP 500 및 4500)
- [Podman](https://docs.podman.io)을 사용하여 `docker`에 대한 별칭을 만든 후 이 이미지를 실행할 수도 있습니다
**참고:** 고급 사용자는 [Docker for Mac](https://docs.docker.com/desktop/setup/install/mac-install/)과 함께 macOS에서 이 이미지를 사용할 수 있습니다. IPsec/L2TP 모드를 사용하기 전에 `docker restart ipsec-vpn-server` 명령으로 컨테이너를 한 번 재시작해야 할 수 있습니다. 이 이미지는 Docker for Windows를 지원하지 않습니다.
## 다운로드
[Docker Hub 레지스트리](https://hub.docker.com/r/hwdsl2/ipsec-vpn-server/)에서 신뢰할 수 있는 빌드를 받으세요:```bash
docker pull hwdsl2/ipsec-vpn-server
또는 Quay.io에서 다운로드할 수 있습니다:```bash docker pull quay.io/hwdsl2/ipsec-vpn-server docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
지원 플랫폼: `linux/amd64`, `linux/arm64` 및 `linux/arm/v7`.
고급 사용자는 GitHub에서 [소스 코드로 빌드](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#build-from-source-code)할 수 있습니다.
### 이미지 비교
사전 빌드된 두 가지 이미지를 사용할 수 있습니다. 기본 Alpine 기반 이미지는 약 19MB에 불과합니다.
| | Alpine 기반 | Debian 기반 |
| ----------------- | ------------------------ | ------------------------------ |
| 이미지 이름 | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| 압축 크기 | ~ 19 MB | ~ 62 MB |
| 기본 이미지 | Alpine Linux 3.23 | Debian Linux 12 |
| 플랫폼 | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Libreswan 버전 | 5.4 | 5.4 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
**참고:** Debian 기반 이미지를 사용하려면 이 README의 모든 `hwdsl2/ipsec-vpn-server`를 `hwdsl2/ipsec-vpn-server:debian`으로 바꾸세요. 이 이미지는 현재 Synology NAS 시스템과 호환되지 않습니다.
<details>
<summary>
이전 Libreswan 버전 4를 사용하고 싶습니다.
</summary>
일반적으로 이 프로젝트의 기본 버전인 최신 [Libreswan](https://libreswan.org/) 버전 5를 사용하는 것이 좋습니다. 그러나 이전 Libreswan 버전 4를 사용하려면 소스 코드에서 Docker 이미지를 빌드할 수 있습니다:```bash
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server
cd docker-ipsec-vpn-server
# Specify Libreswan version 4
sed -i 's/SWAN_VER=5\..*/SWAN_VER=4.15/' Dockerfile Dockerfile.debian
# To build Alpine-based image
docker build -t hwdsl2/ipsec-vpn-server .
# To build Debian-based image
docker build -f Dockerfile.debian -t hwdsl2/ipsec-vpn-server:debian .
이 이미지를 사용하는 방법
환경 변수
참고: 이 이미지의 모든 변수는 선택 사항이므로, 어떤 변수도 입력할 필요 없이 바로 IPsec VPN 서버를 사용할 수 있습니다! 그러려면 touch vpn.env 명령으로 빈 env 파일을 생성하고, 다음 섹션으로 건너뛰세요.
이 Docker 이미지는 env 파일에 선언할 수 있는 다음 변수들을 사용합니다 (예시 참조):```
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
이렇게 하면 VPN 로그인용 사용자 계정이 생성되며, 여러 기기에서 사용할 수 있습니다[\*](#important-notes). IPsec PSK(사전 공유 키)는 `VPN_IPSEC_PSK` 환경 변수로 지정됩니다. VPN 사용자 이름은 `VPN_USER`에 정의되고, VPN 비밀번호는 `VPN_PASSWORD`로 지정됩니다.
추가 VPN 사용자도 지원되며, 필요에 따라 `env` 파일에 다음과 같이 선언할 수 있습니다. 사용자 이름과 비밀번호는 공백으로 구분해야 하며, 사용자 이름은 중복될 수 없습니다. 모든 VPN 사용자는 동일한 IPsec PSK를 공유합니다.```
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
위 변수들은 IPsec/L2TP 및 IPsec/XAuth("Cisco IPsec") 모드에만 해당됩니다. IKEv2의 경우 IKEv2 VPN 구성 및 사용을 참조하세요.
참고: env 파일에서 값 주위에 "" 또는 ''를 넣지 말고, = 주위에 공백을 추가하지 마세요. 값 내에서 다음 특수 문자를 사용하지 마세요: \ " '. 안전한 IPsec PSK는 최소 20개의 임의 문자로 구성되어야 합니다.
참고: Docker 컨테이너가 이미 생성된 후 env 파일을 수정하는 경우, 변경 사항을 적용하려면 컨테이너를 제거하고 다시 생성해야 합니다. Docker 이미지 업데이트를 참조하세요.
추가 환경 변수
고급 사용자는 선택적으로 DNS 이름, 클라이언트 이름 및/또는 사용자 지정 DNS 서버를 지정할 수 있습니다.
DNS 이름, 클라이언트 이름 및/또는 사용자 지정 DNS 서버를 지정하는 방법을 알아보세요.
고급 사용자는 선택적으로 IKEv2 서버 주소에 대한 DNS 이름을 지정할 수 있습니다. DNS 이름은 정규화된 도메인 이름(FQDN)이어야 합니다. 예:``` VPN_DNS_NAME=vpn.example.com
첫 번째 IKEv2 클라이언트의 이름을 지정할 수 있습니다. `-`와 `_`를 제외한 특수 문자 없이 한 단어만 사용하세요. 지정하지 않으면 기본값은 `vpnclient`입니다.```
VPN_CLIENT_NAME=your_client_name
기본적으로 클라이언트는 VPN이 활성화된 상태에서 Google Public DNS를 사용하도록 설정됩니다. 모든 VPN 모드에 대해 사용자 지정 DNS 서버를 지정할 수 있습니다. 예시:``` VPN_DNS_SRV1=1.1.1.1 VPN_DNS_SRV2=1.0.0.1
자세한 내용과 인기 있는 공용 DNS 제공업체 목록은 [대체 DNS 서버 사용](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md)을 참조하세요.
기본적으로 IKEv2 클라이언트 구성을 가져올 때 비밀번호는 필요하지 않습니다. 임의의 비밀번호를 사용하여 클라이언트 구성 파일을 보호하도록 선택할 수 있습니다.```
VPN_PROTECT_CONFIG=yes
참고: 위 변수들은 IKEv2 모드에서는 효과가 없습니다. Docker 컨테이너에 IKEv2가 이미 설정되어 있는 경우입니다. 이 경우 IKEv2를 제거하고 사용자 지정 옵션을 사용하여 다시 설정할 수 있습니다. IKEv2 VPN 구성 및 사용을 참조하세요.
IPsec VPN 서버 시작
이 이미지에서 새 Docker 컨테이너를 생성합니다 (./vpn.env를 자신의 env 파일로 바꾸세요):```bash
docker run
--name ipsec-vpn-server
--env-file ./vpn.env
--restart=always
-v ikev2-vpn-data:/etc/ipsec.d
-v /lib/modules:/lib/modules:ro
-p 500:500/udp
-p 4500:4500/udp
-d --privileged
hwdsl2/ipsec-vpn-server
이 명령에서는 `docker run`의 `-v` 옵션을 사용하여 `ikev2-vpn-data`라는 새 [Docker 볼륨](https://docs.docker.com/storage/volumes/)을 생성하고, 이를 컨테이너의 `/etc/ipsec.d`에 마운트합니다. 인증서와 키 같은 IKEv2 관련 데이터는 볼륨에 유지되며, 나중에 Docker 컨테이너를 다시 생성해야 할 때 동일한 볼륨을 다시 지정하기만 하면 됩니다.
이 이미지를 사용할 때는 IKEv2를 활성화하는 것이 좋습니다. 그러나 IKEv2를 활성화하지 않고 IPsec/L2TP 및 IPsec/XAuth("Cisco IPsec") 모드만 사용하여 VPN에 연결하려면 위 `docker run` 명령에서 첫 번째 `-v` 옵션을 제거하세요.
**참고:** 고급 사용자는 [권한 모드 없이 실행](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#run-without-privileged-mode)할 수도 있습니다.
### VPN 로그인 정보 가져오기
위 `docker run` 명령에서 `env` 파일을 지정하지 않았다면 `VPN_USER`는 기본적으로 `vpnuser`로 설정되고, `VPN_IPSEC_PSK`와 `VPN_PASSWORD`는 무작위로 생성됩니다. 이를 확인하려면 컨테이너 로그를 확인하세요:```bash
docker logs ipsec-vpn-server
출력에서 다음 줄을 검색하세요:``` Connect to your new VPN with these details:
Server IP: your_vpn_server_ip IPsec PSK: your_ipsec_pre_shared_key Username: your_vpn_username Password: your_vpn_password
출력에는 IKEv2 모드가 활성화된 경우 해당 모드에 대한 세부 정보도 포함됩니다.
(선택 사항) 생성된 VPN 로그인 세부 정보(있는 경우)를 현재 디렉터리에 백업합니다:```bash
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
docker-compose 사용하기```bash
cp vpn.env.example vpn.env
Edit vpn.env if needed, then:
docker compose up -d docker logs ipsec-vpn-server
Example `docker-compose.yml` (이미 포함됨):```yaml
volumes:
ikev2-vpn-data:
services:
vpn:
image: hwdsl2/ipsec-vpn-server
restart: always
env_file:
- ./vpn.env
ports:
- "500:500/udp"
- "4500:4500/udp"
privileged: true
hostname: ipsec-vpn-server
container_name: ipsec-vpn-server
volumes:
- ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro
다음 단계
다른 언어로 읽기: English, 简体中文, 繁體中文, Русский.
컴퓨터나 기기에서 VPN을 사용하세요. 다음을 참조하십시오:
IPsec/XAuth ("Cisco IPsec") VPN 클라이언트 구성
나만의 VPN을 즐기세요! ✨🎉🚀✨
중요 참고 사항
Windows 사용자: IPsec/L2TP 모드의 경우, VPN 서버 또는 클라이언트가 NAT(예: 홈 라우터) 뒤에 있으면 일회성 레지스트리 변경이 필요합니다.
동일한 VPN 계정을 여러 기기에서 사용할 수 있습니다. 그러나 IPsec/L2TP의 제한으로 인해 동일한 NAT(예: 홈 라우터) 뒤에서 여러 기기를 연결하려면 IKEv2 또는 IPsec/XAuth 모드를 사용해야 합니다.
VPN 사용자 계정을 추가, 편집 또는 제거하려면 먼저 env 파일을 업데이트한 다음, 다음 섹션의 지침에 따라 Docker 컨테이너를 제거하고 다시 생성해야 합니다. 고급 사용자는 env 파일을 바인드 마운트할 수 있습니다.
외부 방화벽(예: EC2/GCE)이 있는 서버의 경우 VPN용 UDP 포트 500 및 4500을 여십시오. Aliyun 사용자는 #433을 참조하십시오.
클라이언트는 VPN이 활성화된 동안 Google Public DNS를 사용하도록 설정됩니다. 다른 DNS 제공업체를 선호하는 경우 이 섹션을 읽으십시오.
Docker 이미지 업데이트
Docker 이미지와 컨테이너를 업데이트하려면 먼저 최신 버전을 다운로드하십시오:```bash docker pull hwdsl2/ipsec-vpn-server
Docker 이미지가 이미 최신 상태라면, 다음과 같은 출력이 표시됩니다:```
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
그렇지 않으면 최신 버전을 다운로드합니다. Docker 컨테이너를 업데이트하려면 먼저 VPN 로그인 정보를 확인하세요. 그런 다음 docker rm -f ipsec-vpn-server 명령으로 Docker 컨테이너를 제거합니다. 마지막으로 이 이미지 사용 방법의 지침에 따라 다시 생성합니다.
IKEv2 VPN 구성 및 사용
IKEv2 모드는 IPsec/L2TP 및 IPsec/XAuth("Cisco IPsec")보다 개선된 기능을 제공하며, IPsec PSK, 사용자 이름 또는 비밀번호가 필요하지 않습니다. 자세한 내용은 여기에서 확인하세요.
먼저 컨테이너 로그를 확인하여 IKEv2에 대한 세부 정보를 확인합니다.```bash docker logs ipsec-vpn-server
**참고:** IKEv2 세부 정보를 찾을 수 없다면 컨테이너에서 IKEv2가 활성화되지 않았을 수 있습니다. [Docker 이미지 업데이트](#update-docker-image) 섹션의 지침을 사용하여 Docker 이미지와 컨테이너를 업데이트해 보세요.
IKEv2 설정 중에 IKEv2 클라이언트(기본 이름 `vpnclient`)가 생성되며, 해당 구성은 **컨테이너 내부**의 `/etc/ipsec.d`로 내보내집니다. 구성 파일을 Docker 호스트로 복사하려면:```bash
# Check contents of /etc/ipsec.d in the container
docker exec -it ipsec-vpn-server ls -l /etc/ipsec.d
# Example: Copy a client config file from the container
# to the current directory on the Docker host
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ./
다음 단계: 기기 구성을 통해 IKEv2 VPN을 사용하세요.
IKEv2 클라이언트를 관리하는 방법을 알아보세요.
헬퍼 스크립트를 사용하여 IKEv2 클라이언트를 관리할 수 있습니다. 아래 예시를 참조하세요. 클라이언트 옵션을 사용자 지정하려면 인수 없이 스크립트를 실행하세요.```bash
Add a new client (using default options)
docker exec -it ipsec-vpn-server ikev2.sh --addclient [client name]
Export configuration for an existing client
docker exec -it ipsec-vpn-server ikev2.sh --exportclient [client name]
List existing clients
docker exec -it ipsec-vpn-server ikev2.sh --listclients
Show usage
docker exec -it ipsec-vpn-server ikev2.sh -h
**참고:** "executable file not found" 오류가 발생하면 위의 `ikev2.sh`를 `/opt/src/ikev2.sh`로 바꾸세요.
</details>
<details>
<summary>
IKEv2 서버 주소를 변경하는 방법 알아보기.
</summary>
특정 상황에서는 IKEv2 서버 주소를 변경해야 할 수 있습니다. 예를 들어 DNS 이름을 사용하도록 전환하거나 서버 IP가 변경된 경우입니다. IKEv2 서버 주소를 변경하려면 먼저 [컨테이너 내부에서 bash 셸을 열고](https://gitlab.com/hwdsl2/docker-ipsec-vpn-server/-/blob/master/docs/advanced-usage.md#bash-shell-inside-container), 그런 다음 [이 지침을 따르세요](https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/ikev2-howto.md#change-ikev2-server-address). Docker 컨테이너를 다시 시작할 때까지 컨테이너 로그에 새 IKEv2 서버 주소가 표시되지 않습니다.
</details>
<details>
<summary>
IKEv2를 제거하고 사용자 지정 옵션으로 다시 설정하기.
</summary>
특정 상황에서는 IKEv2를 제거하고 사용자 지정 옵션으로 다시 설정해야 할 수 있습니다.
**경고:** 인증서와 키를 포함한 모든 IKEv2 구성이 **영구적으로 삭제**됩니다. 이 작업은 **되돌릴 수 없습니다**!
**옵션 1:** 도우미 스크립트를 사용하여 IKEv2를 제거하고 다시 설정합니다.
참고: 이렇게 하면 `env` 파일에 지정한 변수(예: `VPN_DNS_NAME` 및 `VPN_CLIENT_NAME`)가 재정의되며, 컨테이너 로그에 IKEv2에 대한 최신 정보가 더 이상 표시되지 않습니다.```bash
# Remove IKEv2 and delete all IKEv2 configuration
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# Set up IKEv2 again using custom options
docker exec -it ipsec-vpn-server ikev2.sh
옵션 2: ikev2-vpn-data를 제거하고 컨테이너를 다시 생성합니다.
- 모든 VPN 로그인 정보를 기록해 두세요.
- Docker 컨테이너를 제거합니다:
docker rm -f ipsec-vpn-server. ikev2-vpn-data볼륨을 제거합니다:docker volume rm ikev2-vpn-data.env파일을 업데이트하고VPN_DNS_NAME및VPN_CLIENT_NAME과 같은 사용자 지정 IKEv2 옵션을 추가한 다음 컨테이너를 다시 생성합니다. 이 이미지를 사용하는 방법을 참조하세요.
고급 사용법
고급 사용법을 참조하세요.
- 대체 DNS 서버 사용
- 권한 모드 없이 실행
- VPN 모드 선택
- IKEv2 완전 순방향 비밀성 활성화
- Docker 호스트의 다른 컨테이너에 액세스
- VPN 서버의 공용 IP 지정
- VPN 클라이언트에 고정 IP 할당
- VPN 서브넷 사용자 지정
- IPv6 지원
- 분할 터널링
- 호스트 네트워크 모드 정보
- Libreswan 로그 활성화
- 서버 상태 확인
- 소스 코드에서 빌드
- 컨테이너 내부의 Bash 셸
- env 파일 바인드 마운트
- Google BBR 혼잡 제어 배포
기술 세부 사항
두 개의 서비스가 실행 중입니다: IPsec VPN용 Libreswan (pluto)와 L2TP 지원용 xl2tpd.
기본 IPsec 구성은 다음을 지원합니다:
- PSK를 사용한 IPsec/L2TP
- PSK 및 XAuth를 사용한 IKEv1 ("Cisco IPsec")
- IKEv2
필요한 포트: 500/udp 및 4500/udp (IPsec)
라이선스
참고: 사전 빌드된 이미지 내부의 소프트웨어 구성 요소(예: Libreswan 및 xl2tpd)는 각 저작권 보유자가 선택한 해당 라이선스에 따릅니다. 사전 빌드된 이미지 사용과 관련하여, 이 이미지의 사용이 포함된 모든 소프트웨어에 대한 관련 라이선스를 준수하는지 확인하는 것은 이미지 사용자의 책임입니다.
Copyright (C) 2016-2026 Lin Song 
Thomas Sarlandie의 작업 기반 (Copyright 2012)

이 저작물은 Creative Commons Attribution-ShareAlike 3.0 Unported License에 따라 라이선스가 부여됩니다.
저작자 표시 필요: 파생 작업에 제 이름을 포함하고 개선 사항을 알려주세요!