강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

OpenVPN으로 VPN 구성 및 활용 3편_OpenVPN 설치 및 설정

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

OpenVPN으로 VPN 구성 및 활용 3_OpenVPN 설치 및 설정

 

OpenVPN 설치 및 설정

 

OpenVPN은 상호 망 또는 서버를 연동할 때에 세 가지 모드로 인증을 제공한다.

 

첫 번째는 사전에 공유된 키(Pre-shared static key)를 이용하는 방법이고 두 번째는 RSA 키를 이용한 SSL/TLS, 마지막으로 세 번째는 username/password를 이용한 방법인데, 첫 번째의 방법은 사용 방법이 단순하다는 장점이 있지만 동시 접속이 되지 않으므로 실제로는 거의 실효성이 없고, 두 번째의 SSL/TLS RSA 키를 이용하는 방법(소위 SSL VPN)은 더욱 안전하기는 하지만 설치가 다소 복잡하다는 단점이 있다.

 

여기에서는 먼저 첫 번째의 방법을 알아보고 그 다음에 두 번째, 세 번째의 방법을 알아보도록 하겠다.

 

 

SSL은 통상적으로 전자 결제 등을 할 때 브라우저창의 우측 하단에 뜨는 자물쇠를 생각하게 된다.

 

이를 통해 브라우저와 웹 서버 간에는 Secure Socket Layer라는 별도의 터널을 통해 안전하게 데이터를 교환하게 되는데, SSL/VPN은 웹 접속뿐만 아니라 telnet이나 pop3등 모든 접속에 대해 별도의 터널을 통해 안전하게 데이터 교환을 하게 되는 것이다.

 

 

그리고 OpenVPN을 이용하여 상호 구간을 연동할 때는 앞에서 살펴본 바와 같이 여러 가지 구성으로 활용할 수 있는데, 여기에서는 먼저 아래 그림과 같이 가장 간단한 구조로 IDC등 원격지에 있는 리눅스 서버와 사설 IP를 사용하면서 ADSL 인터넷 공유를 사용하는 Windows PC와의 VPN을 구축해 보도록 하겠다.

 

(물론 공인 IP를 사용하는 PC도 마찬가지이다) 이렇게 구성할 경우 Windows PC와 서버 간에는 별도의 VPN 터널이 구성되므로 이 사이에 오가는 모든 패킷은 암호화하게 된다.

 

 

물론 이 구조에서 공유기 대신 리눅스를 사용하고, 이 리눅스가 VPN 게이트웨이 역할을 한다면 일일이 PC에서 별도의 프로그램을 설치할 필요 없이 공유기 전체 네트워크에서 특정 서버로의 VPN 접속이 가능할 것이다.

 

여기에서는 편의상 리눅스를 VPN서버, Windows PCVPN 클라이언트라고 생각하자.

 

d9b788a441468cf23f7e98216dbb1a41_1660272165_1666.png
 

[그림] VPN 터널 설정 예

 

(1) VPN 서버 설치 및 설정

 

OpenVPN에서는 TUN이나 TAP이라는 별도의 드라이버를 통하여 VPN 통신을 하므로 먼저 VPN 서버의 커널에서 이 드라이버를 지원하여야 한다.

 

따라서 커널 메뉴에서

“Device Drivers ---> Network device support --->”를 선택한 후 보이는

“<*> Universal TUN/TAP device driver support” static하게 선택하거나 모듈로 설정되어 있어야 한다.

 

커널 2.4.7 이상 버전에서는 이 메뉴가 커널 내에 포함되어 있기 때문에 커널 컴파일시 커널 메뉴에서 선택하기만 하면 되지만 2.2 버전대 커널을 사용한다면(아마 없겠지만) http://vtun.sourceforge.net/tun/에서 다운로드하여 설치하여야 한다.

 

 

커널 컴파일을 완료한 후에는 디바이스를 설정하기 위해 아래 명령어를 실행하도록 한다.

 

 

# mkdir /dev/net

# mknod /dev/net/tun c 10 200

 

만약 모듈로 선택했으면 이후에 modprobe tun을 실행하면 된다.

 

 

 

이후 OpenVPN을 설치하기 전에 아래의 관련 프로그램을 먼저 설치하도록 한다.

 

만약 rpm으로 설치를 원할 경우에는 http://rpmfind.net/ 에서 검색 후 설치하면 된다.

 

 

 

* OpenSSL : 암호화에 필요하며 가급적 최신버전을 설치하는 것이 좋은데, rpm으로 설치 되어 있어도 관계없다.

 

현재 설치되어 있는 openssl 버전은 아래와 같이 확 인할 수 있다.

 

 

# openssl version

OpenSSL 0.9.7a Feb 19 2003

 

홈페이지 : http://www.openssl.org/

 

* lzo : 실시간 압축 라이브러리이다.

 

홈페이지 : http://www.oberhumer.com/opensource/lzo/

설치는 각각

./configure; make; make install

을 실행하면 된다.

 

 

관련 프로그램 설치가 끝난 후에는 OpenVPN을 압축해제 한 후 역시

./configure --enable-password-save; make; make install로 설치하면

/usr/local/sbin/openvpn 실행파일이 설치된다.

 

 

여기에서--enable-password-save 옵션은 VPN 인증 시 파일로 id/pw를 저장하여 인증하고자 할 때 사용된다.

 

 

이후 시작 스크립트는 설치 디렉토리의 sample-scripts/openvpn.init 파일을 참고하고, 설정 파일은 sample-config-files/server.conf 파일을 참고하면 되는데, 아래에서 구체적인 설정 방법을 알아보도록 하겠다.

 

참고로 openvpn은 수시로 버전이 올라가면서 configure의 옵션이 변경되므로 설치 전에는 ./configure --help를 먼저 실행해 보아 확인하기 바란다.

 

 

만약 OpenVPN 설치나 실행시 libssl.so.*libcrypto.so.*등 공유 라이브러리를 찾을 수 없다는 에러가 나면 rpm의 경우 소스로, 소스의 경우 rpm으로 openssl을 재 설치해 보기 바란다.

 

 

또는 ./configure --with-ssl-headers=/usr/local/ssl/include/openssl/--with-ssl-lib=/

usr/local/ssl/lib/와 같이 ssl의 헤더나 라이브러리 경로를 직접 지정해 주어도 된다.

 

 

실제 openvpn을 구동 시에는 실행파일과 설정파일등 몇 개의 파일만 있으면 되므로 별도의 디렉토리를 만들어 실행파일과 설정파일을 두면 된다.

 

 

 

 

설치가 끝난 후에는 앞에서 언급한대로 상호 암호화에 사용할 공유키를 생성하여야 하는데, 아래의 명령어를 실행하면 현재 디렉토리에 static.key 파일이 생성된다.

 

 

이는 하나의 키를 클라이언트와 서버가 공유하는 방식으로, 이 키를 이용하여 클라이언트와 서버가 상호 인증을 하게 되는 것이다.

 

따라서 만약 이 키 파일이 인증된 사용자가 아닌 외부에 다른 사용자에게 노출될 경우 VPN에 접근할 수 있게 되므로 인증된 내부 사용자 외에는 노출하지 않도록 주의하여야 할 것이다.

 

 

# openvpn --genkey --secret static.key

 

이때 생성된 static.key 키 파일은 아래와 같이 보이게 될 것이다.

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272184_4478.png
 

[그림] static.key 파일 예

 

OpenVPN을 실행하면 많은 옵션을 제공하는데, 이 옵션은 실행 시 옵션으로 지정해도 되지만 설정파일에서 지정하는 것이 간편하고 좋다.

 

많은 옵션 중에서 꼭 필요한 옵션만 설정해서 실행하여 보도록 하자. 다음은 openvpn.conf 파일의 설정항목들을 설명한 것이다.

 

 

[openvpn.conf 설정파일]

 

port 5000

OpenVPN 1.x 는 기본적으로 5000/udp를 사용하여 패킷을 전달한다.

 

다른 임의의 포트를

사용해도 되지만 특별한 이유가 없다면 그대로 사용하도록 한다.

 

OpenVPN은 최근에 IANA로부터 1194/udp 번을 할당받았는데, OpenVPN 1.2.x에서는 1194를 사용하도록 하지만 어떤 포트를 사용해도 관계는 없다.

 

참고로 Checkpoint등의 상용 VPN 솔루션은 VPN Key Exchange500/udp를 사용한다.

 

 

 

proto udp

tcp를 사용할 것인지 udp를 사용할 것인지 정한다.

 

tcp를 사용하면 복잡한 문제가 있으므로 반드시 기본값인 udp를 사용한다.

 

 

dev tap0

OpenVPN 상호간에 통신하기 위해 tun 또는 tap 인터페이스를 사용할 수 있는데, 이때 사용할 인터페이스를 지정한다.

 

tunvirtual point-to-point IP 링크방식으로 routed IP 터널을 생성하고, tapvirtual ethernet adapter 방식으로 ethernet 터널을 생성한다.

 

브리지 방식의 경우 tap을 사용하여야 하지만 NAT나 지금과 같은 단일 서버방식에서는 어떤 방식을 사용해도 무방하다.

 

, VPN 구간에는 같은 디바이스를 사용하여야 한다는 것만 주의하면 되는데, 브리징의 경우 broadcasting이 가능하여 원격지에서도 사내망의 Netbios등을 사용할 수 있으며 IPV4IPV6, IPX등도 지원되는 반면 tun의 경우 IPV4만 지원하지만 설정방법이 단순하다는 장점이 있다.

 

여기에서는 tap을 사용하기로 한다.

 

 

secret static.key

앞에서 생성한 키 파일을 지정한다.

 

다시 설명하지만 지금 설정하는 부분은 vpn 서버와 클라이언트간에 상호 인증을 하기 위한 방법으로 사전에 공유된 키를 이용하는 것인데, 이 부분이 바로 그 파일을 지정하는 부분이다.

 

앞에서도 언급하였지만 이 방법은 동시에 한명의 연결만을 허용하므로 일반적인 환경에서는 실효성이 없으므로 참고만 하기 바란다.

 

 

 

ifconfig 10.1.0.1 255.255.255.0

가상 네트워크 디바이스가 사용할 IP를 지정한다.

 

tap0에 이 IP가 할당되어 원격지 PC와 통신할 수 있게 된다.

 

 

물론 원격지 PCIP10.1.0.0/24 대역이 할당 될 것이다.

 

 

 

keepalive 10 60

 

 

상호간에 망이 살아있는지 체크하기 위해 사용되는데, 10초마다 ping을 발송하여 60초 동안 응답이 없으면 원격지의 네트워크가 다운된 것으로 파악하여 restart한다.

 

이 값은 각자의 네트워크 환경에 따라 적절히 설정한다.

 

 

 

comp-lzo

압축 알고리즘을 사용하도록 한다.

 

서버 쪽에서 이 설정을 할 경우 클라이언트에도 동일하 게 설정하도록 한다.

 

 

user nobody

group nobody

persist-key

persist-tun

 

 

httpd와 같이 초기화가 된 후에는 openvpn 데몬이 nobody 권한으로 작동하도록 한다.

 

이때 만약 openvpnrestart할 경우 접근할 필요가 없는 다른 자원에는 접근하지 않도록 persist 옵션도 함께 지정해 주도록 한다.

 

 

 

status openvpn-status.log

 

해당 인터페이스를 통해 읽거나 쓴 트래픽 량 등의 통계값을 저장하도록 한다.

 

 

log openvpn.log

log-append openvpn.log

 

 

openvpn을 가동하거나 작동시의 이벤트를 로그파일에 저장하도록 한다.

 

문제해결이나 debug등을 하고자 할 때 유용하다.

 

 

 

verb 4

 

 

로그 파일의 수준을 정의한다.

 

0은 치명적인 문제 외에는 로그에 남기지 않으며 통상적으로 4정도가 적당하다.

 

56은 통신상의 문제를 해결하는데 유용하며, 9는 매우 많은 로그가 남게 된다.

 

 

 

, 이제 이렇게 해서 서버 쪽의 설정이 끝났는데, 정상 가동여부 확인은 아래와 같이 openvpn 데몬을 실행해 보면 된다.

 

 

 

./openvpn --config openvpn.conf --daemon

 

이후 netstat을 실행해 보면 아래와 같이 5000/udp에서 프로세스가 리슨하는 것을 알 수 있다.

 

 

 

udp 0 0 0.0.0.0:5000 0.0.0.0:* 2058/openvpn

 

정상적으로 시작한 후에 openvpn.log 파일을 보면 아래와 같은 것을 알 수 있다.

 

Thu Oct 14 16:56:07 us=275651 Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication

Thu Oct 14 16:56:07 us=275711 LZO compression initialized

Thu Oct 14 16:56:07 us=275986 TUN/TAP device tap0 opened

Thu Oct 14 16:56:07 us=276041 TUN/TAP TX queue length set to 100

Thu Oct 14 16:56:07 us=276108 /sbin/ifconfig tap0 10.1.0.1 netmask 255.255.255.0 mtu 1500 broadcast 10.1.0.255

Thu Oct 14 16:56:07 us=282045 Data Channel MTU parms [ L:1577 D:1450 EF:45 EB:19 ET:32 EL:0 ]

Thu Oct 14 16:56:07 us=282219 Local Options String: 'V4,dev-type tap,link-mtu 1577,tun-mtu 1532,proto UDPv4,ifconfig 10.1.0.0 255.255.255.0,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,secret'

Thu Oct 14 16:56:07 us=282254 Expected Remote Options String: 'V4,dev-type tap,link-mtu 1577,tun-mtu 1532,proto UDPv4,ifconfig 10.1.0.0 255.255.255.0,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,secret'

Thu Oct 14 16:56:07 us=282344 Local Options hash (VER=V4): '4b02695e'

Thu Oct 14 16:56:07 us=282402 Expected Remote Options hash (VER=V4): '4b02695e'

Thu Oct 14 16:56:07 us=285295 GID set to nobody

Thu Oct 14 16:56:07 us=285508 UID set to nobody

Thu Oct 14 16:56:07 us=285576 Socket Buffers: R=[106496->131072] S=[106496->131072]

Thu Oct 14 16:56:07 us=285579 UDPv4 link local (bound): [undef]:5000

Thu Oct 14 16:56:07 us=285683 UDPv4 link remote: [undef]

Thu Oct 14 16:56:09 us=309234 Peer Connection Initiated with 211.219.171.167:5000

Thu Oct 14 16:56:09 us=309331 Initialization Sequence Completed

 

만약 에러가 발생할 경우에는 openvpn 프로세스가 작동하지 않으며 에러내용이 출력되므로 에러 메시지를 보고 문제를 해결하면 된다.

 

 

 

 

참고로 openvpn.log 파일을 보면 아래와 같이 암호화되고 있다는 것을 알 수 있다.

 

 

 

Tue Oct 19 16:21:56 us=14776 Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key

Tue Oct 19 16:21:56 us=14878 Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication

Tue Oct 19 16:21:56 us=15088 Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key

Tue Oct 19 16:21:56 us=15131 Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication

 

그러나 설정파일(openvpn.conf)에 아래 두 줄을 추가한 후 실행하면 아래와 같이 암호화/복호화가 지원되지 않는다는 것을 알 수 있다.

 

 

cipher none

auth none

Tue Oct 19 16:20:51 us=564306 ******* WARNING *******: null cipher specified, no encryption will be used

Tue Oct 19 16:20:51 us=564343 ******* WARNING *******: null MAC specified, no authentication will be used

 

, 이 경우는 암호화가 지원되지 않고 터널링만 지원되는 VPN이라고 생각하면 된다.

 

 

 

 

(2) VPN 클라이언트 설치 및 설정

 

일단 서버 쪽에서 VPN 데몬이 실행되어 리슨하고 있다면 서버쪽 설정은 정상적인 것이므로 이제 Windows PC측에서 VPN 클라이언트 프로그램을 설치할 차례이다.

 

먼저 http://openvpn.net/ 에 접속하여 OpenVPN 윈도우용 클라이언트 및 서버 버전까지 포함한 “Windows Installer”를 다운로드하여 설치하거나 http://openvpn.se/ 에서 클라이언트 버전만 제공하는 OpenVPN GUI Installation Package 프로그램을 다운로드하여 설치하면 된다.

 

 

설치 후 “[시작]->[프로그램]->[OpenVPN]”을 선택하면 아래와 같은 메뉴가 보이게 된다.

 

 

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272209_1163.png
 

[그림] OpenVPN 메뉴

 

대부분 설치과정에서 자동으로 TAP-Win32라는 인터페이스가 생성되는데 만약 생성이 되지 않았을 경우에는 “Add a new TAP-Win32 virtual ethernet adapter”를 선택한다.

 

잠시 후 보안 창 등 설치할 것인지 묻는 창이 나올 때 계속을 선택하고 내 네트워크 환경에서 속성을 보면 아래와 같이 로컬 영역 연결 3,4....” 와 같이 새로운 인터페이스가 추가된 것을 확인할 수 있다.

 

초기에는 네트워크가 연결되어 있지 않으며 설정이 완료되면 상태가 사용함으로 바뀌게 된다.

 

 

만약 한 번 더 실행하면 새로운 로컬영역연결 인터페이스가 생기게 된다.

 

 

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272226_4988.png
 

[그림] 추가된 TAP-Win32 인터페이스

 

만약 DHCP Client 서비스가 가동 중이라면 앞에서 지정한 IP를 자동으로 할당받기 때문에 별도의 설정은 필요 없지만 만약 중지된 상태라면 IP를 직접 설정하여야 하는데, 이를 위해 이 TAP-32 인터페이스에서 속성을 선택하여 “[인터넷프로토콜 등록정보]->[다음IP 주소사용]”IP:10.1.0.2 서브넷마스크에 255.255.255.0을 입력하며 게이트웨이는 입력할 필요가 없다.

 

물론 이때 IP10.1.0.100이어도 관계는 없으며 Windows에서는 이 IP로 앞에서 정의한 서버의 10.1.0.1 과 통신하게 된다.

 

 

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272239_6995.png
 

[그림] IP 설정

 

이후, OpenVPN을 설치한 디렉토리인

“[내컴퓨터]->[C:\Program Files\OpenVPN\config]” 디렉토리내에 있는 config.ovpn 파일을 아래와 같이 설정하도록 한다.

 

다음은 config.ovpn 파일내의 설정내용들을 설명한 것이다.

 

 

 

[config.ovpn 설정파일]

 

remote 211.47.68.21

원격지 리눅스 서버의 공인 IP를 설정한다.

 

vpn.server.com과 같은 실제 도메인 명을 지정해도 된다.

 

 

 

port 5000

어떤 포트를 통하여 통신할 것인지 지정한다.

 

서버에서 지정한 동일한 포트를 사용한다.

 

 

proto udp

역시 기본 값인 udp를 사용하도록 한다.

 

dev tap0

앞의 서버와 동일하게 tap0을 통하여 터널링을 하도록 한다.

 

 

ifconfig 10.1.0.2 255.255.255.0

앞에서 서버는 10.1.0.1로 설정하였었는데, 여기에는 PC에 할당할 IP를 지정한다.

 

물론 Windows 자체는 ifconfig라는 명령어가 없지만 VPN에서 자체적으로 실행하는 것이므로 걱정하지 않아도 된다.

 

 

dev-node "로컬 영역 연결 3"

TAP-Win32“Add a new TAP-Win32 virtual ethernet adapter”을 실행할 때마다

생성되는데, 여러 개일 경우 정확한 이름을 지정하도록 한다.

 

하나라면 별도로 지정하지 않아도 된다.

 

 

만약 VPN 터널이 여러 개라면 터널 개수만큼의 TAP-Win32 adapter가 있어야 한다.

 

 

 

secret static.key

서버에서 생성한 키와 동일한 키이어야 한다.

 

만약 키가 다를 경우 클라이언트에서 서버로 접속하기 위해 openvpn을 실행하면 아래와 같은 에러가 나면서 실행이 중단된다.

 

 

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272259_5376.png
 

[그림] 키가 다를 경우 에러 화면

 

ping 10

verb 4

서버 설정에서 살펴본 바와 동일한 의미로 상호간에 망이 살아있는지 체크하기 위해 매 10초마다 ping을 발송하게 된다.

 

 

그리고 로그의 수준은 4로 지정한다.

 

comp-lzo

서버 쪽에서도 설정했듯이 압축 알고리즘을 사용한다.

 

이렇게 해서 클라이언트에서의 설정도 끝이 났다. 설정이 끝난 후 config 디렉토리에서 아래와 같이 실행하도록 한다.

 

아래의 스크립트는 openvpn.cmdopenvpn.bat 파일로 생성하여 실행해도 된다.

 

 

 

 

config> openvpn --config config.ovpn

특별한 에러가 없다면 아래와 같은 화면이 보이고 잠시 후 로컬영역연결 3”이 활성화된 것을 알 수 있다.

 

 

d9b788a441468cf23f7e98216dbb1a41_1660272275_6891.png
 

[그림] Windows에서 openvpn 가동시 화면 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,158 명
  • 현재 강좌수 :  36,517 개
  • 현재 접속자 :  371 명