[Docker] Docker로 Ubuntu에 OpenVPN Server 구축하기 #2 OpenVPN 서버 구성 및 실행

    이전 글

    2023.01.30 - [본업/Docker] - [Docker] Docker로 Ubuntu에 OpenVPN Server 구축하기 #1 Docker 설치

    Prerequisites

    1. OpenVPN의 설정 파일들을 '편하게' 관리하기 위해 이들을 저장할 디렉토리를 생성

    mkdir /home/$USER/openvpn-test

    $USER에는 당연히 사용자 이름을 기입하면 됨.

    참고로 해당 작업은 도커의 볼륨과 연관된 작업이다.

    나는 OpenVPN Server로 동작할 컨테이너와 호스트 머신(서버 OS) 사이에 파일 따위를 손쉽게 조작하고자, bind mount 방식으로 컨테이너에 바인딩 할 것이다.

    다른 바인딩 방식을 사용할 것이라면 알아서 적용ㅇㅇ.

    Docker Volume 관련 공식 문서 : https://docs.docker.com/storage/

     

    Manage data in Docker

     

    docs.docker.com

    2. 생성한 디렉토리를 환경 변수로 등록.

    sudo nano /etc/bash.bashrc
    # OpenVPN config
    export OVPN_DATA=/home/unsuk/openvpn-test

    참고로 위 파일은 모든 사용자에게 적용되는 파일이기 때문에 특정 사용자에게만 환경 변수를 적용 시키려면 다음 경로의 파일을 수정한다.

    /home/$USER/.bashrc

    파일 저장 후 추가한 환경 변수를 적용하기 위해 재부팅 후 확인.

    3. OpenVPN 이미지 다운로드.

    https://github.com/kylemanna/docker-openvpn

     

    GitHub - kylemanna/docker-openvpn: 🔒 OpenVPN server in a Docker container complete with an EasyRSA PKI CA

    🔒 OpenVPN server in a Docker container complete with an EasyRSA PKI CA - GitHub - kylemanna/docker-openvpn: 🔒 OpenVPN server in a Docker container complete with an EasyRSA PKI CA

    github.com

    https://hub.docker.com/r/kylemanna/openvpn

     

    Docker

     

    hub.docker.com

    Docker Hub에 'OpenVPN'으로 검색해보면 여러 이미지들이 조회되지만 위 이미지를 사용한 이유는 다음과 같다.

    • Pull 횟수 10억 이상 : 레퍼런스가 많음
    • MIT License : 무료ㅎㅎ

    다음 명령어를 실행해 이미지를 pull 받는다.

    docker pull kylemanna/openvpn

    Configure OpenVPN server

    Run and initialize image

    docker run --rm -v $OVPN_DATA:/etc/openvpn kylemanna/openvpn ovpn_genconfig -u tcp://www.your.domain:443 -s 10.95.0.0/16

    OpenVPN은 기본적으로 UDP 프로토콜을 사용해 구축되지만, 나는 TCP를 사용했다.

    (서버 PC의 네트워크 환경에 알맞게 포트포워딩은 알아서 하시길)

    여기서 서브넷을 지정할 때 주의해야 한다.

    구축해야 하는 OpenVPN 서버의 요구사항 중, 서브넷 설정의 영향을 가장 많이, 절대적으로 받는 내용이 아래와 같다.

    • 가능한 많은 VPN 클라이언트를 커버할 수 있을 것
    • VPN망에 접속할 클라이언트의 OS에 종속되지 않을 것

    먼저 서버의 리소스를 고려하지 않고 가장 많은 클라이언트를 동일한 망에 접속시키려면 당연히 클래스 A에 해당되는 IP 주소를 사용하면 된다.

    사설 IP 대역 중에서 클래스 A는 (CIDR 표기법 기준)10.0.0.0/8을 사용하면 되며 이론상 255 * 255 * 255 = 16,581,375 개의 호스트를 묶을 수 있다.

    하지만 OpenVPN 자체적으로 서브넷을 16비트 이상 설정할 수 없게 되어있다.

    (즉, 172.16.0.0/12 영역도 사용할 수 없으며 이걸로 이틀 정도를 날렸다)

    따라서 위와 같은 이유로 -s 옵션과 함께 10.95.0.0/16 범위를 서브넷으로 지정했다.

    두 번째 요구사항은 다음 포스팅 내용과 더 밀접하게 적용되기 때문에 여기서 다루지는 않는다.

    Edit server configuration file

    위에서 ovpn_genconfig(generate configuration file) 명령어를 입력하면 OVPN_DATA 위치에 서버 구성 파일이 생성된다.

    해당 파일을 열어서 알맞게 수정해야 한다.

    server 10.95.0.0 255.255.0.0
    verb 3
    key /etc/openvpn/pki/private/www.your.domain.key
    ca /etc/openvpn/pki/ca.crt
    cert /etc/openvpn/pki/issued/www.your.domain.crt
    dh /etc/openvpn/pki/dh.pem
    tls-auth /etc/openvpn/pki/ta.key
    key-direction 0
    keepalive 10 60
    persist-key
    persist-tun
    
    # Client Configuration Directory for Static IP Address
    client-config-dir ccd
    
    proto tcp
    # Rely on Docker to do port mapping, internally always 1194
    port 1194
    dev tun0
    status /etc/openvpn/openvpn-status.log
    
    user nobody
    group nogroup
    comp-lzo no
    
    ### Push Configurations Below
    push "block-outside-dns"
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    push "comp-lzo no"
    
    # Docker Bridge
    push "route 172.17.0.0 255.255.0.0"
    • server 10.95.0.0 255.255.0.0 : 본인이 지정한 서브넷과 맞는지 확인
    • client-config-dir ccd : 향후 고정 IP 주소를 할당하기 위해 입력
    • status /etc/openvpn/openvpn-status.log : 로그 위치 본인이 편한 대로 입력
    • push "route 172.17.0.0 255.255.0.0" : 도커 네트워크와 호스트 머신의 네트워크를 연결하기 위해 입력

    이 외에 본인의 환경에 맞게끔 더 수정해야 할 부분이 있을 수 있다.

    Create CA certification and server key

    1. CA 인증서 생성

    docker run --rm -v $OVPN_DATA:/etc/openvpn -it kylemanna/openvpn ovpn_initpki

    2. CA Key 비밀번호(passphrase) 입력

    3. CA 인증서 이름(common name) 입력

    4. DH 파라미터 생성

    5. 앞서 설정한 CA Key 비밀번호 재입력

    6. 생성된 인증서 파일과 키 파일 확인

    테스트할 때 캡쳐해둔 것인데 192.168.0.245에 본인이 서버 초기화 할 때 입력한 도메인이 표시된다.

    여기까지 OpenVPN 서버 설정 및 준비 끝.

     

    Run OpenVPN server process

    서버 설정을 완료했으니 다음 명령어를 입력하여 도커 이미지로 컨테이너를 실행한다.

    docker run --name CONTAINER_NAME -v $OVPN_DATA:/etc/openvpn -d -p 443:1194/tcp --cap-add=NET_ADMIN --restart=always kylemanna/openvpn

    잘 돌고 있는지 컨테이너 리스트를 확인

    docker ps -a

    아, 참고로 첨 테스트할 때 UDP로 테스트 했기 때문에 포트쪽이 UDP로 나온다.

    아마 TCP로 잘 구동시켰다면 뭐 외부 443 포트에서 컨테이너의 1194 포트로 포워딩 되는 형식으로 나타날 것이다.

    Add routing table

    OpenVPN 서버가 라우팅하는 IP 주소 대역이 10.95.0.0/16이기 때문에 해당 대역으로 들어오는 네트워크 요청에 대해서 특정 End Point가 응답할 수 있도록 트래픽에 대한 라우팅 테이블을 추가해야 한다.

    sudo route add -net 10.95.0.0 netmask 255.255.0.0 gw 172.17.0.2

    여기서 언급한 '특정 End Point'는 당연히 Docker 위에서 돌고 있는 OpenVPN 컨테이너를 의미한다.

     

    이미 도커를 사용중인 사람들 중, 다수의 컨테이너가 돌고 있거나 도커 네트워크의 IP 대역이 172.17.0.0/16이 아닌 다른 대역을 사용하는 사람이 있을수도 있다.

    자신이 돌리고 있는 OpenVPN 컨테이너의 IP 주소를 위 명령어에서 gw 옵션의 파라미터 부분에 적어주면 된다.

     

    다음 포스팅에서는 클라이언트 인증서를 생성하는 부분을 다룰 것이다.

    댓글

    Designed by JB FACTORY