검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : How to set up a Linux OpenVPN client
이전 글 : [시스템-리눅스] OpenVPN 서버 맛보기 설치

  이미 지난 글에서 서버를 설치할 때 많은 것을 알아봤기 때문에 클라이언트 설치 때 알아야 할 것이 많지는 않습니다. 아니, 클라이언트를 설치하는데 많은 걸 알아야 한다는 게 말이 안 되는 거 같지만...

  먼저 똑같이 openvpn 패키지가 필요합니다. 서버 때처럼 설치를 해줍니다. 그리고 서버에서 만들었던 인증서와 키 중 CA 인증서(ca.crt)와 클라이언트의 인증서 및 키(client.crt, client.key)가 필요합니다. 저번의 경우 client1과 client2라는 이름으로 클라이언트의 인증서 및 키를 생성했으므로 client1.crt와 client1.key 파일(또는 client2의 같은 확장자 파일들)이 해당됩니다. 복사 위치는 /etc/openvpn 디렉토리입니다.

  그리고 서버 때와 비슷하게 설정 파일을 가져와야 합니다. 이번에는 클라이언트용 샘플 설정 파일을 /etc/openvpn 디렉토리로 가져와야 하는데 샘플 파일의 위치는 대략 아래와 같습니다.
/usr/share/doc/openvpn-버전넘버/sample-config-files/client.conf
  이 파일에서 필수적으로 확인할 설정 변수들은 아래와 같습니다.
  • remote에 서버의 도메인이나 IP를 적는다. 서버의 포트가 1194가 아닐 경우 포트도 수정한다.
  • 보안을 위해 user와 group의 주석을 삭제하여 openvpn이 일반 계정으로 실행되도록 한다.
  • ca, cert, key를 자신의 파일명에 맞게 수정한다. 특히 이전의 예제에서 인증서와 키 파일명을 client.crt, client.key가 아닌 client1.crt, client1.key로 만들었다는 것에 유의한다.
  설정을 마치면 아래의 명령어로 접속을 시도합니다.
# openvpn client.conf
  그러면 상당히 많은 메시지가 나오면서 접속이 진행되는데 'Initialization Sequence Completed'라는 메시지를 끝으로 접속이 이뤄집니다. 접속이 완료되면 아래처럼 VPN의 가상 인터페이스도 확인할 수 있습니다.
# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
  접속에 실패할 경우 서버가 제대로 실행된 상태인지, 두 시스템의 시간이 올바르게 세팅되어 있는지 보시기 바랍니다. 접속에 인증서를 사용하기 때문에 클라이언트의 시간이 인증서를 만들 당시 서버의 시간보다 과거이거나 3650일 후(인증서의 디폴트 유효기간)일 경우 'OpenVPN error=certificate is not yet valid' 같은 에러 메시지를 볼 수도 있습니다.

  클라이언트에서 서버 측에 있는 내부 네트워크의 호스트에 접근할 때 FQDN(Fully Qualified Domain Name)을 사용해서 접근하고 싶다면 해당 도메인 정보를 가지고 있는 도메인 서버의 주소를 VPN 서버에 있는 /etc/resolv.conf 파일의 맨 윗줄에 추가해야 합니다. 또한 DNS 서버에서도 10.8.0.0/32 IP 대역으로부터 오는 요청이 ACL에 막히지 않도록 해야 합니다.

2010/11/25 11:14 2010/11/25 11:14
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : How to set up an OpenVPN server
OpenVPN 홈페이지 : http://www.openvpn.net/
다음 글 : [시스템-리눅스] OpenVPN 클라이언트 설치

  OpenVPN은 리눅스, 윈도우, OS X 플랫폼을 지원하는 상당히 유명한 VPN(Virtual Private Network) 프로그램입니다. 사이트 내에 오픈 소스로 개발해서 공개하는 제품(Community Edition)과 상업으로 판매하는 제품(Access Server Edition)이 따로 존재합니다.참고로 상용 버전도 클라이언트를 2개까지 받는 것은 무료로 가능합니다.

  근데 위와 같은 장점에도 불구하고 일반적인 눈으로 보자면 설정이 좀 불구(-_-;)스럽습니다. 텍스트 기반으로 슉슉 설정해야 하는데 뭐 리눅서들에게 그건 평소의 일이니 별 걱정될 것은 없고...네트워크와 보안 관련 지식이 필요하다는 건 VPN 자체의 문턱이고...이 포스팅에서는 '한 번 돌려보는 수준'으로 알아보도록 하겠습니다. 어쨌든 설치를 시작해봅시다.

  OpenVPN 홈페이지에서 (오픈 소스 버전으로)받으시면 소스를 컴파일하셔야 할테니 귀찮으신 분은 RPM, yum, apt-get 등 자신의 배포판에 맞는 패키지 매니저를 사용해서 설치합니다. 근데 그 배포판에 있는 것이 오픈 소스 버전인지, 상용 버전의 트라이얼인지는 모르겠습니다.

  그 후 인증서를 만들기 위한 파일들을 복사합니다. 시작부터 더럽군요. 배포판마다 다를 수 있는데 아래는 CentOS를 기준으로 보여주고 있습니다.
# cd /usr/share/doc/openvpn-2.0.9
# cp -a easy-rsa /etc/openvpn/
  그리고 아래는 제 우분투에서 직접 복사한 모습입니다. 위와 경로가 쬐끔 틀리니 참고하시기 바랍니다.
$ cd /usr/share/doc/openvpn/examples/easy-rsa
$ sudo cp -a 2.0 /etc/openvpn/easy-rsa
  이제 복사한 디렉토리(/etc/openvpn/easy-rsa) 안에 들어가 보면 vars라는 파일이 있는데 이 파일의 마지막 부분에 'KEY_'로 시작하는 인증서 관련 값들을 적절히 수정합니다. 이제 아래의 방법을 통해 인증서를 만듭니다. 참고로 첫 번째 줄에서 환경 변수를 적용받아 그 아래의 작업들을 해야 하기 때문에 앞으로 실행할 파일들의 소유권을 현재 계정으로 바꾸던가 루트 계정으로 작업(우분투라면 'sudo su -' 등의 방법을 통해)을 해야 합니다.
# . ./vars   <- 환경 변수 적용
# ./clean-all   <- 초기화
# ./build-ca   <- CA의 인증서 생성
# ./build-key-server server   <- 서버의 인증서 생성
# ./build-key client1   <- 클라이언트1의 인증서 생성
# ./build-key client2   <- 클라이언트2의 인증서 생성
  각 인증서를 생성할 때마다 생성에 필요한 정보를 물어봅니다. 그 중에 "Common Name"의 경우 일종의 암묵적인 룰이 있다는데 CA(Certificate Authority)의 경우 "OpenVPN-CA", 서버의 경우 "server", 클라이언트의 경우 "client"나 클라이언트 시스템의 이름을 적는다고 합니다.

  이제 서버에서 사용할 디피-헬먼(Diffie Hellman) 파라미터를 생성합니다.
# ./build-dh
  앞선 작업들로 인해 keys 라는 서브디렉토리가 생기는데 그 안에 보면 이제까지 만든 인증서 파일들이 있습니다. 이 파일들 중 일부를 클라이언트에 복사해야 합니다. 각 클라이언트에게 필요한 파일은 ca.crt과 해당 클라이언트의 인증서와 키 파일(위 예를 기준으로 client1.crt와 client1.key)입니다. 참고로 우분투의 경우 /usr/share/doc/openvpn/examples/sample-keys에 샘플 키와 인증서가 있으므로 테스트 용도로 돌려보시려면 이걸 사용하는 것도 나쁘지 않습니다.

  위에서 만든 인증서와 키 파일들 중 서버에 필요한 파일은 ca.crt, server.key, server.crt, dh1024.pem 파일입니다. 이 파일들을 /etc/openvpn 디렉토리에 복사합니다.
# cd /etc/openvpn/easy-rsa/keys
# cp ca.crt server.key server.crt dh1024.pem ..
  이제 OpenVPN 설정 파일을 수정해야 합니다. 근데 당황스럽게도 기본 설정 파일도 디렉토리(/etc/openvpn) 안에 없습니다. 이게 무슨 bind도 아니고...다행히 샘플 파일이 아까 봤던 문서 디렉토리 쪽에 숨어 있으므로 납치합니다.
# cp /usr/share/doc/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/
  참고로 우분투의 경우 중간에 examples 디렉토리가 하나 더 끼어있고 설정 파일이 압축되어 있습니다. 어쨌든 이제 대망의 설정 파일을 볼 시간이지만...사실 샘플 파일에서 아무것도 고치지 않아도 돌리는 것 자체에는 문제가 없습니다. 그래도 몇 가지 설정 변수를 살펴보자면...
  • user와 group으로 OpenVPN 프로세스를 실행할 계정을 정할 수 있습니다. 주석을 제거하여 nobody/nogroup으로 실행하도록 만듭시다.
  • local로 VPN 접속을 받아들일 IP를 지정할 수 있습니다.
  • client-to-client로 클라이언트끼리 통신할 수 있게 만들 수 있습니다. 이게 없으면 클라이언트는 VPN 서버하고만 통신할 수 있고 해당 서버에 접속한 다른 클라이언트와는 통신을 할 수 없습니다.
  • push는 클라이언트에 라우팅 테이블이나 DNS 관련 설정을 전달하는데 사용합니다.
  만약 클라이언트가 서버하고만 통신을 할 것이 아니라 해당 서버의 다른 클라이언트(설정 파일에서 client-to-client 옵션 필요)나 서버가 속한 다른 내부 네트워크(설정 파일에서 push 옵션을 통해 별도의 설정도 필요)와도 통신을 해야 한다면 아래의 방법으로 IP 포워딩을 활성화합니다.
# echo 1 > /proc/sys/net/ipv4/ip_forward
  또한 리붓 후에도 이 설정을 유지하려면 /etc/sysctl.conf 파일에서  'net.ipv4.ip_forward = 1' 앞에 있는 주석을 지워야 합니다.

  마지막으로 중요한 것이 있는데 만약 push를 통해 외부에서 접속한 클라이언트가 서버가 속한 다른 내부 네트워크와 통신할 수 있게 만든 상태라면 서버쪽의 라우터에서 내부 네트워크로부터 외부의 클라이언트로 갈 수 있게 라우팅 테이블을 설정해줘야 한다는 겁니다. 그렇지 않으면 아래와 같은 일이 발생합니다.
  1. OpenVPN은 디폴트 설정을 기준으로 10.8.0.0/24 네트워크를 사용하는데 해당 네트워크에 대한 라우팅 테이블 엔트리는 OpenVPN 서버와 클라이언트들만 가지고 있다.
  2. 클라이언트(IP 10.8.0.10)는 서버쪽 사설 네트워크 안에 있는 호스트(IP 192.168.10.20)에게 핑을 날렸다.
  3. 서버를 거쳐 핑을 받은 호스트는 대답을 하기 위해 상대의 IP를 봤다. 그런데 자신의 IP와 다른 네트워크의 IP였다. 따라서 자신의 디폴트 게이트웨이(라우터)에게 처리를 넘긴다.
  4. 라우터는 자신의 라우팅 테이블을 봤다. 그런데 그 네트워크를 위한 특별한 엔트리가 없다. 따라서 자신도 마찬가지로 다음 홉(아마도 ISP쪽)에게 처리를 넘긴다. 하지만 해당 IP는 사설 IP 대역에 속하기 때문에 답변은 돌아오지 않는다. 결국 서버쪽 사설 네트워크 안에 있는 호스트는 VPN 클라이언트로부터 받은 핑에 대한 대답을 할 수 없게 된다.
  이 문제를 해결하려면 디폴트 설정을 기준으로 라우터가 '10.8.0.0/24 네트워크는 10.8.0.1가 알고 있다'라는 엔트리를 라우팅 테이블에 올려놓고 있어야 합니다. 참고로 10.8.0.1은 OpenVPN 서버의 VPN용 IP입니다. 물론 서버가 게이트웨이 역할도 동시에 맡고 있다면 지금 한 이야기는 다 필요 없는 이야기입니다.

  모든 설정을 마치고 OpenVPN 서버를 올립니다.
# /etc/init.d/openvpn start
  이상으로 간단히 OpenVPN 서버를 세팅하는 방법을 알아봤습니다. 바로 이어서 OpenVPN 클라이언트를 설치하고 설정하는 것에 대해 알아보겠습니다.


다음 글 : [시스템-리눅스] OpenVPN 클라이언트 설치
2010/11/24 22:56 2010/11/24 22:56