시험 환경
- PPTP Client : 아이폰4(iOS 4.1)
- PPTP Server : 리눅스 (CentOS 5.5)
- 네트워크 구성 : 아이폰<공인IP 1> ---- <공인IP 2>공유기<192.168.10.1> --- <192.168.10.3>리눅스 서버
개요
PPTP는 TCP 1723번을 통해서 연결을 하고 제어를 담당한다. 터널링된 데이터가 오가지는 않는다. PPTP는 연결이 되면 서로 GRE 터널을 통해서 PPP를 전달하게 되고 PPP는 실제 전달하고자 하는 프로토콜을 전달한다. TCP인 경우를 생각하면 TCP over PPP over GRE 가 되는 것이다. 인증 등의 기능은 PPP를 이용하게 된다.
리눅스 서버에 패키지 설치
PPTP 서버인 poptop 패키지를 리눅스 서버에 설치하기 위해서 poptop repository를 추가한다.
$ rpm -ivh 'http://poptop.sourceforge.net/yum/stable/fc7/pptp-release-current.noarch.rpm'
최신 버전을 원할 경우에 /etc/yum.repos.d/pptp.repo에서 [poptop-beta]의 enabled=1로 한다. 나는 그렇게 했다.
pptpd를 설치한다. pptpd와 궁합이 맞는 최신 버전의 ppp도 같이 설치될 것이다.
$ yum install pptpd
pptpd 설정하기
/etc/pptpd.conf에서는 localip와 remoteip를 설정하면 된다. 나머지 설정은 man pptpd.conf를 참조하면 된다. remoteip는 PPP 클라이언트의 IP가 되고 localip는 PPP 서버의 IP가 된다.
연결이 되면 ppp0와 같은 인터페이스가 생성이 되고 localip가 pppX 인터페이스에 할당이 된다.
클라이언트와 서버가 PPTP로 연결이 되면 둘 사이의 통신이 이루어 진다. 클라이언트에서 모든 통신을 PPTP 터널을 통해서 할 경우에 모든 패킷이 서버로 전달이 되는데 수신한 패킷을 외부로 보냈다가 응답을 받아서 다시 클라이언트에게 전달하는 것은 PPTP와는 관계가 없는 라우팅 설정 문제가 된다.
이러한 라우팅 문제를 해결하는 방법으로는 다음과 같은 방법이 있다.
- 외부의 라우터에서 처리하기 : 클라이언트에 할당된 remoteip에 대해서 서버로 라우팅을 하도록 외부에 있는 라우터 혹은 게이트웨이를 설정하는 것이다.
- NAT를 이용하기 : remoteip가 서버를 떠나기 전에 NAT를 적용해서 서버의 IP를 달고 가도록 한다. 도착한 패킷을 역으로 remoteip로 변경해서 전달하게 된다.
- Proxy ARP 이용하기 : 현재 사용하고 있는 네트워크와 같은 대역을 클라이언트 IP로 설정한다. 여기서는 192.168.10.X가 된다. 그리고 localip를 설정하지 않는다. 그러면 proxy ARP 설정이 자동으로 적용이 되는 것 같다. 외부에서의 remoteip에 대한 ARP 요청에 대해서 서버가 응답을 하게 된다.
PPP 설정하기
/etc/pptpd.conf 에는 사용한 ppp 옵션 설정 파일을 지정하는 부분이 있는데 아래와 같이 되어 있을 것이다.
option /etc/ppp/options.pptpd
options.pptpd에서는 DNS 설정만 확인하면 된다. PPTP가 연결이 되면 클라이언트에게 DNS 서버 정보를 넘기는 것으로 보인다. 아래와 같이 ms-dns를 설정한다.
ms-dns 168.126.63.1
ms-dns 168.126.63.2
ID, 암호 설정
/etc/ppp/chap-secrets 파일에 ID, 암호를 설정한다. 다음과 같이 하면 된다. 두 번째 필드인 pptpd는 /etc/ppp/options.pptpd 설정의 name 옵션 값과 일치해야 하는데 pptpd로 설정되어 있을 것이다.
<ID> pptpd <PW> *
ip_forward 및 방화벽 설정
/proc/sys/net/ipv4/ip_forward 설정을 변경해서 패킷 라우팅을 허용해야 한다.
/etc/sysctl.conf를 다음과 같이 설정한다.
net.ipv4.ip_forward = 1
다음 명령으로 변경 내용을 바로 적용한다.
$ sysctl –p
iptables를 사용하고 있는 경우라면 다음과 같이 방화벽을 열어주어야 한다.
$ iptables –I INPUT –p gre –j ACCEPT
$ iptables –I INPUT –p tcp –m state –state NEW –m tcp –dport 1723 –j ACCEPT
$ iptables –I FORWARD –i ppp+ –j ACCEPT
공유기 설정
공유기를 사용하는 경우라면 마찬가지로 GRE, PPTP에 대한 port forwarding 설정을 해 주어야 한다.
주요 설정 정리
설정 파일 중 확인해야 할 내용만 정리하면 다음과 같다. 기존 설정은 그대로 두고 아래 부분만 변경하면 된다.
/etc/pptpd.conf
options /etc/ppp/options.pptpd
connections 10
remoteip 192.168.10.101-110
/etc/ppp/options.pptpd
name pptpd
ms-dns 168.126.63.1
ms-dns 168.126.63.2
/etc/ppp/chap-secrets
<ID> pptpd <PW> *
/etc/sysctl.conf
net.ipv4.ip_forward = 1
디버깅
연결이 잘 되지 않을 경우에는 /etc/pptpd.conf에서 debug 옵션을 활성화하고 /var/log/messages 를 보도록 한다.
아이폰 설정하기
아이폰 설정은 간단하다.
설정 > VPN > VPN 구성 추가 ... > PPTP 에서
설명 : 적당한 설명 적어준다.
서버 : 공유기 공인 IP 설정
계정 : chap-secrets 파일에 적은 <ID>
암호 : chap-secrets 파일에 적은 <PW>
나머지는 변경하지 않는다.