[질문//C] ssl-vpn 구현방법에 대해 조언을 부탁드립니다.

monovision의 이미지

현재 ssl-vpn 을 구현해보려고 합니다.

정확히 ssl-vpn 이 어떤것인지 왜 뜨고 있는지 알아보기 위해 구글과 네이버 등 여러 사이트에서 검색해봐도
정확한 개념(?)을 알지 못하겠습니다.
다만 ssl 이라는 것은 넷스케이프사가 제작한 프로토콜이고 현재 쓰이는 ( 익스, 파폭, 오페라 등등 ) 에서
기본적으로 지원해준다는 것이고, 이미 ssl-explorer 라는 것이 윈도용으로 소스포지에 있더군요.
( 소스를 봤는데 자바라서 포기. 전 C 밖에 모르는지라... 그래서 C로 구현해보려 합니다. )

ipsec 기반과의 차이점이라고는 웹으로 접속이 가능하다인데 관련 시스템 구현도를 봐도 정확한 차이점을 모르겠습니다.
( 왜 ipsec 기반은 웹으로 접속이 불가한지도 모르겠군요... )

현재 생각한 방법은 하위 네트워크에서 오는 패킷을 잡아서 open-ssl 로 처리해서 재전송하는 것인데
과연 옳은 방법인지 모르겠습니다.
( gcc 에는 하위 네트워크에서 오는 패킷을 잡아주는 함수가 있다고 하던데 무엇인지 알고 싶습니다. )

또한, 하위 네트워크의 패킷을 모두 ssl 로 처리해주더라도 과연 이게 vpn 인가 하는 점입니다.

vpn 의 기능을 제대로 수행하기 위해서는 어떠한 것이 더 추가되어야 할지 조언을 부탁드립니다.

ps
- 읽어주시고, 답글 달아주셔서 미리 감사드립니다. 늦었지만 새해엔 건강하시고 행복하세요.

bitneer의 이미지

OpenVPN (http://openvpn.net) 사이트가 좋은 참고가 될 것 같습니다.

wariua의 이미지

알고 있는 것과 잘못 알고 있는 걸 살살 섞어서 풀어보자면...
('재미로'가 아니라 '상용 제품을 목표로' 구현하려 하시는 걸 가정합니다.)

SSL VPN은 IPSec VPN을 이용한 원격 접속의 불편함을 개선하기 위해 만들어진 것이라고 할 수 있습니다. IPSec VPN의 경우 host-network 연결(노트북에 VPN 클라이언트 프로그램 깔고서 무선 인터넷으로 회사 인트라넷에 접속하는 영업 사원을 상상해 주시면 됩니다)이 매우매우 성가십니다. 별도의 클라이언트 프로그램을 설치해줘야 하고, 네트워크 환경이나 설치된 다른 프로그램의 종류에 따라서 접속이 안 되는 경우가 있기도 합니다. 그리고 각 사용자별 접근 제어가 쉽지 않다는 문제도 있구요.

반면 SSL VPN은 (기본적으로는) 웹브라우저만 있으면 접속할 수 있다는 것이 모토입니다. 업무상 사내 네트워크에 접근해서 할 만한 작업들(공용 파일 서버 접근, 메일 확인, ...)을 웹어플리케이션 형태로 구현해 놓았고 이를 HTTPS(HTTP over SSL)를 통해 접근한다는 정도입니다. 여기까지만으로 기능을 한정한다면 SSL VPN의 구현이라는 것은 단순하기 그지없습니다. 클라이언트쪽에는 구현할 게 전혀 없고, 서버(SSL VPN 장비)쪽에서 몇몇 웹어플들 모아다 짜집기 하고는 mod_ssl 써서 apache를 돌리면 대략 모양새가 나오니까요.

여기서 잠깐 쉬면서 말씀하신 것 몇몇에 코멘트를 달자면...

nonovision wrote:
ipsec 기반과의 차이점이라고는 웹으로 접속이 가능하다인데 관련 시스템 구현도를 봐도 정확한 차이점을 모르겠습니다.
( 왜 ipsec 기반은 웹으로 접속이 불가한지도 모르겠군요... )

IPSec VPN은 IP 패킷을 포장(암호화, 서명, 압축)해서 IP와 같은 계층의 ESP/AH 패킷으로 만들어서 보냅니다. HTTP나 SSL의 존재에 대해선 알지도 못하고 알 필요도 없습니다. 따라서 IPSec 기반의 경우 "웹으로 접속"이라는 것이 대략 의미가 통하지 않습니다. 반면 SSL VPN은 애초에 사용자 편의를 위해 웹브라우저로 접속할 수 있게 만들어진 제품이기에 웹을 통해서 접속합니다.

nonovision wrote:
현재 생각한 방법은 하위 네트워크에서 오는 패킷을 잡아서 open-ssl 로 처리해서 재전송하는 것인데
과연 옳은 방법인지 모르겠습니다.
( gcc 에는 하위 네트워크에서 오는 패킷을 잡아주는 함수가 있다고 하던데 무엇인지 알고 싶습니다. )

IPSec의 경우는 보통 (게이트웨이 장비와 클라이언트 프로그램 모두) 커널에서 처리 루틴의 구현이 이뤄집니다. SSL VPN의 경우 (위에서 설명한 기능만으로 한정했을 때) 서버쪽에서 HTTPS 접속이 가능한 웹서버를 구축하고 각종 웹어플들을 올려두면 끝입니다.

'패킷을 잡아주는' 걸로 유명한 건 libpcap 라이브러리가 있습니다. gcc(아마 glibc를 말씀하신 거겠지요?)에 유사한 기능의 전용 함수가 있는지는 저도 잘 모르겠습니다.

SSL VPN은 기본적으로는 'HTTPS로 접속해서 사용하는 인트라넷 접근용 웹어플' 정도이지만 실제 상용 제품들은 훨씬 복잡한 기능들을 가지고 있습니다. 기본적으로 제공되는 웹어플로 모든 응용을 해결할 수는 없기에 TCP/UDP의 특정 포트의 트래픽이나 (IPSec VPN에서처럼) IP 계층의 모든 트래픽을 전달해 주는 기능이 필요합니다. 그러면 IPSec VPN에서 사용하던 클라이언트가 다시 추가되는 셈입니다. 거기에다 각종 부가 기능(사용자 PC의 보안 수준--OS 종류와 버전, 패치 적용 수준, ...--에 따라 접속을 허용하거나 차단하기, 웹브라우저의 캐시 파일 삭제하기, 기존 인증체계와의 연동, PC 원격접속, Telnet/SSH/FTP 접속, ...)이 필요하고, 이 모든 걸 관리할 수 있는 체계적인 관리 기능도 필요합니다.

SSL VPN이 SSL VPN이려면 최소한 뭐가 있어야 될까요? OpenVPN의 경우 '비교적 편리하고 IPSec 대신 SSL을 사용하는 VPN' 정도를 생각하고 있는 것 같습니다. 그리고 위의 설명에선 'HTTPS로 접속해 사용하는 각종 웹어플들'이라고 얘기를 했습니다. 하지만 그것만 가지고는 '제품' 딱지를 붙여줄 수가 없습니다. 바로 위에서 언급한 온갖 부가기능들이 갖춰져야 비로소 'SSL VPN 제품'이라는 이름을 붙여줄 수 있을 겝니다.

일단 잘 나가는 SSL VPN 회사(F5, Aventail, WhaleCommunications, ArrayNetworks, Juniper Networks, ...)의 홈페이지를 둘러보시길 권해드립니다. SSL VPN의 개념에 대한 정보와 실제 제품의 기능에 대한 정보를 얻으실 수 입을 뿐 아니라 (경우에 따라 약간의 개인정보를 제공하고서) 제품의 사용 데모를 보거나 데모용 제품을 사용해보실 수도 있습니다. (SSL Explorer의 플래시 데모도 이런 저런 기능들을 꽤 잘 보여주고 있네요.)

구현과 관련해서는 말씀하신 SSL-Explorer가 꽤 좋은 참고자료가 되지 않을까 싶습니다. Java에 친숙하지 않다고 말씀하셨는데, 친숙해 지시는 것이 좋습니다. 각종 기능 구현 과정에서 프록시 등의 구현을 위해 어쩔 수 없이 plug-in 형태의 프로그램을 작성해서 사용해야 하는 경우가 생기는데 이때 가장 괜찮은 선택 중 하나가 Java Applet 사용입니다. 그리하여, 상용 제품으로서의 SSL VPN을 구현하시려는 거라면 Java는 어찌되었건 익숙해지셔야 합니다. 게다가 참고할 거의 유일한 F/OSS 프로젝트가 Java로 되어있다면야...:)

$PWD `date`

익명 사용자의 이미지

bitner 님 감사합니다.
wariua 님의 자세한 설명 감사드립니다.

생각했던것보다 훨씬 복잡하고, 할게 많네요.

일단은 하나하나 구현해봐야 겠습니다.
상용제품을 목표로 만드는건 아니고 그냥 재미로 입니다 ^^;;

위에 언급된 사이트에는 이미(질문하기 전에) 들어가보았으나, 그다지 유용한 자료는 얻지 못했었거든요.

다시 한번 꼼꼼히 살펴봐겠네요.
즐거운 주말되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.