VPN

VPN(Virtual Private Network, 가상 사설 네트워크)은 공용망(public)(인터넷)을 사설망(private)처럼 사용할 수 있도록 하는 기술이다. 보안 면에서는 전용망을 이용하는 것이 가장 좋으나 비용, 망 관리 등의 부담이 있어 가상 사설망이 등장하게 되었다.

사설망의 예로 공유기가 있다. 이 경우 내부 PC 들은 192.168.x.y 등의 IP 주소를 가지며, 인터넷이 되지 않더라도 내부 PC들 간에는 통신이 가능하다. 가상 사설망을 구축하는 경우에도 192.168.x.y 등의 별도 IP를 할당 받는다.

VPN은 PPTP, L2TP/IPsec, OpenVPN 등의 프로토콜이 있으며, 각각의 장단점이 있다. 이 페이지에서는 각 프로토콜의 장단점을 간략히 살펴보고, PPTP와 OpenVPN 설치 방법을 정리한다. 특히 미국과 영국이 VPN에 침입하고 있어 이에 대해서도 간략히 다룬다1).

  • Point-to-Point Tunnelling Protocol
  • Layer 2 Tunnel Protocol(L2TP/IPsec)
  • OpenVPN

다음 표는 여러 사이트의 자료를 정리한 것이다2). (:!: 해당 사이트로부터 정보가 갱신되었다는 연락이 와서 최신 내용으로 갱신하였다. 하지만, 세부 내용에는 변경된 내용이 있겠지만, 이 블로그에서는 워낙 개략적인 내용만 다뤄놔서 크게 바뀐 것은 없다.)

장점 단점 비고
PPTP 거의 모든 플랫폼에서 클라이언트 내장
쉬운 설치
빠른 속도
구식3)
심각한 보안 수준
L2TP/IPsec 일반적으로 높은 보안성
쉬운 설치
거의 모든 최신 플랫폼에 내장됨
NSA에서 해독 의혹
OpenVPN에 낮은 속도
방화벽에 막히는 경우 존재
OpenVPN 세밀하게 설정 가능
매우 높은 보안성
방화벽 통과 가능
다양한 암호화 알고리즘 사용 가능
오픈 소스(NSA의 백도어 설치 등을 감시 가능)
대부분의 플랫폼에서 클라이언트 별도 설치 필요
어려운 설치

라즈베리 파이의 성능을 고려하여 PPTP를 설치하였다. 사용에는 별 문제가 없었으나 방화벽을 사용하는 곳에서는 VPN 서버에 접속이 되지 않는 단점이 있어 결국 설치만 하고 사용은 하지 않았다.

설치는 매우 간단하다.

sudo apt-get install pptpd

다음으로 우선 가상 사설망에서 사용할 IP 대역을 정한다.

sudo vi /etc/pptpd.conf

파일 가장 아래 쪽에 (Recommended)가 있고 그 아래에 localipremoteip가 있다. 우선 가장 앞에 '#'을 지우고 인터넷 공유기를 쓴다면 공유기가 사용하지 않는 값을 넣어주자. 예를 들어 다음과 같이 수정한다.

# (Recommended)
localip 192.168.2.1
remoteip 192.168.2.234-238,192.168.2.245

마지막으로 VPN 계정을 설정한다.

sudo vi /etc/ppp/chap-secrets

이 파일을 다음과 같이 수정한다. :!:당연히 youridpassword 자리에 자신이 원하는 ID와 비밀번호를 넣는다.

# Secrets for authentication using CHAP
# client    server  secret          IP addresses

yourid      pptpd   password        *

:!::!::!:문제는 이 파일이 비밀번호 암호화를 지원하지 않는다는 점이다. 누군가 이 파일을 열면 암호를 그대로 확인할 수 있다. 이를 방지하는 몇몇 방법이 있으나 더 전문적인 블로그를 찾기 바라고, 그냥 노출돼도 괜찮은 암호를 사용하자.

마지막으로 공유기를 사용하는 경우 TCP 1723 포트를 서버로 포트포워딩하자. 방화벽을 이용하는 경우에도 1723 포트를 개방하여야 한다.

TX100을 사용하여 서버를 재구성하고 이번에는 더 강력한 OpenVPN을 사용하였다. 여러 기관에서 사용하는 방화벽도 OpenVPN을 막지 못해 자신의 인터넷 사용에 대한 감시를 피할 수 있다. 단, 이를 사용한다고 모든 정보를 숨길 수 있는 것은 아니라는 것을 다시 강조한다. 자기 서버에 VPN 서버를 설치하여 운영할 경우, 이 곳에 연결하여 인터넷을 하면 집 서버가 인터넷을 하는 것으로 나타난다. 예를 들어, 어느 기관에서 특정 사이트를 막아서 사용이 불편할 경우, 그 기관 내의 PC에서 자기 집 OpenVPN 서버에 접속하면 해당 기관이 그 사이트를 막는 것은 불가능하다. 그러나 누군가 자기 집 네트워크를 감시하고 있다면, 이 정보는 유출 될 수 있다.

설치

설치는 간단하다. 설치하는김에 blacklist까지 설치하였다.

sudo apt-get install openvpn openvpn-blacklist

인증서 생성

openvpn를 사용하기 위해서는 서버 인증서와 각 클라이언트를 위한 인증서가 필요하다. 서버 인증서란 서버를 증명하기 위한 인증서이고, 클라이언트 인증서란 각 사용자에 대해 부여하는 인증서이다. 이 문서에서는 dav 설정 시 생성한 루트인증서를 이용하여, 서버 인증서와 클라이언트 인증서를 만드는 법을 설명한다4).

하위_인증서를 만드는 요령대로 서버 인증서와 클라이언트 인증서를 만든다. CN입력에 신경을 써야 하며, 서버 인증서의 CN을 서버의 도메인명을 쓰는 것이 무난하고, 클라이언트 인증서는 각 사용자의 id를 입력하는 것이 무난하다.

서버 기본 설정

이제 설정 파일을 만들어야 한다. /etc/openvpn에 기본 설정 파일이 없고 샘플이 별도 폴더에 존재한다.

cd /etc/openvpn/
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/openvpn.conf.gz
gzip -d openvpn.conf.gz
vi openvpn.conf

중간에 ca, cert, key, dh가 있다.

ca	/.../host.crt
cert	/.../server.crt
key	/.../server.pem

dh	/.../dh1024.pem

클라이언트 설정

  • OpenVPN 다운로드 및 설치
    • http://openvpn.net/의 커뮤니티에서 자신의 플랫폼에 맞는 버전 다운로드
    • 설치 경로를 “C:\Program Files\OpenVPN”으로 할 경우 이후 과정에서 매번 관리자 모드 필요
  • 기본 설정 파일 복사
    • sample-config에서 client.ovpn 파일을 config 폴더에 복사
  • 인증서 복사
    • 이전 과정에서 만든 루트 인증서와 클라이언트 인증서 및 키를 config 폴더에 복사
      • ca.crt, client.crt, client.key
  • 설정 파일 수정
    • 서버 주소 설정
      • remote my-server-1 1194을 자신의 vpn 서버 주소와 포트번호로 수정
    • 인증서 파일 이름 수정
      • ca, cert, key의 파일 이름을 자신에게 맞도록 수정

:!: 중간 점검 이 과정까지 마치면 vpn 연결을 할 수 있다. 그러나 모든 정보를 vpn 서버를 통하여 전달하고자 하는 경우에는 redirect, forward 관련 추가 설정이 필요하다.

서버 추가 설정

  • redirect 설정
    • openvpn.conf에서 다음 주석 해제 및 DNS 주소 변경
      • push “redirect-gateway def1 bypass-dhcp”
      • push “dhcp-option DNS 168.126.63.1”
      • push “dhcp-option DNS 8.8.8.8”
  • ip_forward 허용
    • /etc/sysctl.conf에서 net.ipv4.ip_forward=1의 주석 해제
  • iptables 변경
    • 다음을 콘솔에 입력
    • iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

이 과정까지 마치면 모든 통신을 vpn 서버를 경유하여 이용할 수 있다. myip.net 등에서 ip를 확인하면 서버의 ip로 나올 것이다.

클라이언트 최적화

:!: 확인중. 따라하지 말자.

openvpn의 경우 통신 패킷에 60바이트 가량이 추가된다. 이에 따라 MTU 최적화가 필요할 수 있다. MTU의 최적 값은 프로그램을 이용할 수도 있지만 간단하게 윈도우 콘솔에서 지원하는 명령어인 'ping'을 이용할 수도 있다.

다음 코드의 첫째 줄과 같이 입력하면 자신의 mtu 크기가 적정한 지 알 수 있다. 만약 “패킷 조각화가 필요하지만 DF가 설정되어 있습니다.”와 같은 메시지가 나오면서 ping 응답을 받지 못하면 다음 코드의 둘째 줄과 같은 명령어를 입력하여 MTU 크기를 수정하자. ping에서 성공적으로 응답을 받을 수 있는 값 중 가장 큰 값에 28을 더한 값이 최적의 MTU 값이다. 예를 들어 일반적으로 사용하는 MTU 값인 1500이 최적인 경우 ping 테스트 시에 1472를 값을 이용한다. 이 문서를 작성할 때에는 ping 테스트 시 1412가 최적 값이었고, 따라서 MTU 값으로 1440을 설정하였다. 다음 코드의 마지막 2줄이 실제 사용한 명령어이다.

ping -f -l <mtu 크기> <주소>

netsh interface ipv4 set subinterface "<네트워크 연결 이름>" mtu=<mtu 크기> store=persistent

ping -f -l 1412 168.126.63.1
netsh interface ipv4 set subinterface "로컬 영역 연결" mtu=1440 store=persistent

문제 해결: Bad Packet ID

사용 중에, 특히 데이터 전송량이 큰 경우(ex: 그림이 많은 웹 페이지 접속, 동영상 시청 등) 다음과 같은 로그가 수십개씩 뜨는 경우가 있다.

Authenticate/Decrypt packet error: bad packet ID (may be a replay): – see the man page entry for –no-replay and –replay-window for more info or silence this warning with –mute-replay-warnings

메시지에 일관성이 없어 분석하기가 조금 난감하다. warning이라는건지 error라는건지…

일단 조사해보니 원인은 다양하여 특정하기 힘드나, 송수신 단에서 패킷 순서가 일치하지 않아서 인듯 하다. 패킷 순서를 따지는 프로토콜로 대표적인 것이 TCP, 따지지 않는 프로토콜이 UDP이다. openvpn 설정에서 다음과 같이 프로토콜을 TCP로 바꾸어주니 문제가 해결되었다.

# Are we connecting to a TCP or
# UDP server?  Use the same setting as
# on the server.
proto tcp
;proto udp

물론 TCP를 사용하는 것에 대한 단점도 있을 것이다. ACK 때문에 반응속도가 조금 저하될 수도 있다. 의외로 전송속도는 TCP가 더 좋은 경우도 있다고 한다. 그러나 신뢰성, openvpn의 오류 메시지 등을 고려할 때 TCP를 사용하는 것이 더 낫다고 생각한다.


댓글을 입력하세요. 위키 문법이 허용됩니다:
C D A U Z