Point  to  Point   Tunneling   Protocol
ppTp VPN Linux client  설정 방법
    version 2.20
    글쓴이 : (주)리눅스랩 대표이사 배철수 <ceo_nospam@linuxlab.kr> - 메일 보낼때는 _nospam 을 빼야 한다.

    사용자는 자신의 판단으로 아래 프로그램 설치 및 사용 여부를 결정해야 한다. 아래 설정으로 인해 리눅스 호스트의 오작동, 데이타 손실 등 어떠한 물적, 정신적 손해가 발생되도 이는 이 프로그램을 설치한 사람 자신의 책임이다.

    설치가 제대로 안된다고 PC를 발로 걷어차서 PC가 부서지거나 발가락이 삐는것, 머리카락을 쥐어 뜯어 대머리가 되는것, 또 밤새 설치하다가 늦잠자서 회사에 지각해 상사에게 꾸지람 듣고 홧김에 술마시고 음주운전하다 벌금을 무는 등의 일체의 간접적인 손해도 역시 본인의 책임이 아니다.

    . 이 글에서 리눅스 client 란 리눅스랩의 pptp VPN 서버를 연결하는 사용자 측 리눅스 호스트를 말한다.
    . 이텔릭체로 표시한 부분은 사용자가 입력하는 명령이다. (뒤에 <Enter> 키를 눌러야 한다.)
    . 회색 바탕은 리눅스 client 의 화면 출력이다.

    [사족]

    1. 아래 설명은 데비안 배포본을 기준으로 한다.

    2. 리눅스 전문가라면 아래 설명을 읽지 않고도 pptp 를 연결할수 있다.
      아래 설명을 읽고도 pptp 를 연결하지 못한다면 리눅스를 사용하지 말고 윈도우를 사용하기를 권한다.

    3. 질문이 있으면 게시판에 글 올리기 바란다.(전화상으로는 기술 지원을 않습니다.)

  1. 사전 준비 사항

    • 리눅스랩에서 " 공인 IP" 계정과 패스워드를 받는다. (http://pptp.kr)

      *. 무료 테스트 계정으로는 pptp 연결 까지만 테스트 가능하다. 그 이상(외부에서 할당 받은 IP로 연결 )을 테스트하려면 반드시 공인 IP를 받아야 한다.

    • 리눅스 client 에 아래 세 프로그램이 설치되어 있는가 확인한다. 디렉터리 위치도 아래와 같아야 한다.

      1. which pppd
      /usr/sbin/pppd

      2. which pptp
      /usr/sbin/pptp

      3. which ip
      /sbin/ip

    • ls -l /etc 명령을 줄 때 아래와 같은 라인이 나와야 한다.

      drwxr-xr-x 3 root root 4096 Aug 18 18:17 ppp

    • ls -l /usr/sbin/pppd 명령을 주면 아래처럼 나와야 한다.

      -rwsr-xr-- 1 root dip 260920 2007-03-17 15:52 /usr/sbin/pppd

      맨 앞의 rws 가 중요하다. 만약 이 부분이 rwx 로나오면 아래 명령을 준다.

      chmod 4754 /usr/sbin/pppd

    • 공유기 사용시 주의 사항.

      아래의 모든 설정은 공유기를 사용하는 경우도 작동한다. 단 다음 두 가지를 확인해야 한다.

      1. 공유기에 pptp 통과(passthrough) 기능이 있는지 확인해야 한다. 매뉴얼에 pptp 통과 기능이 있다고 해서 그대로 믿어서는 안된다. 윈도우 PC 를 공유기 아래에 연결해서 VPN 연결이 돼는지 확인해 본다.

        본인이 아는바로는 국내에서 많이 사용하는 국산 공유기 대부분이 pptp 통과 기능이 없다. 자세한 사항은 자주받는 질문 3 번을 참고하기 바란다.

      2. 리눅스 client 에서 공유기의 로칼 포트로 ping 이 돼는지 그리고 인터넷 사이트(리눅스랩 VPN 서버의 IP)로 ping 이 돼는지를 확인해야한다.

    • 방화벽 밑에서 연결

      방화벽 사용시는 방화벽 업체에 pptp 통과 기능을 넣어 달라고 애기해야 한다.
      방화벽이 리눅스라면 커널을 컴파일해야 한다.

        [ /usr/sbin/pptp 컴파일 ]

    /usr/sbin/pptp (pptp client) 파일이 없으면 소스 파일 pptp-linux-x.y.z.tar.gz 을 다운받아 컴파일 하면 된다.

    1. 다운 받은 pptp-linux-1.4.0.tar.gz 파일을 /tmp 디렉터리에 넣는다.
    2. cd /tmp
    3. tar zxvf pptp-linux-1.4.0.tar.gz
    4. cd pptp-linux-1.4.0
    5. make
    6. make install
    위의 과정을 마치면 /usr/sbin 디렉터리에 pptp 란 파일이 만들어 진다.
    컴파일이 안된다면 RedHat Fedora Core release 3 (Heidelberg) 용 pptp binary file 을 다운받아 설치해 본다. 단 관련 라이브러리가 설치되어 있어야 한다.

    *. 마우스 우측 버튼으로 위의 링크를 클릭해 다운 받은 후 /usr/sbin 에 넣고
    chmod 755 /usr/sbin/pptp 명령을 준다.

  2. 관련 사이트/글

    1. pptp client : http://pptpclient.sourceforge.net
    2. pppd : pppd 설치
    3. pppd : ppp 사용

  3. [주 의 ]

    리눅스 client 에 pppoe 방식의 ADSL 모뎀을 직접 연결한 경우에는 특별한 주의가 필요하다.(ADSL 모뎀을 공유기에 연결한 경우는 상관없다.) pppoe 와 pptp 모두 ppp 프로토콜을 사용하므로 일부 설정 파일이 충돌할 수 있다.

    *. 최근에 나오는 일부 ADSL 과 VDSL 은 pppoe 프로토콜을 사용하지 않는다. DHCP(IP 자동 부여)를 사용한다.

    리눅스에서 pppoe 프로그램을 사용해서 ADSL 라인을 연결했다면 아래 "5." 번 명령 실행시 pppoe 프로그램이 정상적으로 작동하지 않을 수도 있다. 따라서 아래 명령 실행 전에 필히 /etc/ppp 디렉터리를 백업 받아야 한다.

    • cd /etc
    • cp -a /etc/ppp /etc/ppp.bak

    문제 발생시 원상태로 복원 하려면

    • cd /etc
    • rm -rf ppp
    • cp -a ppp.bak ppp

  4. 아래 설정은 root 권한이 필요하다.

  5. 리눅스 client 설정 프로그램 (linuxlab-pptpc.tar)을 /tmp 디렉터리에 다운 받는다.

  6. tar  xvf  /tmp/linuxlab-pptpc.tar  -C/etc/ppp 명령을 실행

    ( -C/etc/ppp 에서 C 는 대문자이다. 중간에 공백이 없다.)

    • /etc/ppp 디렉터리에 아래 다섯 파일이 생성된다.(아래 파일이 안 나타나면 tar 명령이 틀렸다.)

      chap-secrets  chk-vpn  cron-pptpc  ip-up  pptpc

    • /etc/ppp/peers 에 아래 파일이 생성된다.

      linuxlab

    [참 고] : 각 파일의 설명

    파일명mode설명
    chap-secrets-rwx------인증 파일. 계정과 패스워드가 들어간다.
    chk-vpn-rwxr-xr-xVPN 연결이 끊겼는 지를 체크해서 재연결해주는 쉘 스크립트.
    cron-pptpc-rwxr-xr-x1 분에 한번 chk-vpn 스크립트를 실행하는 crontab 설정파일
    pptpc-rwxr-xr-xVPN 을 연결하는 스크립트
    linuxlab-rwxr-xr-xpptp 옵션 및 서버 주소 지정
    ip-up-rwxr-xr-xVPN 연결시 실행되는 policy routing script

  7. /etc/ppp 디렉토리 내의 다음 파일을 수정한다.

      리눅스랩에서 받은 VPN 서버의 계정이 test999 패스워드가 1234 라면

    1. chap-secrets 파일에 아래 라인을 추가한다.

        test999    *   1234   *

         ("account   *   pass   *" 란 줄은 예제이다. 즉 이런 식으로 입력한다는 뜻임.)

    2. pptpc 파일 중 LOG_NAME="account" 에서 account 대신 리눅스랩에서 받은 ppTp VPN 계정을 넣는다.

        LOG_NAME="test999"

    3. /etc/ppp/peers/linuxlab 파일의 아래 라인의 w.x.y.z 에 리눅스랩 VPN 서버의 주소가 들어가야 한다.

      pty "/usr/sbin/pptp w.x.y.z --nolaunchpppd"

      ex) pty "/usr/sbin/pptp 118.128.29.8 --nolaunchpppd"

      위의 w.x.y.z 에는 리눅스랩에서 할당하는 공인 IP를 입력하는게 아니다. 할당한 IP 는 pptp 가 연결이 될 경우에 client 에서 받는 IP 주소이다. 서버 주소는 리눅스랩 홈페이지(pptp.kr)에 나오는 VPN 서버의 IP 주소를 입력해야 한다. (도메인 네임은 사용할 수 없다.)

      공인 IP 는 반드시 지정된 서버만 접속해야 한다.

    *. 만약 ADSL 라인을 pppoe 방식으로 리눅스 client 에 연결했다면 /etc/ppp/peers/linuxlab 파일에 아래 라인을 추가한다.

    mtu 1452

    *. vi 편집기를 사용할 줄 모르면 pico 나 nano 를 사용하면 된다. 리눅스에서 편집이 어려우면 ftp 로 다운 받은 후 윈도우에서 수정한다. 단 윈도우로 다운 받거나 윈도우에서 리눅스로 업로드할 때 ftp 에서 꼭 ascii 옵션을 사용해야 한다. 아래와 같다. (윈도우에서 pptpc 파일을 업로드 했으면 필히 "chmod 755 pptpc" 명령을 줄것.)

      230 User admin logged in.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp> ascii
      200 Type set to A
    

  8. 연결

    /etc/ppp/pptpc  명령을 실행한다.

  9. 연결 확인

    1. ifconfig  명령을 주었을 때 아래처럼 나와야 한다.(일부 생략)

       ppp?     Link encap:Point-to-Point Protocol
                inet addr:999.999.999.999  P-t-P:w.x.y.z  Mask:255.255.255.255

      *. ip 명령을 사용한다면 ip addr sh  명령을 주면 아래처럼 나온다.

          14: ppp0:  mtu 1500 qdisc pfifo_fast qlen 3
                 link/ppp
                 inet 999.999.999.999 peer w.x.y.z scope global ppp0

      *. 999.999.999.999 대신 자신에게 할당된 IP 주소가 나와야 한다.

    2. ps ax  명령을 줄 때 아래 3 줄이 나와야 한다.

        16254   ?   Ss   0:00 /usr/sbin/pppd ipparam linuxlab  name ????? call linuxlab
       16255   ?   S    0:00 pptp: GRE-to-PPP gateway on /dev/ptmx
       16289   ?   S    0:00 pptp: call manager for w.x.y.z
        (or 629 ?   S    0:00 pptp: call manager for 220.--nolaunchpppd)
      *. ????? 대신 자신의 VPN 계정이 나와야 한다.
      *. "16254" 는 Process ID 로서 VPN 연결을 끊을 때 필요하다.

    3. netstat -nr 명령으로도 확인이 가능하다.

        linuxlab:/etc/ppp# netstat -nr
        Kernel IP routing table
        Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
        172.29.0.1      0.0.0.0         255.255.255.255 UH        0 0          0 ppp0
        192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
        0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth1

      위 라우팅 테이블은 리눅스랩 방화벽 밑에서 VPN 을 연결한 경우이다. 인터넷 라인(방화벽)은 eth1 에 연결돼 있다.

      1. 4 번째 줄의 "172.29.0.1" 은 VPN 서버의 IP 이다. 어느 서버를 연결하느냐에 따라 다르다.
      2. 5 번째 줄의 192.168.0.0 은 방화벽 과 리눅스 client 간의 내부 네트워크 주소이다.

      리눅스 네트워킹에 대해 조금 알고 있는 리눅서라면 위의 라우팅 테이블이 이상하다고 느낄 것이다.

      *. 이상하지 않다고 생각했다면 리눅스 네트워킹에 대한 전문가이거나 문외한 중 하나이다.

      왜 디폴트게이트웨이 인터페이스(마지막 줄)가 eth1 인지 의아해 할것이다.
      default gateway 가 VPN 인터페이스(ppp0) 여야 하지 않는가?
      라우팅 테이블이 틀리지 않은가?

      천만에요. 이걸 비대칭 라우팅이라고 부르는 겁니다. 일반적으로 거의 사용하지 않는 어려운 기법입니다.
      (비대칭 라우팅은 개념이 어려워 여기서 설명하지 않습니다.)

      외부에서 리눅스랩에서 받은 IP 주소로 telnet 이나 ssh 로 연결해 보세요.

      만약 VPN 연결은 되나 외부에서 VPN 으로 받은 IP 를 사용할수 없으면 /etc/ppp/ip-up 스크립트가 실행이 안돼는 경우이다.

      ip-up 스크립트는 ip 명령이 /sbin 에 있어야 실행된다. ip ru sh 명령을 줄 때 "10: from ..." 라인이 나와야 한다.

  10. 부팅시 vpn 자동 연결

    위의 연결 명령을 리눅스 boot 스크립트에 넣어야 리부팅시 자동으로 VPN 이 연결된다.

    1. Redhat

      /etc/rc.d/rc.local 파일의 맨 뒤에 아래 라인을 넣는다.

      /etc/ppp/pptpc

    2. Debian

      /etc/ppp/pptpc 을 /etc/rc.local 에 추가 한다.

    3. SuSE

      /etc/init.d/boot.local 파일의 맨 뒤에 /etc/ppp/pptpc 라인을 추가한다.

      

    주의 : 다른 배포본 또는 customized 된 시스템에서 연결시 VPN 연결 명령(pptpc)이 인터넷 연결 프로그램 보다 나중에 실행되야 한다.

  11. 자동 재연결

    인터넷 라인이 끊기면 VPN 연결도 같이 끊긴다. 또는 공유기를 사용시 공유기를 껏다 켜도 VPN 연결은 끊긴다. VPN 연결이 끊겨도 자동으로 재 접속되게 하려면 crontab 에서 /etc/ppp/chk-vpn 파일을 1분에 한번씩 자동으로 실행되게 해야 한다.

    crontab -l 명령을 주면 현재 crontab 에서 실행 되는 명령이 나온다. 아무런 설정이 없다면 아래 명령을 준다.

    crontab /etc/ppp/cron-pptpc <enter>

    crontab 에 이미 다른 설정이 있다면 crontab -e 명령으로 crontab 에 아래 라인을 추가한다.

    */1  *  *  *  *  /etc/ppp/chk-vpn

    각 항목 다음에 반드시 공백이 한 개 이상 필요하다.

    확인하려면 crontab -l  명령을 준다. 아래처럼 나와야 한다.

    */1  *  *  *  *  /etc/ppp/chk-vpn

    *. crontab 설정 확인 : crobtab -l
    *. crontab 설정 제거 : crontab -r

  12. 장애 처리

    1. VPN 연결이 안된다.

      1. 공유기를 사용한다면 공유기가 "VPN (ppTp) pass through" 기능을 지원하는지 확인할 것.(공유기/방화벽 사용에 대해서는 자주 받는 질문 "3" 번을 참고하시오.) : 공유기 문제인지 확인하려면 공유기를 떼고 연결을 시도하던지 또는 윈도우에서 VPN 연결을 시도해 본다.

      2. /etc/ppp/options 파일을 지우고 연결을 시도한다.

      3. man pppd 명령을 주어서 옵션에 -defaultroute 가 있는지 확인해 본다. 오래된 배포본의 경우 -defaultroute 대신 nodefaultroute 를 사용하는 경우도 있다. 이 경우는 /etc/ppp/peers/linuxlab 파일의 -defaultroute 를 nodefaultroute 로 변경

      4. 그래도 안되면 /etc/ppp/options 파일에 debug 을 넣고 연결을 시도한다. 그러면 /var/log/debug(or syslog : 배포본 마다 다르다) 파일에 ppp 와 관련된 로그가 저장된다. 그 로그를 자세히 보면 어디엔가 에러 원인이 나타난다

        이 글 맨 뒤에 정상적으로 연결되었을 때의 /var/log/debug 파일 내용을 첨부했다. 이 로그와 비교해서 차이가 있는지 본다. 로그에 "Welcome to libra." 가 안나오면 계정 또는 패스워드가 틀렸다.

    2. VPN 연결은 되는데 자주 끊긴다.

      - 공유기가 "VPN (ppTp) pass through" 기능을 제대로 지원하는지를 확인할 것.

      - 윈도우 PC에서 VPN 을 연결해도 마찬가지 인지를 비교해 볼것.

      - 라인 상태를 점검해 본다. 리눅스랩 VPN 서버 IP 주소 또는 사용하는 인터넷 라인의 ISP 의 DNS 서버 주소로 ping 테스트를 해 본다.

      - /etc/ppp/peers/linuxlab 파일에 아래 라인을 추가해 본다.

           mtu 1452 (또는 mtu 1400)

    3. VPN 연결은 되는데 외부에서 리눅스 client IP 주소로 접속(ping)이 안된다.

      1. /sbin/ip route show  명령을 줄 때 에러가 뜨는지를 볼것. : 에러가 뜨면 iproute 프로그램을 재설치한다.

      2. 방화벽 룰이 설정되었는지를 확인할것.(iptables -vnL) 방화벽 룰을 제거하고(아래 명령) 연결을 시도해 본다.

        iptables -F

      3. dmesg  명령을 실행해서 에러가 나오는지를 볼것

        혹시 아래와 비슷한 에러가 나오면 이는 배포본, 커널, 모듈 문제이므로 해결이 쉽지 않다.

        divert: no divert_blk to free, ppp0 not ethernet
        divert: not allocating divert_blk for non-ethernet device ppp0

        <해결 방법>

        - 아래 두 명령을 실행해 본다.(아래 명령은 한 줄이다. \는 명령을 두 줄로 계속할 때 사용한다.)

        (1) /sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
            -j TCPMSS --clamp-mss-to-pmtu

        (2) /sbin/iptables -A OUTPUT -p tcp --tcp-flags SYN,RST SYN \
            -j TCPMSS --clamp-mss-to-pmtu

        - 랜카드 드라이버를 모듈로 올리지 말고 커널을 컴파일해 넣는다.

    4. 인터넷 라인이 끊겼다 다시 연결됐는데 pppd 데몬이 종료하지 않아서 VPN 자동 재연결이 안된다.

      linuxlab 파일에는 pppd 옵션을 지정하는 부분이 들어 있다. 이중 lcp-echo-interval 과 lcp-echo-failure 는 VPN 연결이 비정상 종료(라인 절단)인 경우에 pppd 데몬을 종료케하는 부분이다.

      lcp-echo-interval 은 몇 초에 한 번 VPN 서버로 연결 확인(LCP Echo) 을 할것인지를 지정한다. lcp-echo-failure 는 LCP Echo 가 몇 번 실패할 경우에 pppd 데몬을 종료할 것인지를 지정한다. lcp-echo-interval 30 이고 lcp-echo-failure 가 4 라면 라인 연결이 끊기면 약 120 초 이내에 pppd 데몬이 종료한다. 그러면 crontab 에서 chk-vpn 스크립트가 pppd 데몬이 종료했으므로 pptpc 스크립트를 실행해서 VPN 을 다시 연결해 준다.

      그러나 극히 드믈지만 위의 두 옵션에서 pppd 데몬이 죽지 않는 경우도 있다. 이럴 때를 대비해 만든 옵션이 있는데 바로 idle 이다. "idle 240" 을 linuxlab 에 추가하면 이 문제를 해결할 수 있다. 이 옵션은 240초 동안 전혀 데이타 이동이 없으면(LCP Echo 포함) pppd 를 종료하라는 뜻이다.

    5. 모든 방법을 동원해도 연결이 안되면 /etc/ppp/options 파일에 debug 를 넣고 연결을 시도 후 /var/log/debug 파일 내용[참고 4]을 vpn@linuxlab.co.kr 로 보내기 바란다.

      그리고 공유기에서 23/tcp(또는 22/tcp) 를 리눅스 client 로 포트포워딩을 설정하고 리눅스에서 telnet(ssh) 데몬을 가동하면 리눅스랩에서 원격으로 접속하여 모든 설정을 해 줌.(비용 없슴.)

      [참 고]

      리눅스랩 VPN 을 연결해서 메일 서버를 운영하는데 한메일 같은 일부 포탈 사이트로 보낸 메일이 스팸으로 처리된다는 불평을 하는 사람이 있다. 이는 비대칭 라우팅을 이해하지 못하기 때문이다.

      한메일에서 리눅스 메일 서버로 보내는 메일은 VPN 으로 받은 IP 주소로 들어온다. 하지만 윈도우에서 Outlook 로 리눅스 메일 서버를 지정해 메일을 보내면 리눅스 메일 서버가 일단 저장 한 후 이를 다른 메일 서버(한메일 메일서버)로 보낸다.

      리눅스 메일서버가 비대칭 라우팅을 사용한다면 메일이 나갈 때는 리눅스랩에서 VPN 으로 받은 IP 주소가 사용되지 않고 공유기 또는 리눅스에 연결된 ADSL/케이블 라인의 IP 주소로 나간다.

      만약 메일 수신자측 메일 서버가 메일 헤더에 있는 도메인 네임을 nslookup 하면 리눅스랩의 VPN IP 주소가 나올것이다. 그런데 메일헤더에 있는 IP 주소는 VPN IP가 아닌 ADSL 라인의 IP 이다. 일부 포탈사이트는 이 둘이 같지 않으면 스팸으로 처리한다.

      불특정 다수에게 메일을 발송하는 경우라면 [참고 1] 에 나온 것처럼 비대칭 라우팅이 아닌 방식을 사용하기 바란다. 단 이 경우는 속도에서 손해를 본다.

  13. 연결 끊기

    위의 6. 2) 첫번째 줄 맨 앞에 나오는 프로세스 ID를 kill 한다.

    kill -9 16254

  14. 공유기(NAT gateway) 사용

    공유기 사용자는 필히 자주 받는 질문을 참고하기 바란다. 리눅스를 NAT gateway 로 사용하는 경우도 마찬가지다.

  15. 기 타

    위의 설정은 리눅스 client 에서 웹/메일/DB 등의 서버를 운영할 경우에 적합하다. 즉 위의 설정으로 연결하면 외부에서 리눅스 client 의 VPN 으로 받은 고정 IP 주소로 연결시만 VPN 링크가 사용된다.

    리눅스 client 에서 인터넷을 사용할 경우 또는 리눅스 client 를 게이트웨이로 지정해서 인터넷을 사용하는 피시에서 인터넷을 사용시는 VPN 으로 부여 받은 고정 IP가 사용되지 않고 리눅스 client 에 연결된 인터넷 라인의 IP(공유기 사용시는 공유기에 부여된 IP 주소) 가 사용된다.

    (비대칭 라우팅으로 불린다. 왜 그렇게 되는지 설명하려면 너무 길다.). [참고 3]을 보면 default gateway 가 공유기의 주소 즉 192.168.0.1 이다.

    사용자의 입장에서는 리눅스 client 에서 데이타가 나가는 경우에는 VPN 서버를 거치지 않는게 유리하다. 왜냐하면 VPN 서버를 거치지 않는게 속도면에서 유리하다

    따라서 이 설정을 효과적으로 사용하려면 VPN Pass Through 기능이 있고 Multi-Session 을 지원하는 공유기(Dlink 사의 DI-604 등)에 인터넷 라인을 연결하고, 리눅스 client 에는 사설 IP(192.168.x.x)를 부여해서 리눅스 client 의 디폴트 게이트웨이를 공유기의 랜 포트의 주소를 주면 된다.

    공유기 설정에서 공유기에 연결된 피시의 IP 를 자동으로 부여 하지 말고 수동으로 부여해야 한다. 아니면 공유기에서 IP 자동 부여를 하되 VPN 을 연결하는 리눅스 client IP 를 자동 부여 IP 목록에서 제외한다.

    물론 위의 설정은 리눅스 client 에 직접 ADSL/케이블/전용선을 연결할 경우에도 작동한다.

    질문이 있으면 vpn@linuxlab.kr 로 문의하기 바란다.

    ppTp 자주 받는 질문 에도 관련 내용이 있다.

[참고 1] 아래 부분 매뉴얼은 아직 수정이 진행중입니다.
*. 리눅스 client에서 데이타를 내보낼때도 VPN IP로 나가게 하려면

위의 설정은 VPN을 연결한 리눅스 client 에서 인터넷을 연결하는 경우는 VPN IP를 사용하지 않는다.(비대칭 라우팅이라 불린다.)

이 설정에서는 리눅스 client 에서 인터넷을 연결시는 VPN 서버를 거치지 않는다. 즉 VPN IP 로 나가지 않는다. (외부에서 VPN 으로 받은 IP 주소로 리눅스 client 를 연결할 때는 당연히 VPN 서버를 거친다.) VPN 서버를 거치지 않으면 그 라인의 최고 속도를 다 이용할 수 있기 때문이다.

즉 리눅스 client 가 메일 서버이고 호스트 네임이 mail.pptp.co.kr 이라면 외부에서 mail.pptp.co.kr 로 메일을 보낼 때는 VPN 주소가 사용되지만 mail.pptp.co.kr 에서 다른 메일 서버로 메일을 보낼 때는 VPN 으로 받은 IP 주소가 아닌 리눅스 client나 공유기의 ADSL/케이블 라인의 IP 주소가 사용된다.

그러나 리눅스 client 에서 인터넷의 호스트를 연결하는데 그 호스트에서 상대방의 IP를 체크해서 특정 IP 만 연결을 허용한다면 리눅스 client 에서 데이타를 내 보낼때도 VPN IP로 나가야한다. 즉 VPN 서버를 거쳐야 한다.(이런 경우는 많지 않을 것이다.)

이 설정은 상당히 까다롭다. 왜냐하면 이렇게 하려면 리눅스 client의 default gateway 를 VPN Interface(ppp?) 로 변경해야하는데 이 때 단순히 게이트웨이를 변경하면 looping 이 발생한다.

물론 리눅스는 이 경우에도 당연히 설정이 가능하다. 여기서 방법을 설명하려면 복잡하므로 아래의 설정 프로그램을 다운받아 설치하면 자동으로 해결된다.

<순서>

  1. awk 프로그램이 설치되어 있어야 한다.
  2. 위의 4번 까지 진행한다.
  3. ip-dgw.tar 파일을 다운받는다.
  4. 이 파일을 /etc/ppp 디렉터리에 넣고 tar xvf ip-dgw.tar 명령을 준다.
    ip-up 과 ip-down 두 파일이 나타난다.
즉 본문 "3" 번에서 설치된 /etc/ppp 디렉터리의 ip-up 파일을 새 파일로 대치하고 ip-down 파일을 하나 더 추가한 것이다. 다른 부분은 같다.

이젠 VPN을 연결하면 디폴트 게이트웨이가 VPN interface 로 변경될 것이다. 그리고 VPN 연결을 끊으면 연결 전의 라우팅 테이블로 복귀한다.

♣. VPN 연결 후의 라우팅 테이블은 아래와 같을 것이다.
    (리눅스 client 가 공유기 하단에 위치하고 192.168.1.x IP 주소를 사용하는 경우.)

bae@samba:~$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
220.230.5.3     0.0.0.0         255.255.255.255 UH       40 0          0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U        40 0          0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U        40 0          0 lo
0.0.0.0         220.230.5.3     0.0.0.0         UG       40 0          0 ppp0

♣. 비대칭 라우팅을 사용하는 경우의 라우팅 테이블은 "[참고 3]" "1." 에 나와 있다.

[주의]
ip-dgw.tar 를 설치하지 않고 디폴트 게이트웨이를 VPN 으로 변경하면 어떤 결과가 발생하는지 알고 싶으면 시험해 보십시오. 아마도 피시를 리부팅해야 할겁니다. VPN 연결만 끊는다고 해결되지 않습니다.

[버그] eth0 랜카드에 IP 주소가 두 개인 경우는 이 설정이 작동하지 않습니다. 리눅스랩으로 연락해서 수정 파일을 받아야 합니다.

[참고 2]

방화벽 내에서 ppTp VPN 연결

방화벽 내에서 사설 IP를 사용하는 경우에(NAT 방식 방화벽) 방화벽 내의 사설 IP를 사용하는 PC에서 ppTp VPN 을 연결하려면 방화벽에서 VPN 서버 주소(tiger 의 경우 220.230.5.5)로 부터의 ip protocol 47(GRE) 및 tcp source port 1723 번을 VPN을 연결하는 PC의 IP 주소로 port forwarding 해 주어야 한다. (방화벽의 DMZ 구간에 연결할 경우는 상관 없다.)

방화벽이 리눅스라면 아래 설정이 필요하다.
(리눅스를 공유기로 사용하는 경우도 같다.)

방화벽의 인터넷 쪽 인터페이스가 eth1, IP 주소는 222.x.129.9,
방화벽의 랜 쪽 인터페이스가 eth0, IP 주소는 192.168.1.1
VPN 을 연결하는 리눅스 서버의 IP 주소가 192.168.1.7 이라면

  1. iptables -t nat -I POSTROUTING -o eth1 -j SNAT --to 222.x.129.9
    (또는 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE)

  2. iptables -t nat -I PREROUTING -i eth1 -p 47 -d 222.x.129.9 -j DNAT --to 192.168.1.7

  3. iptables -t nat -I PREROUTING -i eth1 -p tcp --sport 1723 -d 222.x.129.9 -j DNAT --to 192.168.1.7
 
[참고 3]
실제 적용 예
[리눅스 client 의 환경]

공유기에 ADSL/VDSL/케이블 모뎀이 연결되어 있고 공유기의 로칼 주소는 192.168.0.1, 리눅스 서버의 주소가 192.168.0.111, 리눅스 첫번째 랜카드(eth0)가 공유기에 연결돼어 있다.(아래 그림 참조)

  1. [Redhat]

    1. /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.0.111
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.1
    

    2. /etc/sysctl.conf 파일

    net.ipv4.ip_forward = 1

    *. 리눅스 client 를 route 로 겸용할 경우에 필요하다.

    3. 위의 설명대로 리눅스랩 ppTp VPN client 프로그램 설치 후 /etc/ppp/pptpc 명령을 실행(또는 리부팅)해서 VPN 연결

    4. VPN 연결 후의 라우팅 테이블 및 인터페이스 주소는 아래와 같다.

    [root@linuxlab] netstat -nr
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    220.230.5.3     0.0.0.0         255.255.255.255 UH        0 0          0 ppp0
    192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
    0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0
    

    리눅스 네트워킹을 아는 사람들은 왜 마지막 줄의 디폴트 게이트웨이가 ppp0 가 아니고 eth0 인지 의아해 할것이다. 이는 외부에서 리눅스의 VPN IP 로 연결은 가능하게하고 리눅스에서 다른 인터넷 사이트를 연결할 때는 ADSL/케이블 모뎀 IP 주소로 나가도록 policy routing 기법을 사용하기 때문이다.

    [root@linuxlab] ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:11:D8:52:0F:D4
              inet addr:192.168.0.111  Bcast:192.168.0.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:16436  Metric:1
    
    ppp0      Link encap:Point-to-Point Protocol
              inet addr:59.150.255.xxx  P-t-P:220.230.5.3  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
    
    
              *. 화면 출력 중 불필요한 부분은 생략했다..
    

  2. [Debian]

    Debian 사용자라면 설명이 필요 없을 것 같다.

  3. 기타

    위와 같이 구성하려면 공유기에 VPN(ppTp) Pass Through 기능이 있어야 한다. 그리고 공유기가 Multi-Session(multi port) 을 지원한다면 공유기에 연결된 다른 PC(192.168.0.2~3) 에서도 동시에 VPN 연결이 가능하다. 위의 경우에는 공유기의 랜 포트에 연결된 PC 에 IP 자동 부여(DHCP)를 사용해도 된다.

    공유기에 VPN Pass Through 기능이 없으면 DMZ 를 사용해야 한다. 공유기에서 DMZ 를 설정하려면 공유기에 연결된 모든 PC(리눅스도 포함)의 IP를 수동으로 부여해야 한다. 그리고서 공유기에서 DMZ IP 주소를 리눅스 client 의 IP 주소로 지정한다.(DMZ를 사용한다면 한 대에서만 VPN 연결이 가능하다.)

  4. 참고자료

    리눅스랩 ppTp 사이트
    ppTp 자주받는 질문
    라이브라 L4 Switch

[참고 4]
정상적인 연결이 이루어 졌을 때의 client 쪽 /var/log/debug 파일 내용
(배포본에 따라서는 syslog, daemon.log 에 나올 수도 있다.)

*. /etc/ppp/options 에 debug 를 넣을 것.

Oct 10 15:15:40 samba pppd[25626]: using channel 8
Oct 10 15:15:41 samba pppd[25626]: sent [LCP ConfReq id=0x1    ]
Oct 10 15:15:41 samba pppd[25626]: rcvd [LCP ConfReq id=0x1     ]
Oct 10 15:15:41 samba pppd[25626]: sent [LCP ConfAck id=0x1     ]
Oct 10 15:15:41 samba pppd[25626]: rcvd [LCP ConfAck id=0x1    ]
Oct 10 15:15:41 samba pppd[25626]: sent [LCP EchoReq id=0x0 magic=0x4adeccad]
Oct 10 15:15:41 samba pppd[25626]: rcvd [LCP EchoReq id=0x0 magic=0x2dcd9a7b]
Oct 10 15:15:41 samba pppd[25626]: sent [LCP EchoRep id=0x0 magic=0x4adeccad]
Oct 10 15:15:41 samba pppd[25626]: rcvd [CHAP Challenge id=0x1 \
<98672bc235a6dee925c9c372ef5d073ec561a384>, name = "libra"]
Oct 10 15:15:41 samba pppd[25626]: sent [CHAP Response id=0x1 \
<13b202bcab861afd11bd91702c18e701>, name = "admin"]
Oct 10 15:15:41 samba pppd[25626]: rcvd [LCP EchoRep id=0x0 magic=0x2dcd9a7b]
Oct 10 15:15:41 samba pppd[25626]: rcvd [CHAP Success id=0x1 "Welcome to libra."]
Oct 10 15:15:41 samba pppd[25626]: sent [IPCP ConfReq id=0x1  ]
Oct 10 15:15:41 samba pppd[25626]: rcvd [IPCP ConfReq id=0x1  ]
Oct 10 15:15:41 samba pppd[25626]: sent [IPCP ConfAck id=0x1  ]
Oct 10 15:15:42 samba pppd[25626]: rcvd [IPCP ConfNak id=0x1 ]
Oct 10 15:15:42 samba pppd[25626]: sent [IPCP ConfReq id=0x2  ]
Oct 10 15:15:42 samba pppd[25626]: rcvd [IPCP ConfAck id=0x2  ]
Oct 10 15:15:42 samba pppd[25626]: Script /etc/ppp/ip-up started (pid 25630)
Oct 10 15:15:42 samba pppd[25626]: Script /etc/ppp/ip-up finished (pid 25630), status = 0x0

*. 마지막 줄의 "status = 0x0" 에서 0x0 대신 다른 코드가 나오면 debug 파일 내용과 사용 배포본, 커널 버전(uname -a), pptp 버전(pptp 명령을 준다.), pppd 버전 등을 메일(위의 메일 주소에서 _nospam 을 제거)로 보내 주십시오.
이 에러가 뜨면 VPN 을 연결해도 외부에서 VPN 으로 받은 IP로 접속이 안된다.

L4, QOS, Firewall, VPN 기능을 모두 갖춘 국내 유일의 L4 Switch Libra

LinuxLab          http://www.linuxlab.co.kr