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

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : SSH: The VPN No One Remembers

  사실 이전에 VPN 관련 글과 SSH 관련 글에서 비슷한 내용을 다루긴 했는데 VPN 능력 자체를 메인으로 다룬 것도 아니고 이 글은 사용법이 조금 달라서 작성하기로 했습니다. 그렇다고 이게 그 기능을 자세히 다뤘냐면 그건 또 아닌 것 같지만...

  SSH를 통한 VPN 활용은 일반적인 전용 VPN 솔루션에 비하면 그리 강력하지 않습니다. 서버와 클라이언트 사이의 모든 패킷을 암호화하는 것이 아니라 하나의 포트를 오가는 패킷을 암호화하며 그로 인해 이 VPN을 사용할 응용 프로그램이 프록시 기능을 지원해야 쓸 수 있기 때문이죠. 허나 적절히 활용한다면 닭 잡는데 소 잡는 칼은 쓸 일을 없앨 수 있을 것입니다.

  먼저 SSH가 서버에 이미 설치되어 있다고 가정합니다. 그리고 기존의 SSH 서비스는 그대로 두고 새로운 포트를 VPN 용도로 사용한다고 가정하겠습니다. 이를 위해 먼저 기존의 설정 파일을 복사합니다.
cp /etc/ssh/sshd_config /etc/ssh/proxy_config
  새롭게 복사한 설정 파일에서 가장 중요한 건 포트입니다. 새롭게 사용할 포트를 정합니다.
Port ####
  보안을 위해 root 로그인 금지도 걸어줍니다.
PermitRootLogin no
  SSH 서버가 프록시 서버 역할을 할 수 있도록 아래 옵션을 활성화합니다. 예전에는 없어도 됐다는 것 같은데 지금은 필요하다고 합니다. 확인해보니 디폴트도 no더군요.
PermitTunnel yes
  추가로 아래처럼 ACL을 걸 수도 있습니다. 이건 저도 처음 보는 것 같네요.
AllowUsers user1 user2 etc...
AllowGroups group1 group2 etc...
  이제 방화벽을 적절히 설정하고 필요한(=SSH가 사용할) 계정과 그룹을 생성합니다. 물론 SSH 설정 파일에 해당 계정과 그룹이 적혀있어야겠죠. 이때 보안을 위해 사용자 계정에 쉘을 주지 않는 것이 좋습니다. 이제 기존의 스크립트를 복사 및 수정하여 기존의 sshd_config 파일을 돌리듯 돌리거나 간단히 아래 명령어를 실행합니다.
/usr/sbin/sshd -f /etc/ssh/sshd_proxy
  만약 스크립트를 사용한다면 스크립트 내에 있는 PID_FILE 변수와 설정 파일명을 적절히 수정해야 한다. 예를 들어 PID_FILE 변수는 sshd_proxy.pid 처럼 기존 이름과 같지 않게 해야 하며 설정 파일도 복사한 파일명으로 바꿔야 한다.

  서버가 정상적으로 작동한다면 클라이언트가 될 머신에서 터미널을 열어 아래를 실행합니다.
ssh -fND localhost:로컬_포트_번호 -p 서버의_포트 접속_계정명@원격_서버_IP
  만약 백그라운드에서 돌아가길 원한다면 옵션에서 f를 제외합니다. N 옵션은 접속 후 원격 명령어를 실행하지 않는 옵션으로 지금처럼 포워딩을 할 때 사용하는 옵션입니다. '로컬_포트_번호'에는 1024 보다 높으면서 현재 사용하지 않는 포트 번호를 씁니다. 이제 VPN을 이용할 프로그램(브라우저, 메신저, 이메일 등)에서 프록시 기능을 활성화하고 호스트네임에 localhost, 포트에 위에서 정한 포트를 입력하여 프록시를 작동시킵니다.

  예를 들어 로컬 포트가 5555, 서버가 열고 있는 포트가 9999, 접속 계정명이 bob, 서버의 IP가 255.244.222.111이라면 아래와 같은 명령어가 됩니다.
ssh -fND localhost:5555 -p 9999 bob@255.244.222.111
  참고로 예전 글(VNC 패킷을 터널링하기 위해 SSH를 쓰던 글)에서는 -D가 아닌 -L 옵션을 쓰고 그로 인해 추가로 최종 포워딩 대상과 포트를 적었었는데 -D 옵션을 사용하면 반대편으로 포워딩 후 서버에서 어플리케이션 프로토콜을 통해 어디로 접속할지 결정합니다. 두 옵션의 차이를 설명하자면 아래와 같습니다.
  • -L : 이전 VNC 때처럼 터널링 생성 후 프로그램에서 접속 목적지를 터널링이 생성된 localhost의 특정 포트로 설정하여 번대편 터널링 서버까지 패킷을 포워딩한 후 그곳에서 터널링을 할 때 지정했던 곳으로 다시 포워딩할 경우 사용.(프로그램(직접 연결)->시큐어 터널(터널링 구간)->SSH서버->지정한 주소의 지정한 포트(보통은 동일 서버의 특정 포트))
  • -D : 네이트를 우회해서 사용할 때처럼 터널링 생성 후 프로그램에서 프록시 기능을 사용해 터널링이 생성된 localhost의 특정 포트로 프록시 서버를 설정하여 반대편 터널링 서버까지 패킷을 포워딩한 후 그곳에서 프로그램이 정한 진짜 목적지로 다시 포워딩할 때 사용.(프로그램(프록시 이용)->시큐어 터널(터널링 구간)->SSH서버->프로그램이 지정한 곳)



2013/06/27 16:53 2013/06/27 16:53
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