PPTP VPN 서버 구성하기

길라잡이 0 359 2020.03.24 08:59

리눅스 서버를 이용하여 간단하게 VPN 환경을 구성할 수 있는 방법 중 하나가 GRE Tunneling 방식의 PPTP를 이용한 VPN 구성이다. 이 글은 PPTP를 이용하여 원격지의 망과 내 PC를 연결하는 방법에 대한 간단한 소개이다.

VPN은 Virtual Private Network의 줄인 말인데, 요즘 가뜩이나 가상화에 대한 용어가 많아서 “이것도 요즘 유행하는 그런 거야?” 하는 생각이 들 수도 있을 것 같다. 그런데, 딱히 그런 것은 아니다. 물리적인 망의 경계를 넘어 망을 확장/연결해야 하는 필요성은 이미 오래 전부터 있어왔던 숙제였고, 이를 해결하기 위한 다양한 방식의 솔루션들이 꽤 오래전부터 사용되어 왔다.

오늘 구성해보려고 하는 PPTP, 즉 Point to Point Tunneling Protocol은 이러한 VPN을 구현하는 방식 중 하나로, 이름에서 알 수 있듯이 연결하려는 양 종단을 Tunneling 기법으로 연결하여 하나의 Network Segment 처럼 느낄 수 있게 해주는 기술이다.

VPN과 PPTP에 대한 자세한 설명은 아래 URL을 참고하면 될 것 같다.

이 글은, 요즘 진행중인 OpenStack 기반 클라우드 컴퓨팅 환경에 대한 시험을 진행하던 중, 대상 네트워크의 Miniature 성격으로 꾸며진 폐쇄망 시험환경을 시끄러운 전산센터에 들어가지 않고 사무실에서 쉽게 접속하여 업무 진행을 할 수 있도록 하기 위한 목적으로 진행된 작업의 기록이기도 하다.

PPTP VPN 서버 구성

VPN을 구현하는 다양한 방법이 있지만, 그 중에서 가장 간단한 방법 중 하나가 PPTP를 사용하는 것이다. 이번 작업은, 미리 준비한 “깨끗하게 설치된” Ubuntu 리눅스 환경을 기준으로 설치 및 설정을 진행하였다. (이 외의 어떤 설정의 영향도 없다는 의미인데 말이 좀 이상하네… ㅋㅋㅋ)

설치

먼저, 관련된 패키지를 설치해야 한다. Ubuntu 리눅스에서 PPTP 기능은 pptpd 라는 패키지를 통해서 제공된다.

$ sudo apt-get install pptpd
<...>
The following NEW packages will be installed:
  bcrelay pptpd
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 105 kB of archives.
After this operation, 364 kB of additional disk space will be used.
<...>
$ 

설치는 이렇게 간단하게 된다. 참고로, 함께 설치되는 bcrelay라는 패키지는 pptpd가 사용하는 ppp 인터페이스를 사용하여 Bridge를 구성할 수 없는 점을 극복하게 해주는 역할 등에 사용 가능한 Broadcast Relay 유틸리티인데, 이번 구성에서는 사용되지 않는다.

설정 및 구동

설정 역시 설치만큼이나 간단하다. 아래와 같이, /etc/pptpd.conf 파일에 양단에서 사용할 IP를 등록하는 것 만으로 모든 설정이 끝나게 된다. 물론, 이런 저런 옵션이 있지만, 이미 원저작자 및 Debian Package Maintainer가 손봐둔 기본 설정으로 충분하다. (역시, 참 편하다. :-)

$ cat |sudo tee -a /etc/pptpd.conf <<EOF
> 
> localip 192.168.13.254
> remoteip 192.168.13.240-249
> EOF

localip 192.168.13.254
remoteip 192.168.13.240-249

$ 

위의 설정에서 localip는 단 하나의 값을 갖게 되는데, 이건 VPN을 제공하는 서버가 사용할 IP를 지정하는 부분이기 때문에 그렇다. remoteip 값은 보통, IP 주소의 대역으로 지정이 된다. VPN 서버를 통하여 접속하는 Client의 수가 하나 이상인 경우가 대부분일테니, 당연한 얘기이다.

우리의 예에서는 VPN 서버에서 사용하는 IP 대역과 같은 192.168.13.0/24 안의 주소 중에서 값을 골라 사용하였다. 참고로, 해당 망의 구성은 다음과 같다.

주소내용
192.168.13.0/24목표 환경의 네트워크
192.168.13.1목표 환경의 Gateway 주소
192.168.13.3VPN 제공서버의 실제 IP
192.168.13.254VPN 접속지 주소

위와 같이 PPTP 서비스이 설정을 마쳤다면 다음은 사용자 인증 부분이다. 좀 약해보이기는 하는데, 아래와 같이 /etc/ppp/chap-secrets 파일에 공백으로 분리된 값을 넣어주는 방식이 사용된다. Root만 읽을 수 있다고는 해도 Plain Text로 저장된 파일이며, 사용자가 암호 변경을 하기도 좀 애매한 부분이어서 보안 관점에서는 좀… 그렇다. ㅋ)

$ cat |sudo tee -a /etc/ppp/chap-secrets <<EOF
> sio4          pptpd   p4ssw0rd                   *  
> EOF
sio4          pptpd   p4sswr0d                   *

$ 

위의 설정은, sio4 라는 이름의 사용자가 p4ssw0rd라는 암호를 사용한다고 등록하는 예이다. (이 파일은 일반 사용자가 읽을 수 없는 권한으로 설정해야 하며, 이 부분을 암호화 하는 방식이나 DBMS를 활용하거나 별도의 인증 체계와 연동하는 방법을 찾아보면 더 유용할 것 같다.)

이제 서비스를 시작해보자.

$ sudo systemctl start pptpd
$ sudo systemctl status pptpd
* pptpd.service - PoPToP Point to Point Tunneling Server
   Loaded: loaded (/lib/systemd/system/pptpd.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2015-09-20 21:02:39 KST; 1s ago
 Main PID: 10102 (pptpd)
   CGroup: /system.slice/pptpd.service
           `-10102 /usr/sbin/pptpd --fg

Sep 20 21:02:39 station systemd[1]: Started PoPToP Point to Point Tunneling...r.
Sep 20 21:02:39 station systemd[1]: Starting PoPToP Point to Point Tunnelin.....
Sep 20 21:02:39 station pptpd[10102]: MGR: Maximum of 100 connections reduc...en
Sep 20 21:02:39 station pptpd[10102]: MGR: Manager process started
Sep 20 21:02:39 station pptpd[10102]: MGR: Maximum of 10 connections available
Hint: Some lines were ellipsized, use -l to show in full.
$ 

로그를 잠깐 보면, pptpd 데몬이 시작되었고, 설정에 의해 전체 100개의 연결을 허용하고 있으나, remoteip 값이 작은 범위로 설정된 까닭에 최대 연결의 수가 다시 10으로 조정된 것을 볼 수 있다.

서버의 준비는 일단, 끝났다.

Client 설정

이제 서버의 설정이 끝났으니 붙여볼 차례! 내 PC가 Ubuntu 리눅스인 관계로, Ubuntu Desktop 환경을 중심으로 설명한다. 내용면에서, 윈도나 기타 Client 환경도 동일한 방식과 원리가 적용될 것이니, 참고용으로는 충분할 것 같다.

먼저, 우측 상단에 위치한 네트워크 설정 부분의 “연결편집” 메뉴나 “가상 사설망 설정” 메뉴를 이용하면 아래와 같은 대화상자를 볼 수 있다.

여기서 “추가” 단추를 눌러주면, 아래와 같이 어떤 연결을 만들지 결정하는 대화상자가 나타나게 된다. 물론, 해당 Client 설정을 지원하는 패키지가 미리 설치되어 있어야 하지만, 아래와 같이 “포인트투포인트 터널링 프로토콜“을 선택해준다.

이제 “만들기” 단추를 눌러주면 아래와 같이, 본격적인 설정이 가능한 대화상자가 나타나게 된다.

위의 대화상자에서 “연결 이름“은 그냥 사용자가 인지하기 위한 이름이니 적당히 원하는 이름을 넣어주면 되는데, 보통은 망의 이름을 쓰게 된다. 아래 “게이트웨이” 부분은 PC에서 직접 접속 가능한 주소나 Hostname을 입력하는 곳으로, 여기서 사용한 station이라는 이름은 미리 /etc/hosts 파일에 설정해둔 PPTP 서버의 외부 주소이다.

외부 주소라고 표현한 이유는, PPTP가 사용되는 이유가 직접 접속할 수 없는 망에 접속하기 위한 것이므로 해당 서버가 해당 망 IP 밖에 가지지 않았다면 접속 자체가 불가능하게 된다. 따라서 PPTP 서버는 둘 이상의 인터페이스를 가지거나, NAT 등의 별도 설정이 되어진, 원격 접속이 가능한 서버여야 한다.

여기서는, 외부 공인 IP주소로 NAT가 되어있는 서버를 사용하였다.

사용자 이름“이나 “암호“는 서버 설정 과정에서 지정한 정보로 꼭 입력해야 하는 부분이지만, 추가 설명은 필요없을 것 같다. :-) 다음은 “IPv4 설정” 탭을 열어본다.

이 탭의, 위의 그림과 같이 연결되는 가상망에 대한 PC쪽 종단의 IP주소 등을 어떻게 설정할지를 결정하는 부분이다. DHCP 설정과 유사한 모습을 갖는데, 여기서는 IP주소만 자동으로 가져오는 방식으로 설정하였다. (이미 PC에 있는 DNS, Domain 등의 정보는 기존 것으로 유지한다는 의미이다.)

이렇게 설정을 마치고 다시 네트워크 메뉴에서 저장된 설정을 선택하게 되면, 우상단 네트워크 연결 표시 부분이 애니메이션으로 깜박거리다가, 위와 같은 Popup이 뜨면서 연결이 마무리되면 모든 것이 성공적으로 된 것이다.

얼쑤!

라고 외치고 싶었지만, 한 번에 끝나지 않았다! 한 번에 끝나면 재미없다.

Trouble Shooting

위와 같이 “성공” 메시지를 한 번에 봤으면 좋았으련만… 그러나 내가 본 것은 “실패” 메시지였다. (따로 화면을 잡지는 않았다.) 그래서 서버에서는 어떤 일이 벌어졌는지 로그를 확인해보니…

WTMP 문제

$ tail -f /var/log/syslog
<...>
Sep 19 03:17:12 station pptpd[9585]: CTRL: Client 10.45.60.5 control connection started
Sep 19 03:17:13 station pptpd[9585]: CTRL: Starting call (launching pppd, opening GRE)
Sep 19 03:17:13 station pppd[9586]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so is for pppd version 2.4.5, this is 2.4.6
Sep 19 03:17:13 station pptpd[9585]: GRE: read(fd=6,buffer=7fbae9ae54a0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
Sep 19 03:17:13 station pptpd[9585]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)
Sep 19 03:17:13 station pptpd[9585]: CTRL: Reaping child PPP[9586]
Sep 19 03:17:13 station pptpd[9585]: CTRL: Client 10.45.60.5 control connection finished
<...>

뭐래는거니? 세 번째 줄에 보면, pptpd-logwtmp.so 파일이 pppd 2.4.5용의 것인데, 지금 사용되는 pppd는 2.4.6이라서 호환이 안된다는 얘기다. 뭐냐… Ubuntu/Debian 패키지의 깔끔함을 칭친한 게 불과 몇 십줄 전인데… :-(

찾아보니, 이미 오래전부터 반복적으로 일어나는 이슈인 것 같다. 일단, 아래와 같이 응급 조치를 할 수 있다. (해당 기능을 죽이는 방식)

$ sudo sed -i 's/^logwtmp/# bug-1451419 logwtmp/' /etc/pptpd.conf 
$ sudo systemctl restart pptpd

이렇게 pptpd.conf 파일을 수정하여 logwtmp를 사용하지 않는 것. 사용자 접속 로깅을 하지 않는 것이 좀 싫기는 하지만, 기능상 문제가 되지 않으며, pptpd 자체의 로그가 쌓이지 않는 것은 아니니까…

자세한 내용은 이 글을 참고하기 바란다.

허허… 이렇게 끝나면 좋으련만, 또 하나의 문제를 만났다.

MPPE 오류

일단 로그를 보자.

<...>
Sep 19 03:26:01 station pptpd[9724]: CTRL: Client 10.45.60.5 control connection started
Sep 19 03:26:02 station pptpd[9724]: CTRL: Starting call (launching pppd, opening GRE)
Sep 19 03:26:02 station pppd[9725]: pppd 2.4.6 started by root, uid 0
Sep 19 03:26:02 station pppd[9725]: Using interface ppp0
Sep 19 03:26:02 station pppd[9725]: Connect: ppp0 <--> /dev/pts/1
Sep 19 03:26:02 station pppd[9725]: peer from calling number 10.45.60.5 authorized
Sep 19 03:26:02 station systemd[1]: Started ifup for ppp0.
Sep 19 03:26:02 station systemd[1]: Starting ifup for ppp0...
Sep 19 03:26:02 station sh[9759]: Unknown interface ppp0
Sep 19 03:26:02 station pppd[9725]: MPPE required but peer negotiation failed
Sep 19 03:26:02 station kernel: [20329.791165] PPP MPPE Compression module registered
Sep 19 03:26:02 station pppd[9725]: Connection terminated.
Sep 19 03:26:02 station pppd[9725]: Connect time 0.0 minutes.
Sep 19 03:26:02 station pppd[9725]: Sent 10 bytes, received 43 bytes.
Sep 19 03:26:02 station systemd[1]: Stopping ifup for ppp0...
Sep 19 03:26:02 station ifdown[9774]: /sbin/ifdown: interface ppp0 not configured
Sep 19 03:26:02 station systemd[1]: Stopped ifup for ppp0.
Sep 19 03:26:02 station pppd[9725]: Exit.
Sep 19 03:26:02 station pptpd[9724]: GRE: read(fd=6,buffer=7f2d492564a0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
Sep 19 03:26:02 station pptpd[9724]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)
Sep 19 03:26:02 station pptpd[9724]: CTRL: Reaping child PPP[9725]
Sep 19 03:26:02 station pptpd[9724]: CTRL: Client 10.45.60.5 control connection finished
<...>

뭐래니? 찬찬히 들여다보니, 역시 pppd가 뭔가 못마땅한 부분이 있는 것이다.

로그의 중간 정도를 보면, MPPE가 필요한데 Peer와 협상이 결렬되었다고! 이게 무슨 소리? 클라이언트에서 뭔가 덜 해준 느낌이니 앞서 진행한 설정을 다시 열어보자. 그 중에서, “가상 사설망” 탭의 “고급” 단추가 눈에 띈다. 단추를 눌러 대화상자를 열어보니 아래와 같다.

다양한 “인증” 방법이 나오고, 그 아래 “보안 및 압축“이라는 부분이 눈에 띈다! “포인트투포인트 암호화(MPPE) 사용“이라니! 바로 위의 로그가 말하는 그것. 이것을 아래와 같이 선택해준다.

설정을 마치고 다시 접속을 해보면, 이번에는 정상적으로 연결된 것을 확인할 수 있다!

정상 연결 로그

<...>
Sep 20 21:15:24 station pppd[10405]: local  IP address 192.168.99.1
Sep 20 21:15:24 station pppd[10405]: remote IP address 192.168.99.10
<...>
Sep 20 21:26:54 station pptpd[10771]: CTRL: Client 10.45.60.5 control connection started
Sep 20 21:26:55 station pptpd[10771]: CTRL: Starting call (launching pppd, opening GRE)
Sep 20 21:26:55 station pppd[10772]: pppd 2.4.6 started by root, uid 0
Sep 20 21:26:55 station pppd[10772]: Using interface ppp0
Sep 20 21:26:55 station pppd[10772]: Connect: ppp0 <--> /dev/pts/1
Sep 20 21:26:55 station systemd[1]: Started ifup for ppp0.
Sep 20 21:26:55 station systemd[1]: Starting ifup for ppp0...
Sep 20 21:26:55 station pppd[10772]: peer from calling number 10.45.60.5 authorized
Sep 20 21:26:55 station sh[10776]: Unknown interface ppp0
Sep 20 21:26:55 station pppd[10772]: MPPE 128-bit stateless compression enabled
Sep 20 21:15:24 station pppd[10405]: Cannot determine ethernet address for proxy ARP
Sep 20 21:26:55 station pppd[10772]: found interface p1p1 for proxy arp
Sep 20 21:26:55 station pppd[10772]: local  IP address 192.168.13.254
Sep 20 21:26:55 station pppd[10772]: remote IP address 192.168.13.240

정상 해제 로그

<...>
Sep 20 21:28:14 station pppd[10772]: LCP terminated by peer (MPPE disabled)
Sep 20 21:28:14 station pppd[10772]: Connect time 1.4 minutes.
Sep 20 21:28:14 station pppd[10772]: Sent 168 bytes, received 168 bytes.
Sep 20 21:28:14 station pptpd[10771]: CTRL: Reaping child PPP[10772]
Sep 20 21:28:14 station pppd[10772]: Modem hangup
Sep 20 21:28:14 station pppd[10772]: Connection terminated.
Sep 20 21:28:14 station systemd[1]: Stopping ifup for ppp0...
Sep 20 21:28:14 station ifdown[10822]: /sbin/ifdown: interface ppp0 not configured
Sep 20 21:28:14 station systemd[1]: Stopped ifup for ppp0.
Sep 20 21:28:14 station pppd[10772]: Exit.
Sep 20 21:28:14 station pptpd[10771]: CTRL: Client 10.45.60.5 control connection finished

클라이언트가 연결된 상태에서 서버측 인터페이스 상태를 보면, 아래와 같이 각 연결에 대하여 각각 하나씩의 ppp 인터페이스가 생성되는 것을 볼 수 있다.

Comments

번호 제목 글쓴이 날짜 조회
143 애드센스 차단설정으로 광고 클릭율 높이기 길라잡이 2021.01.31 222
142 워드프레스 댓글 설정 비활성화 방법 길라잡이 2021.01.23 250
141 엑셀 위 아래 순서 바꾸기 길라잡이 2021.01.21 1187
140 구글 커스텀 서치 구글맞춤검색 적용 하기 길라잡이 2020.12.18 263
139 워드프레스에서 '미분류' 카테고리(혹은 '분류되지 않음')를 삭제하는 방법 길라잡이 2020.12.17 345
138 워드프레스 미디어 업로드 폴더 변경하는 방법 길라잡이 2020.12.13 446
137 워드프레스 원페이지 길라잡이 2020.12.11 229
136 워드프레스 메인(전면)페이지 수정방법 길라잡이 2020.12.11 454
135 워드프레스 AMP for WP 플러그인에서 전면 페이지 설정 방법 길라잡이 2020.11.20 297
134 엑셀 방향키 누르면 엑셀 화면이 움직일때 해결법 길라잡이 2020.11.10 260
133 엑셀 특정 문자를 포함하는 행 추출 길라잡이 2020.10.21 2792
132 구글 크롬 단축키와 유용한 단축키 길라잡이 2020.10.15 239
131 CSV 파일 엑셀에서 한글 깨짐 현상 해결방법 길라잡이 2020.09.22 680
130 구글애드센스 그누보드 사이트중 특정페이지만 광고 안나오게 하기 길라잡이 2020.09.12 250
129 구글 애드센스 광고를 특정 블로그 포스팅, 페이지에서 안 나오게 하는 방법 길라잡이 2020.09.12 234
128 크롬문제 네이버 블로그글쓰기오류와 COOLNEWTABTHEME 야후로 검색되는 등 크롬안될때 길라잡이 2020.08.22 296
127 윈도우 10 시작 메뉴 타일에 파일 등록하는 방법 길라잡이 2020.06.18 637
126 스마트폰 구글 계정 삭제하는 법 길라잡이 2020.06.14 350
125 구글 계정 만들기 여러개 전화번호 인증 없이 만드는 법 길라잡이 2020.06.14 350
124 크롬 자동 업데이트 막는 방법 (윈도우10 기준) 길라잡이 2020.05.29 482
123 [autoset] Autoset (오토셋) 사용법 2 - 오토셋 설치하는 법 / 오토셋에 홈페이지 개설하는 … 길라잡이 2020.03.24 550
122 리눅스에서 VPN서버 구축하기 (pptp방식) 길라잡이 2020.03.24 579
121 Windows-10 ppTp VPN(가상사설망) 설정 길라잡이 2020.03.24 338
120 ipTIME공유기로 VPN 서버 구축하기 길라잡이 2020.03.24 382
119 윈도우에서 VPN 설정하기 길라잡이 2020.03.24 356
118 VMware 네트워크 설정 길라잡이 2020.03.24 333
117 [VMware] CentOS 네트워크 설정 방법 길라잡이 2020.03.24 471
열람중 PPTP VPN 서버 구성하기 길라잡이 2020.03.24 360
115 VMware10 Centos7 환경에서 Xshell연결하고, MongoDB 설치하기 길라잡이 2020.03.23 403
114 Windows 10에서 VPN(PPTP) 연결하는 방법 길라잡이 2020.03.23 302


 

페이스북에 공유 트위터에 공유 구글플러스에 공유 카카오스토리에 공유 네이버밴드에 공유