이번 포스트의 목적은 개인적인 알바를 위해 공부하게 된 VPN의 개념과 구현 방식, 그리고 오픈소스 VPN 솔루션인 OpenVPN에 대한 분석을 잊지 않기위한 기록이다.
1. VPN의 개념
VPN, Virtual Private Network의 개념을 이해하기 위해서는 먼저 Private Network에 대한 이해가 있어야 하며, 그 후에 VPN과 일반적인 Private Network의 차이를 통해 어째서 앞에 Virtual이라는 단어가 붙게 되었는지를 이해해야 한다.
1.1 Public Network
Network는 쉽게 여러 대의 컴퓨터(컴퓨터와 기타 커뮤니케이션 가능 장치를 포함하여 이하 노드라고 표현)들이 연결된 망이다. 노드들은 다양한 방식으로 연결되어 있으며 상호간에 커뮤니케이션이 가능하다. 한 노드가 전 세계의 임의의 다른 노드와 통신할 수 있고, 이러한 커뮤니케이션 집단에 포함되는데 특별한 제약이 없다면 이 이 네트워크를 Public Network, 즉 일반적으로 말하는 인터넷이라고 한다.
1.2 Private Network
Private Network는 용어에서부터 알 수 있듯이 Public Network와 반대되는 개념이다. Private Network는 망에 포함되지 않은 노드는 Private Network상의 노드와 임의로 통신할 수 없다. 이런 Private Network를 사용하는 이유는 첫 째로 보안을 들 수 있는데, 사내의 중요한 정보가 담긴 서버가 Private Network에 포함되어 외부에서 접근 자체가 불가능하다면, 이 정보는 서버가 Public Network에 연결되어 있을 때보다 상대적으로 안전하다고 말할 수 있다.
1.3 Private Network의 한계
우리의 목적은 VPN에 대한 이해이기 때문에, VPN의 등장 배경인 Private Network의 한계에 대해 생각해 보아야 한다. Private Network의 가장 쉬운 예는 집안에서 공유기로 연결된 노드들의 집합이다. 이 경우 모든 노드들은 물리적으로 연결되어 있으며 새로운 노드를 추가하기 위해서는 또 다른 물리적 연결을 추가해야 한다. 회사에서 사용하는 사내 망의 경우도 일반적으로 물리적인 연결이 있는 경우가 대부분이다. 바로 이것이 Private Network의 한계이다.
사내에서 구축된 Private Network의 경우 사무실에 출근하여 사용하기에는 아무런 문제가 없다. 그러나 쉽게는 출장부터, 낮은 확률로 자연재해로 인한 재택근무까지 사무실에 출근하지 못하고 업무를 진행해야 하는 경우는 많다. 이 때 업무에 사용해야 하는 데이타는 회사의 Private Network에 포함된 서버에 들어있고, 업무를 진행해야 하는 직원은 회사 밖에 있다. Private Network를 확장하기 위해 회사에서 집까지 케이블을 끌어와야 할까. 그것도 좋은 방법이라고 생각한다면 정신과 상담을 추천한다. 이런 요구에 의해 나온것이 Virtual Private Network, 즉 가상의 Private Network를 구축하는 것이다.
1.4 VPN
Private Network는 보통 Public Network에 연결된 하나의 노드가 존재하고 보통 이것을 라우터라고 부른다. 그리고 Private Network에 속한 노드가 외부와 통신을 시도할 때에는 모든 패킷이 이 라우터를 통과하게 되고, 규칙에 의해 허용되지 않은 패킷은 라우터에 의해 걸러진다. VPN은 Private Network 외부에 있는 노드가 인증을 통해 라우터에 연결하고, 이 라우터가 내부 노드들에게 연결을 중계해주어, 이 노드가 Private Network에 포함된 것 처럼 동작할 수 있도록 해준다.
2. VPN과 보안
Private Network가 Public Network에 비해 상대적으로 안전한 이유는, 외부에서의 연결이 불가능하기 때문이다. 보안이 필요한 데이타는 Private Network에 포함된 서버에 들어있으며, 모든 통신이 이 사내 망 안에서 이루어지므로, 패킷이 외부로 노출되지 않는다. 따라서 스니핑 등으로부터 안전하다.
그러나 VPN을 사용하는 경우 결국 외부에 존재하는 노드가 사내 망에 연결을 시도하며, 보안이 필요한 데이타가 라우터를 통해 밖으로 나오게 된다. 이 경우, 데이타는 스니핑으로부터 더이상 안전하지 않다.
그렇다면 이 보안의 역설을 해결하기 위해서는 무엇을 해야할까. 가장 널리 사용되는 방식은 Private Network를 벗어나는 모든 패킷을 암호화 하는 것이다. 그러면 악의적인 누군가가 스니핑을 시도하더라도 암호화된 패킷만을 볼 수 있으며, 우리의 데이타는 다시 안전해진다.
3. 터널
일반적으로 외부의 노드 A가 Private Network 내의 노드들과 통신하기 위해 라우터와 맺는 연결을 '터널' 이라고 표현한다. 모든 데이타는 이 터널을 통해서 전송되며, 암호화의 대상은 이 터널을 통과하는 패킷이다. 일반적으로 메신져 등이 막혀있는 회사에서 몰래 메신져를 사용하기 위해 SSH 터널링을 이용하기도 하는데, 이와 같은 개념의 터널이다.
3.1 터널의 구현
리눅스, MacOSX를 포함한 일반적인 OS들은 터널을 구현하기 위한 새로운 NIC를 제공하는데 이것을 보통 TUN이라고 한다. 이름부터가 Network TUNnel에서 온 것으로 분명히 터널을 위한 것임을 알 수 있다. TUN은 물리적인 카드가 존재하지 않는 소프트웨어로 구현된 가상의 네트워크 인터페이스로, TCP/IP 프로토콜 상의 Layer3을 에뮬레이션 한다. 이러한 TUN 인터페이스의 사용에 대한 매뉴얼은 리눅스 커널 문서에 포함된 tuntap.txt가 가장 좋은 것으로 생각된다.
리눅스 커널 문서에서는 tun 인터페이스를 열고, read/write 를 하는 방법이 설명되어 있으나, 구체적으로 이를 이용하여 터널을 구현하는 방법은 나와있지 않다. 이에 대한 매뉴얼로 다음 링크를 추천한다.
4. 암호화
VPN을 위한 암호화 알고리즘의 선택은 자유다. 다만 중요한 것은 암호화를 위한 key의 보호인데, key가 노출되면 모든 암호화는 무용지물이기 때문이다. 따라서 어떤 암호화 알고리즘을 사용하는지, 암호화 방식이 어떻게 되는지에 대한 이해보다 오히려 안전한 key 교환을 위한 프로토콜을 이해하는 것이 더 중요하다고 생각한다.
5. SSL
오픈소스 VPN솔루션인 OpenVPN은 OpenSSL을 사용하며, SSL handshake 프로토콜은 안전한 key 교환을 위한 훌륭한 레퍼런스라고 생각한다. 일반적인 암호화 알고리즘들은 symmetric key(대칭키) 방식을 사용하는데, 이는 암호화와 복호화에 동일한 key를 사용함을 의미한다. 따라서 이 key가 보호되지 않은 회선을 통해 전달된다면 이후의 모든 암호화는 무의미하다.
SSL handshake는 이러한 key 보호를 위해 RSA를 사용하는데, 이는 비대칭키 방식으로 암호화에 사용되는 key와 복호화에 사용되는 key가 다르다. 따라서 암호화에 사용되는 키가 노출되어도 데이타가 바로 노출되지는 않는다. 다만 암호화에 사용되는 공개키와 복호화에 사용되는 비밀키에 함수관계가 존재하므로, 공개키로부터 비밀키를 알아낼 수 있다. 그러나 또한, RSA는 큰 수의 소인수분해가 어렵다는 점을 이용한 것으로, 공개키로부터 개인키를 계산해내는데 많은 시간이 걸린다.
5.1 키 교환
SSL handshake 프로토콜은 단순하지만, 핵심은 RSA에 있다. 서버는 자신의 공개키를 클라이언트에 전송하고, 클라이언트는 랜덤한 premaster key를 생성하여 서버의 공개키로 암호화하여 다시 서버로 전송한다. 그리고 premaster key로부터 서버와 클라이언트가 각자 동일한 알고리즘으로부터 key를 생성하면 서버와 클라이언트가 동일한 key를 소유하게 된다.
6. 결론
VPN은 터널을 구성한 후, 터널 사이의 통신을 암호화 하는 것이 핵심이다. 또한 모든 통신이 터널을 통해 VPN 서버를 거쳐가므로, 서버로부터 나가는 패킷은 모두 안전하다는 가정이 필요하다.











최근 덧글