AnNyung Official Homepage Home > White Paper [ Openvpn ]  

HOME
What is AnNyung
Documents
Packages System
White Paper
  . 2.0 Pkg Catalog
  . PHP Guide
  . AnNyung Tuning
  . A.P.M Setting
  . migration to 1.3
  . autoupdate
  . Oracle Ready
  . Quota Doc
  . CheckRootKit
  . Multibyte DNS
  . Sendamil STARTTLS
  . MySQL 4.1 Update
  . Time Server
  . Domain Key
  . VPN with PPTPd
  . VPN with OpenVPN
Download
Update
FAQ
Hardware
RoadMap
Gallery

  Go oops.org
  AnNyung banner 88x31

  AnNyung 1 banner 80x15
  AnNyung 2 banner 80x15
  AnNyung 3 banner 80x15
  AnNyung banner 80x15
  AnNyung banner 80x15



VPN with OpenVPN
  이 문서는 안녕 리눅스에서 OpenVPN 을 이용하여 VPN 을 구축하는 것을 설명한다.  VPN
  을 구성하는데 있어 많이 사용되는 Software 로는 PopTop 의 PPTPD 와 IPSec 을 구현한
  OpenSwan, SSL VPN 의 한 종류인 OpenVPN 등이 있으며, 안녕 리눅스에서는 자료가 많고
  가장 많이 사용하는 PopTop 의 PPTPD 와 OpenVPN 에 대한 자료를 제공한다.

  PopTop 의 PPTPD 는 M$ 의 PPTP 를 유닉스에서 사용할 수 있도록 구현을 한 것으로, 손
  쉽게 사용할 수 있다는 장점이 있다. 이에 대하여는

  http://annyung.oops.org/?m=white&p=pptpd

  를 참고 하도록 한다.

  이 문서에서는 OpenVPN 을 시스템 계정을 통하여 인증을 하는 방식에 대하여 설명을 한
  다. key 를 이용한 인증에 대해서는 다른 문서들에서 많이 언급을 하고 있기 때문에 이
  강좌를 기초로 하여, key 설정 강좌를 보면 인증 방식을 쉽게 전환할 수 있다.

  또한, routing 방식은 다른 문서들에서 쉽게 찾을 수 있기 때문에, 여기서는 bridge 방
  식에 대하여 기술 하도록 한다.


  1. OpenVPN

    OpenVPN 은 SSL VPN 을 구현한다. 보통 SSL VPN 들은 대개 웹브라우저를 이용하는 반
    면에, OpenVPN 은 전용 클라이언트를 사용한다는 점이 조금 틀리다. 또한, 암포화 알
    고리즘으로는 bluefish 를 사용한다.


  2. 키 생성

    OpenVPN 을 운영하기 위해서는 서버키가 필요하다.  안녕 리눅스에서는 키 생성을 쉽
    게 make_ssl_cert 라는 명령을 제공한다.  이 명령을 이용하여 OpenVPN 에서 사용 할
    CA 키와 서버키를 생성하도록 한다.


 Hanterm - make_ssl_cert

 [oops@main dir]$ make_ssl_cert
   ....
 [oops@main dir]$ 


    이 명령을 실행하면, CA 키와 Server 키를 생성을 하게 된다. 처음에는 CA 키를 위한
    정보를 물어보며, 두번째로 Server 키를 위한 정보를 물어본다. CA 키를 위한 입력에
    는 대충 알아서 적어 주면 되며, Server 키를 위한 정보 입력시에, "발급자 이름" 부
    분은 클라이언트에서 VPN 접속할 도메인 이름을 FQDN으로 정확하게 지정해 주어야 한
    다.

    그리고, 암호를 물어보는 부분이 있는데, 그냥 엔터로 넘어가도 상관이 없다.

    키가 생성이 되면 /usr/share/ssl/certs 에 ca.* 과 server.* 이 생성이 된다. 이 파
    일들을 /usr/share/ssl/certs/vpn 이라는 디렉토리를 생성하여 옮겨 놓도록 한다. 다
    음 /usr/share/ssl/certs/vpn 으로 이동을 하여 Diffie hellman 에 사용할 키를 생성
    하도록 한다.


 Hanterm - openssl dhparam -out dh1024.pem 1024

 [oops@main dir]$ openssl dhparam -out dh1024.pem 1024
   ....
 [oops@main dir]$ 


    이 명령을 실행하면 dh1024.pem 이라는 파일이 생성이 된다.


  3. 필요 패키지

    일단, 안녕 리눅스로 OpenVPN 을 이용하여 VPN 서버를 구축하는것은 1.3 부터 공식지
    원을 하며, 다음의 패키지들이 필요하다.

    openvpn
    kernel >= 2.4.34-7
    oops-firewall >= 6.0

    일단 다음의 명령으로 패키지들을 설치하도록 하자.


 Hanterm - pkgadd -u openvpn

 [oops@main dir]$ pkgadd -u openvpn
   openvpn         : 성공
 [oops@main dir]$ 


    현재 안녕 리눅스 1.3 의 기본 커널의 버전은 2.4.34-7 이다. OpenVPN 을 운영하려면
    tun 이라는 커널 모듈이 필요하다. 1.3 릴리즈 시에 커널이 2.4.34-6 으로 배포가 되
    었는데, 2.4.34-6 는 tun 모듈이 포함되어 있지 않기 때문에, pkgkernel 을 이용하여
    2.4.34-7 이상으로 업데이트 해 주어야 한다.


 Hanterm - pkgkernel -i

 [oops@main dir]$ pkgkernel -i
   * 커널 데이터베이스 정보

   kernel          => 42:2.4.34-7
   kernel-PIII     => 42:2.4.34-7
   kernel-PIV      => 42:2.4.34-7
   kernel-bigmem   => 42:2.4.34-7
   kernel-BOOT     => 42:2.4.34-7
   kernel-source   => 42:2.4.34-7

   주의  : pkgkernel -i 커널패키지이름 명령을 이용하면
           지원 가능한 커널 버전을 확인할 수 있습니다

   * 현재 설치되어 있는 커널 정보

   kernel          => 41:2.4.34-6
   kernel-PIV      => 43:2.4.34-6 boot

 [oops@main dir]$ 


    pkgernel -i 명령을 실행하면 현재의 커널 상태가 나온다.  상단은 현재 안녕 리눅스
    에서 제공하는 current kernel 의 버전이며,  하단에는 현재 시스템에 설치되어 있는
    커널의 정보가 출력이 된다.

    커런트 커널이 2.4.34-7 이상이고, 현재 설치된 커널이 2.4.34-7 보다 낮을 경우에는
    pkgkernel 명령을 이용하여 업데이트 한 후에, lilo 를 등록하고 리부팅 하도록 한다.

    위와 같이 커런트 커널의 정보가 2.4.34-6 로 나오고 설치되어 있는 커널이 2.4.34-7
    보다 낮으면 다음의 명령으로 업데이트를 하도록 한다.


 Hanterm - pkgkernel kernel

 [oops@main dir]$ pkgkernel kernel
   pkgkernel kernel
   kernel          : 성공

 [oops@main dir]$ 


    커널의 경우, CPU type 에 따라 여러가지 패키지를 지원을 하니 꼭 pkgkernel 문서를
    참고하여 자신의 시스템에 알맞은 커널을 설치하기 바란다.

    oops-firewall < 6.0 사용자라면, oops-firewall 을 업데이트 해주어야 한다. 안녕에
    서는 oops-firewall 이 중복 패키지로 관리가 되기 때문에 6.0 이상 버전으로 업데이
    트 하려면 기존 버전을 삭제하고 재설치 해 주어야 한다. oops-firewall 을 업데이트
    하면 interface.conf 가 추가가 되니 잘 읽어보고 설정을 해야 한다.


  4. 서버 설정

    안녕 리눅스에서의 OpenVPN 의 설정 파일은 /etc/openvpn/openvpn.conf 를 사용한다.
    PopTop 의 pptpd 가 L2 layer 에 별 설정없이 붙을수 있는 반면 OpenVPN 은 번거로운
    작업이 필요하다. 일단 서버 설정을 하기 전에 route 방식으로 할지 Bridge 방식으로
    할 지를 결정해야 한다. L3 switch 를 control 할 수 없는 환경이라면 고민할 필요없
    이 Bridge 방식 밖에 선택의 여지가 없다. 또한 여기서는 Bridge 방식만을 다룬다.

    다음은 openvpn 을 설치했을때 기본으로 설치되는 설정 파일에서 수정할 부분만을 추
    린 것이다.

    설정하기 전의 서버측 네트워크의 가정은 아래와 같다.

      VPN 서버 IP           : 211.111.111.1
      VPN 서버 네트워크     : 211.111.111.0/27 (255.255.255.224)
               브로트캐스트 : 211.111.111.31

    여기서 사용하지 않는 IP 는 211.111.111.25 ~ 30 까지 5개 라고 한다면,  이 6 개의
    IP 를 VPN 에 사용하도록 할 경우로 가정을 한다.


 Hanterm - cat /etc/openvpn/openvpn.conf

 [oops@main dir]$ cat /etc/openvpn/openvpn.conf
   # VPN 접속할 public ip 를 지정해 준다. VPN 서버의 public IP 를 지정
   local 211.111.111.1
   port 1194
   # 프로토콜은 될 수 있으면 TCP 로 한다. 요즘은 방화벽 환경에서 UDP 가
   # 제어되어 연결이 쉽지 않을 수 있다.
   proto tcp
   dev tap0
   ca /usr/share/ssl/certs/ca/ca.crt
   cert /usr/share/ssl/certs/vpn/server.crt
   key /usr/share/ssl/certs/vpn/server.key
   dh /usr/share/ssl/certs/vpn/dh1024.pem
   plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-pam.so login
   client-cert-not-required
   username-as-common-name

   # P-2-P 에 연결할 IP 를 지정한다. Bridge mode 에서는 서버의 네트워크와
   # 같아야 하며, 사용하지 않는 IP 를 선택해야 한다.
   # 아래 설정의 1/2 번째 값은 서버측 Point 에 할당할 IP 와 서브넷 mask 이며
   # 3,4 번째 값은 클라이언트 Point 에 할당할 블럭의 시작과 끝을 의미한다.
   server-bridge 211.111.111.25 255.255.255.224 211.111.111.26 211.111.111.30

 [oops@main dir]$ 


    위의 설정 사항을 openvpn.conf 에서 찾아서 주석을 해제해 주든지 또는 값을 적절하
    게 변경해 주도록 한다.


  5. Bridge 설정

    안녕의 방화벽인 oops-firewall 에서는 6.0 부터 Bridge 를 지원 한다. 위의 설정만
    으로 접속을 하면, VPN 서버 자체에는 접속이 가능하지만, 동일 subnet 대역에 대해
    서는 접속이 불가능 하기 때문에, bridge 설정이 필요하다.

    설정 자체는 /etc/oops-firewall/에 있는 interface.conf 와 bridge.conf 에서 간단
    하게 할 수 있다.


 Hanterm - cat /etc/oops-firewall/interface.conf

 [oops@main dir]$ cat /etc/oops-firewall/interface.conf

   FIREWALL_WAN = eth0
   ...
   BRIDGE_WANDEV = eth0
   BRIDGE_LOCDEV = tap0

 [oops@main dir]$  cat /etc/oops-firewall/bridge.conf

   BRIDGE_USED = 1
   ...

 [oops@main dir]$ 



  6. 데몬 구동

    구동 순서에 대하여 좀 신경을 써야 한다.  일단, 순서로는 openvpn 이 구동된 후에,
    oops-firewall 이 구동이 되어야 한다. (bridge 설정 때문..)

    부팅시에는 당연히 위의 순서대로 되게끔 패키징이 되어 있으며 운영 중에는 openvpn
    을 재시작 해 준 후에 방화벽을 또 구동을 해야 하는 불편함을 위해서 다음의 설정을
    추가를 해 주도록 한다.


 Hanterm - /etc/openvpn/service-startup

 [oops@main dir]$ cat /etc/openvpn/service-startup

   # OpenVPN 시작전에 구동될 명령

   echo 1 > /proc/sys/net/ipv4/ip_forward 2> /dev/null

   tap_device="tap0"

   for t in ${tap_device}
   do
       /sbin/ifconfig $t >& /dev/null
       [ $? -ne 0 ] && \
           /usr/sbin/openvpn --mktun --dev $t

       /sbin/ifconfig brg0 >& /dev/null
       [ $? -eq 0 ] && {
           /usr/sbin/brctl show | grep $t >& /dev/null
           [ $? -ne 0 ] && {
               /usr/sbin/brctl addif brg0 $t
               /sbin/ifconfig $t 0.0.0.0
           }
       }
   done

 [oops@main dir]$ 


    만약 /etc/openvpn/service-startup 이 존재하지 않는다면 생성을 해 주도록 한다.


 Hanterm - /etc/openvpn/service-startup

 [oops@main dir]$ cat /etc/openvpn/service-shutdown

   # OpenVPN 종료후에 실행할 명령

   #echo 0 > /proc/sys/net/ipv4/ip_forward 2> /dev/null

 [oops@main dir]$ 


    shutdown script 에 ip_forward 를 끄는 설정이 있다면,  위와 같이 주석처리 하거나
    삭제해야 한다. 만약 파일이 없다면 그냥 신경 끄면 된다.

    oops-firewall 의 경우 /etc/init.d/oops-firewall stop 또는 service oops-firewall
    stop 을 하는 경우에만 oops-firewall 이 bridge interface 를 내리게 된다. 또한 운
    영중 모드에서는 oops-firewall 의 경우 init script 를 사용하는 것 보다는

    oops-firewall -v

    명령을 이용하는 것을 권장한다.  oops-firewall 은 시작 시에 무조건 기존의 룰들을
    모두 초기화 시키기 때문에 새로운 rule 을 반영할 경우에도 restart 과정이 필요 없
    이 oops-firewall 명령을 실행해 주는 것으로 반영이 가능하기 때문이다.

    이 점만 유의 한다면, 운영중에 openvpn 을 재시작 하거나, oops-firewall 을 재시작
    할 때 위의 순서에 대해서 신경을 쓸 필요가 없게 된다.

    이 두 프로그램의 구동은 다음과 같이 한다.


 Hanterm - /etc/openvpn/service-startup

 [oops@main dir]$ /etc/init.d/openvpn {start|stop|restart}
 [oops@main dir]$ /sbin/service openvpn {start|stop|restart}
 [oops@main dir]$ /etc/init.d/oops-firewall {start|right-stop|restart}
 [oops@main dir]$ /sbin/service oops-firewall {start|right-stop|restart}
 [oops@main dir]$ /usr/sbin/oops-firewall -v

 [oops@main dir]$ 


    위의 명령들 중에 편한 것을 골라 사용하면 된다.


  7. 방화벽 설정

    안녕 리눅스는 기본으로 oops-firewall 이 구동이 된다.  /etc/oops-firewall/ 에 있
    는 filter.conf 의 TCP_ALLOWPORT 에 /etc/openvpn/openvpn.conf 에 지정해준 포트를
    추가해 준 후에 방화벽을 재구동 한다. 만약, openvpn 설정 파일에서 프로토콜을 UDP
    로 지정했다면, UDP_ALLOWPORT 에 포트를 설정하도록 한다.


  8. 클라이언트 설정

    OpenVPN 은 전용 클라이언트를 사용한다. Windwos 용은 http://openvpn.se 에서 전용
    클라이언트를 다운로드 할수 있다. OpenVPN 서버의 버전별에 따라 클라이언트도 다르
    니 주의해서 받아야 한다.

    설치 후 (C:\Program Files\OpenVPN 에 설치했다고 가정을 한다.) 서버에서 생성하였
    던 ca.crt 를 C:\Program Files\OpenVPN\config\ca.crt 로 저장을 한다.

    서버키를 저장 했으면, C:\Program Files\OpenVPN\sample-config\client.ovpn 파일을
    C:\Program Files\OpenVPN\config\openvpn.ovpn 으로 복사를 한다.(이 파일의 이름은
    어떻게 만들어도 상관이 없다. 다만 확장자는 ovpn 을 이용해야 GUI 프로그램이 인식
    을 한다.

    다음, openvpn.ovpn 의 내용중에서 다음의 사항을 변경하거나 추가해 주도록 한다.


 Hanterm - openvpn.ovpn

   dev tap
   proto tcp
   remote VPN.SERVER.COM 1194
   ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
   ;cert client.crt
   ;key client.key
   auth-user-pass
 




위로    



 Home > White Paper [ Openvpn ]

Copyright 2017 OOPS Development Organization 
LAST MODIFIED: 2014/02/03