웹사이트 검색

Ubuntu 14.04의 Docker 컨테이너에서 OpenVPN을 실행하는 방법


소개

이 자습서에서는 Docker를 설정하고 실행하는 방법을 설명합니다.

OpenVPN은 TLS(evolution of SSL) 암호화를 사용하여 VPN(가상 사설망)을 생성하는 방법을 제공합니다. OpenVPN은 도청 및 중간자(MITM) 공격으로부터 네트워크 트래픽을 보호합니다. 개인 네트워크는 안전하지 않은 WiFi 네트워크에서 실행되는 랩톱 또는 휴대폰과 같은 장치를 원격 서버에 안전하게 연결한 다음 트래픽을 인터넷으로 릴레이하는 데 사용할 수 있습니다. 개인 네트워크를 사용하여 인터넷을 통해 장치를 서로 안전하게 연결할 수도 있습니다.

Docker는 보다 쉽게 관리할 수 있도록 OpenVPN 서버 프로세스 및 구성 데이터를 캡슐화하는 방법을 제공합니다. Docker OpenVPN 이미지는 사전 구축되었으며 온전하고 안정적인 환경에서 서버를 실행하는 데 필요한 모든 종속성을 포함합니다. 표준 사용 사례를 상당히 자동화하기 위해 스크립트가 포함되어 있지만 원하는 경우 여전히 전체 수동 구성을 허용합니다. Docker 볼륨 컨테이너는 구성 및 EasyRSA PKI 인증서 데이터도 보관하는 데 사용됩니다.

신뢰할 수 있는 빌드. 코드가 GitHub 리포지토리에서 업데이트되면 새 Docker 이미지가 빌드되고 Docker Registry에 게시됩니다.

사용 사례 예

  • 신뢰할 수 없는 공용(WiFi) 네트워크에 있을 때 인터넷에 안전하게 라우팅
  • 모바일 노트북, 사무실 컴퓨터, 가정용 PC 또는 휴대폰을 연결하기 위한 사설 네트워크
  • NAT 순회 기능이 없는 NAT 라우터 뒤에 있는 보안 서비스를 위한 개인 네트워크

목표

  • Ubuntu 14.04 LTS에서 Docker 데몬 설정
  • 구성 데이터를 보관할 Docker 볼륨 컨테이너 설정
  • EasyRSA PKI 인증 기관(CA) 생성
  • 자동 생성된 클라이언트 구성 파일 추출
  • 선택한 수의 OpenVPN 클라이언트 구성
  • 부팅 시 Docker 컨테이너 시작 처리
  • 고급 주제 소개

전제 조건

  • Linux 쉘 지식. 이 가이드는 주로 사용자가 전통적인 의미에서 Linux 데몬을 설정하고 실행할 수 있다고 가정합니다.
  • 원격 서버의 루트 액세스
    • 이 튜토리얼에서는 Ubuntu 14.04를 실행하는 DigitalOcean 1 CPU/512MB RAM Droplet을 가정합니다. Docker를 사용하면 모든 호스트 Linux 배포판에서 이미지를 쉽게 실행할 수 있습니다.
    • 호스트가 QEMU/KVM 또는 Xen 가상화 기술을 실행하는 한 모든 가상 호스트가 작동합니다. OpenVZ가 작동하지 않습니다
    • 서버에 대한 루트 액세스 권한이 필요합니다. 이 가이드에서는 사용자가 sudo가 활성화된 권한 없는 사용자로 실행 중이라고 가정합니다. 필요한 경우 Ubuntu 14.04의 사용자 관리에 대한 Digital Ocean 자습서 검토

    1단계 — Docker 설정 및 테스트

    Docker는 빠르게 움직이고 있으며 Ubuntu의 장기 지원(LTS) 정책은 따라가지 못하고 있습니다. 이 문제를 해결하기 위해 최신 버전의 Docker를 제공하는 PPA를 설치합니다.

    업스트림 Docker 리포지토리 패키지 서명 키를 추가합니다. apt-key 명령은 sudo를 통해 상승된 권한을 사용하므로 사용자 비밀번호에 대한 비밀번호 프롬프트가 나타날 수 있습니다.

    curl -L https://get.docker.com/gpg | sudo apt-key add -
    

    참고: 필요한 경우 깜박이는 커서에 sudo 암호를 입력하십시오.

    업스트림 Docker 리포지토리를 시스템 목록에 추가합니다.

    echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list
    

    패키지 목록을 업데이트하고 Docker 패키지를 설치합니다.

    sudo apt-get update && sudo apt-get install -y lxc-docker
    

    사용자를 docker 그룹에 추가하여 일반 사용자로 Docker 데몬과 통신할 수 있도록 합니다. 여기서 sammy는 사용자 이름입니다. 새 그룹을 적용하려면 종료하고 다시 로그인하십시오.

    sudo usermod -aG docker sammy
    

    재로그인 후 id 명령을 사용하여 그룹 구성원을 확인합니다. 예상 응답에는 다음 예와 같이 docker가 포함되어야 합니다.

    uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)
    

    선택 사항: 간단한 Debian Docker 이미지에서 bash를 실행하여 Docker를 확인합니다(--rm는 종료 후 컨테이너를 정리하고 -it는 대화형). 호스트에서 작업:

    docker run --rm -it debian:jessie bash -l
    

    도커가 이미지를 가져오고 컨테이너를 설정할 때 예상되는 응답:

    Unable to find image 'debian:jessie' locally
    debian:jessie: The image you are pulling has been verified
    511136ea3c5a: Pull complete
    36fd425d7d8a: Pull complete
    aaabd2b41e22: Pull complete
    Status: Downloaded newer image for debian:jessie
    root@de8ffd8f82f6:/#
    

    컨테이너 내부에 있으면 현재 셸이 Docker 컨테이너에 있음을 나타내는 root@:/# 프롬프트가 표시됩니다. 호스트와 다른지 확인하려면 컨테이너에서 실행 중인 Debian 버전을 확인하십시오.

    cat /etc/issue.net
    

    작성 당시 OpenVPN 컨테이너에 대한 예상 응답:

    Debian GNU/Linux jessie/sid
    

    다른 버전의 데비안이 보이면 괜찮습니다.

    logout을 입력하여 컨테이너를 종료하면 호스트의 프롬프트가 다시 나타납니다.

    2단계 - EasyRSA PKI 인증서 저장소 설정

    이 단계는 일반적으로 OpenVPN 또는 PKI를 사용하는 모든 서비스에 익숙한 사용자에게는 골칫거리입니다. 다행스럽게도 Docker와 Docker 이미지의 스크립트는 구성 파일과 필요한 모든 인증서 파일을 생성하여 이 단계를 단순화합니다.

    볼륨 컨테이너를 생성합니다. 이 튜토리얼에서는 $OVPN_DATA 환경 변수를 사용하여 복사-붙여넣기를 쉽게 만듭니다. 이것을 원하는대로 설정하십시오. 기본 ovpn-data 값은 단일 OpenVPN Docker 컨테이너 서버에 권장됩니다. 셸에서 변수를 설정하면 문자열 대체를 활용하여 자습서의 각 단계에서 사용자가 수동으로 변수를 바꾸지 않아도 됩니다.

    OVPN_DATA="ovpn-data"
    

    busybox를 최소 Docker 이미지로 사용하여 빈 Docker 볼륨 컨테이너를 만듭니다.

    docker run --name $OVPN_DATA -v /etc/openvpn busybox
    

    구성 파일과 인증서를 보관할 $OVPN_DATA 컨테이너를 초기화하고 vpn.example.com을 다음으로 바꿉니다. 귀하의 FQDN. vpn.example.com 값은 서버와 통신하는 데 사용하는 정규화된 도메인 이름이어야 합니다. 이것은 DNS 설정이 이미 구성되어 있다고 가정합니다. 또는 서버의 IP 주소만 사용할 수도 있지만 권장하지는 않습니다.

    docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com:1194
    

    EasyRSA PKI 인증 기관을 생성합니다. CA 개인 키에 대한 암호를 입력하라는 메시지가 표시됩니다. 좋은 것을 선택하고 기억하십시오. 암호가 없으면 클라이언트 인증서를 발급하고 서명하는 것이 불가능합니다.

    docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki
    

    $OVPN_DATA 컨테이너의 보안은 중요합니다. 여기에는 서버를 가장하기 위한 모든 개인 키와 모든 클라이언트 인증서가 포함되어 있습니다. 이를 염두에 두고 적절하게 액세스를 제어하십시오. 기본 OpenVPN 스크립트는 CA 키에 암호를 사용하여 보안을 강화하고 가짜 인증서 발급을 방지합니다.

    인증서 저장소를 백업하는 방법에 대한 자세한 내용은 아래 결론을 참조하십시오.

    3단계 - OpenVPN 서버 실행

    OpenVPN 서버 프로세스를 실행하는 Docker 컨테이너를 자동 시작하려면(nano 또는 vim을 사용하여 초기화 파일 시작하기 참조:

    sudo vim /etc/init/docker-openvpn.conf
    

    /etc/init/docker-openvpn.conf에 넣을 내용:

    description "Docker container for OpenVPN server"
    start on filesystem and started docker
    stop on runlevel [!2345]
    respawn
    script
      exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
    end script
    

    Upstart 초기화 메커니즘을 사용하여 프로세스를 시작합니다.

    sudo start docker-openvpn
    

    STATUS 열을 확인하여 컨테이너가 시작되었고 즉시 충돌하지 않았는지 확인합니다.

    test0@tutorial0:~$ docker ps
    CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
    c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf
    

    4단계 - 클라이언트 인증서 및 구성 파일 생성

    이 섹션에서는 마지막 단계에서 만든 PKI CA를 사용하여 클라이언트 인증서를 만듭니다.

    CLIENTNAME을 적절하게 바꾸십시오(FQDN일 필요는 없음). 클라이언트 이름은 OpenVPN 클라이언트가 실행 중인 시스템을 식별하는 데 사용됩니다(예: "home-laptop\, "work-laptop\, "nexus5\ 등).

    easyrsa 도구는 CA 암호를 묻는 메시지를 표시합니다. 이것은 ovpn_initpki 명령 중에 위에서 설정한 암호입니다. 클라이언트 인증서를 만듭니다.

    docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
    

    각 클라이언트가 생성되면 서버는 연결을 수락할 준비가 됩니다.

    클라이언트는 연결할 인증서와 구성 파일이 필요합니다. 포함된 스크립트는 이 작업을 자동화하고 사용자가 클라이언트로 전송할 수 있는 단일 파일에 구성을 작성할 수 있도록 합니다. 다시 CLIENTNAME를 적절하게 바꿉니다.

    docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn
    

    결과 CLIENTNAME.ovpn 파일에는 VPN에 연결하는 데 필요한 개인 키와 인증서가 포함되어 있습니다. 이러한 파일을 안전하게 보관하고 주변에 두지 마십시오. *.ovpn 파일을 사용할 클라이언트로 안전하게 전송해야 합니다. 보안 문제로 인해 파일을 전송할 때 가능하면 이메일 또는 클라우드 스토리지와 같은 공공 서비스를 사용하지 마십시오.

    권장되는 전송 방법은 가능한 경우 ssh/scp, HTTPS, USB 및 microSD 카드입니다.

    5단계 - OpenVPN 클라이언트 설정

    다음은 위에서 구성한 OpenVPN 서버에 연결할 클라이언트에서 실행되는 명령 또는 작업입니다.

    기본 OpenVPN을 통한 Ubuntu 및 Debian 배포

    Ubuntu 12.04/14.04 및 Debian wheezy/jessie 클라이언트(및 유사):

    OpenVPN 설치:

    sudo apt-get install openvpn
    

    서버에서 클라이언트 구성 파일을 복사하고 보안 권한을 설정합니다.

    sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
    

    /etc/openvpn/*.conf와 일치하는 모든 구성을 자동 시작하도록 초기화 스크립트를 구성합니다.

    echo AUTOSTART=all | sudo tee -a /etc/default/openvpn
    

    OpenVPN 클라이언트의 서버 프로세스를 다시 시작합니다.

    sudo /etc/init.d/openvpn restart
    

    네이티브 OpenVPN을 통한 아치 리눅스

    OpenVPN 설치:

    pacman -Sy openvpn
    

    서버에서 클라이언트 구성 파일을 복사하고 보안 권한을 설정합니다.

    sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
    

    OpenVPN 클라이언트의 서버 프로세스 시작:

    systemctl start openvpn@CLIENTNAME
    

    선택 사항: 부팅 시 /etc/openvpn/CLIENTNAME.conf를 시작하도록 systemd를 구성합니다.

    systemctl enable openvpn@CLIENTNAME
    

    TunnelBlick을 통한 MacOS X

    TunnelBlick을 다운로드하고 설치합니다.

    CLIENTNAME.ovpn을 서버에서 Mac으로 복사합니다.

    앞에서 복사한 *.ovpn 파일을 두 번 클릭하여 구성을 가져옵니다. TunnelBlick이 호출되고 구성을 가져옵니다.

    TunnelBlick을 열고 구성을 선택한 다음 연결을 선택합니다.

    OpenVPN 연결을 통한 Android

    Google Play 스토어에서 OpenVPN Connect 앱을 설치하세요.

    안전한 방식으로 CLIENTNAME.ovpn을 서버에서 Android 장치로 복사합니다. USB 또는 microSD 카드가 더 안전합니다. 파일을 여는 데 도움이 되도록 SD 카드에 저장합니다.

    구성 가져오기: 메뉴 -> 가져오기 -> SD 카드에서 프로필 가져오기

    연결을 선택합니다.

    6단계 - 작동 확인

    트래픽이 VPN을 통해 라우팅되고 있는지 확인하는 몇 가지 방법이 있습니다.

    웹 브라우저

    외부 IP 주소를 확인하려면 웹 사이트를 방문하십시오. 외부 IP 주소는 OpenVPN 서버의 주소여야 합니다.

    icanhazip.com을 시도하십시오.

    명령줄

    명령줄에서 wget 또는 curl이 유용합니다. curl의 예:

    curl icanhazip.com
    

    wget의 예:

    wget -qO - icanhazip.com
    

    예상 응답은 OpenVPN 서버의 IP 주소여야 합니다.

    또 다른 옵션은 host 또는 dig를 사용하여 이 목적을 위해 특별히 구성된 DNS 서버에 대한 특수 DNS 조회를 수행하는 것입니다. 호스트를 사용하는 예:

    host -t A myip.opendns.com resolver1.opendns.com
    

    dig의 예:

    dig +short myip.opendns.com @resolver1.opendns.com
    

    예상 응답은 OpenVPN 서버의 IP 주소여야 합니다.

    확인해야 할 추가 사항

    네트워크 인터페이스 구성을 검토하십시오. Unix 기반 운영 체제에서는 터미널에서 ifconfig를 실행하고 연결되었을 때 OpenVPN의 tunX 인터페이스를 찾는 것처럼 간단합니다.

    로그를 검토합니다. Unix 시스템에서 이전 배포판의 /var/log 또는 시스템 배포판의 journalctl을 확인하십시오.

    결론

    이를 실행하기 위해 빌드된 Docker 이미지는 오픈 소스이며 여기에 설명된 것보다 훨씬 더 많은 기능을 수행할 수 있습니다.

    docker-openvpn 소스 리포지토리는 코드 검토 및 수정을 위한 포크에 사용할 수 있습니다. 일반 기능 또는 버그 수정에 대한 풀 요청을 환영합니다.

    백업 및 정적 클라이언트 IP와 같은 고급 주제는 docker-openvpn/docs 폴더에서 설명합니다.

    docker-openvpn 문제 추적기에 버그를 보고하세요.