1. OpenVPN 개요
- 하나의 udp 또는 tcp 포트를 통해 ip subnet이나 가상의 이더넷을 터널링 할수 있다.
- 안전한 VPN을 위해 openssl이 지원하는 많은 암호화, 인증 기능을 이용할수 있다. 또한 미리 지정된 공유키(pre-shared static key)를 이용하거나 아이디/암호를 이용한 인증 기능도 지원한다.
- 인증이 취약하거나 NAT에서 구현이 어렵고 복잡한 PPTP나 L2TP/IPSec에 비해 OpenVPN은 데몬 형태로 작동하기 때문에 복잡한 커널 패치나 커널 모듈이 필요하지 않으며 설치 방법이 매우 쉽다.
- 리눅스 뿐만 아니라 Solaris, FReeBSD, MacOS X, Windows 2000/XP 등 여러 OS에서 이용할수 있다.
- 모든 패킷이 VPN을 통과함에도 불구하고 시스템에 부하를 유발하지 않으면서 속도가 매우 빠르다.
- 브리지형, NAT형 등 여러 형태를 지원하며 원하는 만큼 여러개의 터널을 생성할수 있다.
- 링크의 대역폭을 제어하기 위해 실시간 압축 및 트래픽세이핑(shaping)을 이용할수 있다.
- OpenVPN은 특별한 보안 취약성이 발견되지 않아 그 자체로 매우 안정적이다.
OpenVPN의 홈페이지는
http://www.openvpn.net 이며, 이 사이트에 접속하여 프로그램을 다운로드 할 수 있다.
2. VPN 서버 설치및 설정
OpenVPN은 상호 망 또는 서버를 연동할 때에 세가지 모드로 인증을 제공한다.
첫번째는 사전에 공유된 키(Pre-shared static key)를 이용한 방법이고, 두번ㅉㅒ는 RSA키를 이용한 SSL/TLS, 세번째는 username/password 를 이용한 방법인데, 첫번째는 사용방법이 단순하다는 장점이 있고, 두번째는 SSL/TLS RSA키를 이용하는 방법(소위 SSL VPN)은 더욱 안전하기는 하지만 설치가 다소 복잡하다는 단점이 있다. 여기에서 첫번째와 두번째 방법에 대해서 알아본다.
공유된 키(Pre-shared static key)를 이용한 방법
1) OpenVPN에서는 TUN 이나 TAP이라는 별도의 드라이버를 통하여 VPN 통신을 하므로 먼저 VPN서버의 커널에서 이 드라이버를 지원하여야 한다.
따라서 커널 메뉴에서 "Network Device support --> <*> Universal TUN/TAP device driver support" 으로 static하게 선택하거나 모듈로 설정되어 있어야 한다.
커널 컴파일을 완료한 후에는 디바이스를 설정하기 위해 아래 명령어를 실행하도록 한다.
# mkdir /dev/net
# mkmod /dev/net/tuc c 10 200
만약 모듈로 선택했으면 이후에 modprobe tun을 실행하면 된다.
2) openvpn을 설치하기 전에 아래의 관련 프로그램을 먼저 설치한다.
* openssl : 암호화에 필요하며 가급적 최신버젼을 설치하는것이 좋은데, rpm으로 설치되어 있어도 관계 없다. 현재 설치되어 있는 openssl 버젼은 아래와 같이 확인할수 있다.
OpenVPN 을 압축 해제한후 역시
# ./configure --enable-password-save; make ; make install
로 설치하면 /usr/local/sbin/openvpn 실행파일이 설치된다.
이후 시작 스크립트는 설치 디렉토리의 sample-scripts/openvpn.init 파일을 참고하고, 설치 파일은 sample-config-files/server.conf 파일을 참고하면 된다
참고로 openvpn은 수시로 버전이 올라가면서 configure의 옵션이 변경되므로 설치전에는 ./configure --help를 먼저 실행해서 도움을 받기 바란다.
openvpn 설치시 공유 라이브러리를 찾을수 없는 에러가 나면 rpm의 경우 소스로, 소스의 경우 rpm으로 openssl을 재 설치해 보기 바란다.
또는 ./configure --with-ssl-headers=/usr/local/ssl/include/openssl/ --with-ssl-lib=/usr/local/ssl/lib와 같이 헤더나 라이브러리 경로를 직적 지정해 주어도 된다
REAME 혹은 INSTALL 파일을 보구 설치하는게 좋을듯
3) VPN 서버 설정 - 아래와 같이 권장
[Openvpn.conf=server.conf]
port 5000
dev tap0
secret static.key (공유키를 사용할 경우)
ifconfig 10.1.0.1 255.255.255.0
keepalive 10 60
comp-lzo
user nobody
group noboy
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 4
openvpn --config openvpn.conf --daemon
이후 netstat 을 실행해보면 아래와 같이 5000/udp에서 프로세스가 리슨하는것을 알수 있다.
에러발생시 openvpn.log 파일을 보고 해결
4) VPN 클라이언트 설치 및 설정 - 아래와 같이 권장
VPN 데몬이 실행되어 리슨하고 있다면 서버쪽 설정은 정상적인 것이므로 이제 Windows PC측에서 VPN 클라이언트 프로그램을 설치할 차례이다. 먼저
http://openvpn.sourceforge.net 에서 Window 프로그램을 다운로드하여 설치한다.
설치후 OPenVPN 메뉴에서 "Add a new TAP virtual ethernet adaper"를 선택한다. 보안창등 설치할 것인지 묻는 창이 나올때 "계속"을 선택하고 '내 네트워크 환경'에서 속성을 보면 아래와 같이 새로운 인터페이스가추가된 것을 확인할수 있다. 초기에는 네트워크가 연결되어 있지 않으며 설정이 완료되면 상태가 '사용함'으로 바뀌게 된다. 만약 한번 더 실행하면 새로운 로컬영역연결 인터페이스가 생기게 된다.
만약 DHCP Client 서비스가 가동중이라면 앞에서 지정한 IP를 자동으로 할당받기 때문에 별도의 설정은 필요없지만 만약 중기된 상태라면 IP를 직접 설정하여야 하는데, 이를 위해 이 TAP-32 인터페이스에서 속성을 선택하여 "[인터넷프로토콜 등록정도]->[다음IP주소사용]"에 IP:10.1.0.2 서브넷 마스크에 255.255.255.0 을 입력한다. 물론 이때 IP는 10.1.0.100 이어도 관계는 없으며 Window에서는 이 IP로 앞에서 정의한 서버의 10.1.0.1과 통신하게 된다.
이후 OpenVPN을 설치한 디렉토리인 "내컴퓨터" -> "C:\Program Fills\OpenVPN\config" 디렉토리내에 있는 config.ovpn 파일을 아래와 같이 설정하도록 한다.
[config.ovpn]
remote 211.47.68.21
port 5000
proto udp
dev tap0
ifconfig 10.1.0.2 255.255.255.0
dev-node "로컬 영역 연결 3"
secret static.key (서버에서 생성한 키와 동일한 키이어야 한다. 만약 키가 다를 경우 클라이언트에서서버로 접속하기 위해 openvpn을 실행하면 중단된다)
ping 10
verb 4
comp-lzo
config> openvpn --config config.ovpn ("로컬 영역 연결 3"이 활성화된다)
클라이언트 10.1.0.2에서 서버 10.1.0.1로 ping 을 날려보고 실제로 암호화 통신이 이루어 지는지 아래와 같이 확인해 본다.
# tcpdump -X port 5000
동시에 tap0 인터페이스에서 패킷을 캡쳐하면 평문이 캡처되는것을 알수 있다. 이는 곧 udp를 통해 전송되는 패킷은 암호화되었지만 아래와 같이 tap0을 통해 전송되는 패킷은 평문으로 전송되는것을 알수 있다.
인증서를 활용한 공개키(PKI-Public Key Infrastructure)를 이용하는 방법
앞에서 살표본 공유키(static key)를 이용하는 방법으로는 별도의 데몬을 띄우지 않는 한 여러 PC에서 동시 접속할 수 없다는 한계가 있었다 따라서 이를 위해서는 지금부터 살표볼 RSA키를 이용한 SSL/TLS(소위 SSL-VPN)을 이용하여야 한다. 이는 가장 안전한 방법으로 알려져 있는데, 여기에서는 openssl을 이용하여 RSA 인증서 및 키를 빌드할 것이다.. 여기에는 .crt 확장자는 인증서(certificate)파일이고, .key 파일은 비밀키(private key)라고 생각하면 된다. 물론 비밀키는 안전하게 보관하여야 하며, 인증서 파일은 자유롭게 공개해도 된다.
먼저 openssl의 설정파일은 기본적으로 /usr/share/ssl/openssl.conf 에 있는데, 이 파일을 열어 아래와 같이 몇가지 설정을 변경해 주도록 한다.
[/usr/share/ssl/openssl.conf]
dir = /usr/share/ssl
certificate = $dir/my-ca.crt
private_key = $dir/private/my-ca.key
이후 현재 디렉토리에서 아래와 같이 실행하여 serial과 index.txt 파일을 생성한다. serial과 index.txt에는 각각 root CA에서 인증한 횟수와 인증한 내용이 기록되는데, 추가로 인증할 때마다 자동으로 갱신된다. 특히 이는 기존에 발급한 인증서를 취소하거나 폐기하고자 할 때 사용된다.
# echo "01" | cat > serial
# touch index.txt
다음으로는 root CA 인증서와 비밀키를 생성할 차례인데, 아래 명령어로 10년 동안 유효한 CA및 비밀키를 생성한다.
# openssl req -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -days 3650
다음은 서버쪽에서 사용할 공개키와 비밀키를 생성하도록 한다.
# openssl req -nodes -new -keyout server.key -out server.csr
그리고 root CA로 서버쪽 인증서에 사인한다. 실행이 완료되면 index.txt 와 serial 정보가 업데이트 된다.
# openssl ca -out server.crt -in server.csr
마찬가지로 클라이언트에서 사용할 키를 생성하도록 한다.
# openssl req -nodes -new -keyout client.key -out client.csr
그리고 root CA로 클라이언트쪽 인증서에 사인한다. 실행이 완료되면 index.txt 와 serial 정보가 업데이트 된다.
# openssl ca -out client.crt -in client.csr
다음으로 암호화 협상 과정에서 필요한 Diffe Hellman 파라이터를 생성한다. 이 파일은 서버쪽에서만 필요하며 생성시 약 2-3분ㅈ 정도 소요될 것이다.
# openssl dhparam -out dh1024.pem 1024
이제 나머지는 그대로 두고 client.crt 와 client.key 그리고 my-ca.key 파일은 클라이언트 PC 로 복사하면 된다.
먼저 서버 쪽 설정을 살표보면, 크게 변한 것은 없는데, 전체 설정에서 변경된 부분만 잠시 살표보자
config 파일은 server.conf 라고 가정한다.
port 5000
proto udp
dev tun0
여기까지는 기존의 설정과 동일하다.
tls-server
SSL/TLS 키 교환시에 서버역할을 할 것이므로 tls-server로 지정한다.
dh key/dh1024.pem
tls-server에서만 정의한다. 현재 디렉토리는 server.conf 파일이 있는 위치를 뜻한다.
ca key/my-ca.crt
CA 파일은 지정한다.
cert key/server.crt
인증서의 공개키를 지정한다.
key key/server.key
비밀키를 지정한다.
ifconfig 10.1.0.1 10.1.0.2
route 10.1.0.0 255.255.255.0
ifconfig-pool 10.1.0.4 10.1.0.251
이는 개별적으로 접속하는 각 PC나 서버에 마치 DHCP 서버처럼 Dynamic 하게 IP주소를 할당 할때 할당할 대역을 지정하는 것인데, 위의 경우 10.1.0.4에서부터 10.1.0.251까지 할당하도록 한 것을 알수 있다.
duplicate-cn
각 클라이언트 유저마다 동일한 인증서 사용을 허가할지 지정
client-to-client
기본적으로 VPN에 연결된 서버와 클라이언트와만 통신할수 있지만 VPN에 접속한 클라이언트끼리도 통신할수 있도록 허용할 것인지 결정
max-clients 100
서버에서 동시에 접속을 받아들일 클라이언트 개수를 지정한다. 별도로 지정하지 않으면 1024가 된다.
나머지는 위에서와 동일하다.
이후 서버에서 아래와 같이 --mode server 를 추가하여 실행하면 된다.
openvpn --config server.conf --daemon --mode server
특별한 에러가 없다면 정상저긍로 동시접속 모드로 가동
마찬가지로 클라이언트에서도 아래와 같이 설정하여 접속하면 앞에서와 달리 동시에 접속해도 기존의 접속이 끊기지 않는다
client
dev tun0
proto udp
remote 211.47.68.21 5000
nobind
ca my-ca. crt (경로에 따라 지정이 달라짐 주의)
cert client.crt
key client.key
comp-lzo
verb 4
dev-node "로컬 영역 연결 3"
이후 각각의 pc에서 아래와 같이 실행하면 된다.
openvpn --config config.ovpn
출처
http://hakkoo.net/zeroboard/zboard.php?id=study&no=285