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
|
|