VPN
고친 사람 github-actions[bot]
VPN은 여러 사람이 함께 쓰는 인터넷 위에 나만 쓰는 통로를 긋습니다. 통로를 지나는 동안 내용은 남이 읽지 못하게 감싸입니다. 떨어져 있던 기계들은 같은 사설망의 이웃처럼 서로를 부릅니다. 집에 있는 노트북이 회사 안에서처럼 내부 서버에 붙는 것이 이 방식입니다.
쉽고 빠른 이해
VPN은 공용 인터넷을 지나는 통신을 감싸서, 떨어져 있는 기계들을 한 사설망처럼 이어 줍니다. 카페 무선 인터넷에 앉은 노트북이 사내 주소를 받아 내부 서버에 붙는 것이 그렇습니다.
이것이 없으면 사내 서버를 인터넷 쪽으로 열어 두어야 합니다. 그러면 주소를 아는 누구나 문을 두드릴 수 있습니다. 오가는 내용도 중간 장비들이 들여다볼 수 있습니다.
어떻게 도나:
- 두 끝이 서로 누구인지 확인하고 이번 통로에서 쓸 열쇠를 만듭니다
- 보낼 내용을 그 열쇠로 잠근 뒤 새 봉투에 담아 반대편 끝으로 보냅니다
- 받은 끝이 봉투를 벗기고 잠금을 풀어 사내 망으로 흘려보냅니다
대가도 있습니다. 봉투가 하나 더 붙는 만큼 한 번에 실어 나르는 알맹이가 줍니다. 잠그고 푸는 계산도 양 끝에 더해집니다. 모든 통신이 한 관문을 지나므로 그 관문이 멈추면 다 같이 끊깁니다.
그래서 웹 요청 하나만 대신 내보내면 되는 일에는 통로를 세우지 않습니다. 대가만 늘고 얻는 것이 없습니다.
상세
이 절은 VPN이 무엇을 감싸고 그 통로를 어떻게 세우는지를 다룹니다. 봉투에 담아 보내는 편지를 줄곧 예로 씁니다.
VPN은 Virtual Private Network, 우리말로 가상 사설망을 줄인 말입니다. 사설망은 한 조직이 자기 기계들만 붙여 쓰는 망입니다. 그런 망을 전선으로 새로 깔지 않고 공용 인터넷 위에 흉내 내어 세운 것이 VPN입니다.
공용 우편함에 편지를 넣는다고 해 봅시다. 종이를 그냥 넣으면 지나는 사람이 다 읽습니다. 봉투에 넣어 봉하고 겉에는 받는 곳만 적으면, 나르는 사람은 봉투를 옮길 뿐 속은 모릅니다.
기계가 망으로 내보내는 한 덩어리가 패킷입니다. 앞의 비유에서 종이 한 장에 해당합니다.
VPN도 보낼 것을 이렇게 봉투에 넣습니다. 패킷 하나를 통째로 속에 넣습니다. 겉에는 통로 반대편의 주소만 적은 새 패킷을 만듭니다.
이렇게 한 통신을 다른 통신 안에 실어 나르는 것이 터널링입니다. 안에 넣어 싸는 동작 자체는 캡슐화입니다. 이렇게 선 통로를 터널이라고도 부릅니다.
이렇게까지 하는 까닭은 바깥에서 사내 서버를 쓰려면 그 서버를 인터넷 쪽으로 열어야 하기 때문입니다. 열어 두면 주소를 아는 누구나 문을 두드릴 수 있습니다. 거점끼리 전용선을 새로 까는 길도 있지만 거리가 멀수록 비용이 커집니다. VPN은 이미 깔린 인터넷을 쓰면서 열어 두는 문은 하나로 줄이는 쪽을 고릅니다.
감싸는 봉투의 생김새
겉봉투에는 나르는 데 필요한 것만 적힙니다. 겉에 적히는 안내 정보가 헤더입니다. 인터넷 중간의 장비들은 이 헤더만 읽고 봉투를 나릅니다.
헤더에 적히는 것은 통로 양 끝 장비가 인터넷에서 쓰는 주소입니다. 중간 장비가 보는 목적지는 언제나 통로 반대편 장비입니다. 속에 든 패킷이 어느 사내 서버로 가는지는 보이지 않습니다. 그렇게 싸여 들어간 속이 페이로드입니다.
잠금은 페이로드에만 걸립니다. 겉은 나르는 데 필요하니 열어 둡니다. 속만 암호화해서 열쇠를 가진 반대편 장비만 풀게 합니다.
짧은 검사값도 함께 붙어서, 오는 길에 한 글자라도 바뀌었는지 알려 줍니다. 내용이 안 바뀌었음을 확인하는 이 성질이 무결성입니다.
flowchart TD
subgraph OUT["인터넷을 지나는 겉봉투"]
H["겉 헤더 · 통로 양 끝 장비의 주소"]
subgraph IN["페이로드 · 암호로 잠긴다"]
D["원래 패킷 그대로 · 사내 서버 주소와 보낼 내용"]
end
end
그림의 바깥 껍질만 인터넷에 드러납니다. 사내 서버 주소는 잠긴 안쪽에 있어서, 통신을 엿듣는 쪽은 누가 누구와 이야기하는지까지는 못 봅니다.
통로를 세울 때 하는 신원 확인과 열쇠 나눔
봉투를 잠그려면 먼저 열쇠가 있어야 합니다. 통로는 그 열쇠를 나누고 나서야 섭니다. 회사 쪽에서 통로의 한쪽을 맡는 장비가 VPN 게이트웨이입니다.
첫 일은 서로 누구인지 확인하는 것입니다. 상대가 진짜 그 회사의 게이트웨이인지, 붙으려는 쪽이 그 조직의 사람인지를 가립니다. 이 확인이 인증입니다. 미리 나눠 둔 비밀값이나 인증서로 합니다.
다음은 이번 통로에서만 쓸 열쇠를 만드는 것입니다. 열쇠를 그냥 보내면 엿듣는 쪽도 같이 갖게 되므로, 서로 보낸 값을 각자 계산해 같은 열쇠에 이르는 방법을 씁니다. 이 절차가 키 교환입니다.
sequenceDiagram
participant 노트북
participant 게이트웨이
노트북->>게이트웨이: 붙고 싶다
게이트웨이-->>노트북: 인증서 · 열쇠 계산에 쓸 값
노트북->>게이트웨이: 신원 증명 · 열쇠 계산에 쓸 값
Note over 노트북,게이트웨이: 양쪽이 같은 열쇠에 이른다
노트북->>게이트웨이: 잠긴 봉투를 실어 나르기 시작
열쇠는 통로를 새로 세울 때마다 새로 만듭니다. 그래서 엿듣던 쪽이 오간 봉투를 모아 두었다가 나중에 조직의 비밀값을 손에 넣어도, 모아 둔 옛 봉투는 열지 못합니다.
통로에 무엇을 태울지 정하는 규칙
통로가 서면 붙은 쪽은 사내 주소를 하나 받습니다. 바깥에서 붙었는데도 사내 기계들 눈에는 같은 망의 이웃으로 보이게 만드는 주소입니다. 이런 주소가 사설 주소입니다.
그다음 정해지는 것은 어느 목적지를 통로로 보낼지입니다. 목적지마다 어느 길로 내보낼지 적어 둔 표가 라우팅 표이고, 통로가 서는 순간 이 표에 줄이 몇 개 더해집니다.
flowchart TD
P["보낼 패킷"] --> Q{"목적지가 사내 주소인가"}
Q -->|그렇다| T["감싸서 게이트웨이로"]
Q -->|아니다| I["곧장 인터넷으로"]
갈림을 없애고 모든 패킷을 「감싸서 게이트웨이로」 쪽으로 보내는 설정도 있습니다. 이것이 전체 터널링입니다. 갈림을 남겨 사내 주소로 가는 것만 태우는 쪽이 분할 터널링입니다.
갈림을 없애면 그 기계의 모든 통신을 회사가 보고 거를 수 있습니다. 갈림을 남겨 두면 게이트웨이의 부담과 우회하는 길이 줄어듭니다.
이어 주는 대상에 따른 두 모양
무엇과 무엇을 잇느냐에 따라 쓰는 모양이 갈립니다.
| 견주는 축 | 원격 접속형 | 거점 간 연결형 |
|---|---|---|
| 잇는 것 | 사람이 쓰는 기계 하나와 사내 망 | 서로 떨어진 두 망 |
| 통로를 맡는 장비 | 노트북의 접속 프로그램과 게이트웨이 | 양쪽 망의 경계 장비 |
| 켜고 끄는 쪽 | 그 기계를 쓰는 사람 | 망을 운영하는 쪽. 늘 서 있다 |
| 안쪽 기계가 아나 | 쓰는 사람은 켠 줄 안다 | 모른다. 평소 경로처럼 쓴다 |
| 흔한 쓰임 | 재택·출장 중 사내 접속 | 본사와 지사, 데이터센터끼리 |
표의 마지막 두 줄이 갈리는 대목입니다. 원격 접속형은 사람이 통로를 의식하고 쓰지만, 거점 간 연결형은 서버들이 통로가 있는 줄도 모르고 평소처럼 서로를 부릅니다.
두 모양은 통로가 망 어디에 놓이는지도 다릅니다. 아래 그림에서 묶음 하나가 망 하나이고, 「통로」라고 적힌 화살표만 감싸서 나릅니다.
flowchart TD
subgraph R["원격 접속형"]
L1["노트북 접속 프로그램"]
L2["노트북 접속 프로그램"]
L3["노트북 접속 프로그램"]
GW["VPN 게이트웨이"]
subgraph RIN["사내 망 · 통로 밖"]
RS1["사내 서버"]
RS2["사내 서버"]
end
L1 -->|통로| GW
L2 -->|통로| GW
L3 -->|통로| GW
GW --> RS1
GW --> RS2
end
subgraph S["거점 간 연결형"]
subgraph HQ["본사 망 · 통로 밖"]
HS["서버"]
end
HE["경계 장비"]
BE["경계 장비"]
subgraph BRN["지사 망 · 통로 밖"]
BS["서버"]
end
HS --> HE
HE -->|통로| BE
BE --> BS
end
원격 접속형은 통로가 기계마다 하나씩 서서 게이트웨이 한 곳으로 모입니다. 거점 간 연결형은 통로가 경계 장비 사이에 하나만 섭니다. 어느 쪽이든 망 안의 서버들은 통로 밖에 있어서 평소 경로로 오갑니다.
치르는 대가
통로는 공짜로 얻어지지 않습니다.
첫째, 실어 나를 알맹이가 줄어듭니다. 한 번에 보낼 수 있는 패킷 크기에는 상한이 있습니다. 이 상한이 MTU(Maximum Transmission Unit, 최대 전송 단위)입니다. 겉봉투가 붙은 만큼 속에 넣을 수 있는 양이 깎입니다.
상한을 넘치면 패킷이 쪼개지는 단편화가 일어납니다. 아래 그림은 같은 상한 폭을 두고 무엇이 달라지는지 보입니다.
block-beta columns 4 a["원래 패킷 · 상한을 꽉 채운다"]:4 b["겉 헤더"]:1 c["깎인 알맹이"]:3 d["겉 헤더"]:1 e["앞 조각"]:3 f["겉 헤더"]:1 g["뒤 조각"]:3
둘째 줄이 겉봉투가 붙어 알맹이가 깎인 모습입니다. 원래 크기를 그대로 보내려면 셋째·넷째 줄처럼 둘로 쪼개서 두 번 보내야 합니다.
둘째, 응답이 늦어집니다. 통로 양 끝 장비는 오가는 패킷을 모두 잠그고 풀어야 합니다. 목적지로 바로 가는 대신 게이트웨이를 한 번 들렀다 나갑니다. 계산과 우회가 오갈 때마다 더해집니다.
셋째, 한 곳에 몰립니다. 붙어 있는 모두의 통신이 게이트웨이를 지나므로 그 장비가 멈추면 전부 끊깁니다. 이렇게 하나가 멈추면 전체가 멈추는 지점이 단일 장애점입니다.
넷째, 신뢰의 범위가 넓어집니다. 통로 안에 들어온 기계는 사내 망의 이웃으로 대접받습니다. 그 기계가 이미 감염되어 있었다면 감염된 것이 망 안으로 걸어 들어온 셈입니다.
프록시·익명 접속 서비스와의 차이
이름이 겹쳐 헷갈리는 이웃이 둘 있습니다.
하나는 프록시입니다. 프록시는 브라우저 요청 같은 정해진 종류의 심부름만 대신 받아 대신 보내 줍니다. 그 종류 밖의 통신은 프록시를 지나가지 않습니다.
VPN은 그 종류를 묻지 않습니다. 기계가 내보내는 패킷이면 무엇이든 봉투에 넣습니다. 브라우저가 내보낸 것이든 다른 프로그램이 내보낸 것이든 가리지 않고 같이 태웁니다.
그래서 웹 요청 하나만 대신 내보내면 끝나는 일에는 통로를 세우지 않습니다. 태울 것이 한 종류뿐이면 앞 소절에 적은 대가만 늘어납니다.
다른 하나는 내 위치를 감추는 용도로 파는 접속 서비스입니다. 통로를 쓰는 동안 내가 어디에 접속했는지는 통로 반대편 장비가 보게 됩니다. 감추는 상대가 인터넷 사업자에서 통로 사업자로 바뀔 뿐입니다.
아무도 못 보는 상태가 되지는 않습니다. 보내는 쪽과 받는 쪽만 내용을 아는 종단 간 암호화와는 지키는 범위가 다릅니다.
관련 항목
VPN 터널을 세우는 프로토콜
IPsec · WireGuard · OpenVPN · L2TP · PPTP · IKE · TLS · GRE · 캡슐화 보안 페이로드 · SSH 터널
VPN이 기대는 암호 기술
암호화 · 키 교환 · 전달 비밀성 · 대칭키 암호 · 공개키 암호 · 인증서 · 메시지 인증 코드 · 무결성 · 인증 · 난수 생성
VPN이 올라타는 네트워크 계층 개념
터널링 · 캡슐화 · 오버레이 네트워크 · 패킷 · 헤더 · 페이로드 · 네트워크 계층 · 전송 계층 · 링크 계층 · 라우팅 · MTU
VPN이 다루는 주소와 경계 장비
사설 IP 주소 · IP 주소 · NAT · 서브넷 · 기본 게이트웨이 · 방화벽 · 공유기 · DNS · 포트 포워딩 · VPN 게이트웨이
VPN 연결을 설정하는 방식
분할 터널링 · 전체 터널링 · 원격 접속 VPN · 사이트 간 VPN · 사설망 · 상시 접속
VPN 대신 원격 접근을 여는 다른 수단
프록시 · 리버스 프록시 · SSH · 제로 트러스트 · 상호 TLS · 전용선 · 배스천 호스트 · 접근 제어
VPN을 켜면 자주 터지는 문제
경로 MTU 탐색 · 단편화 · 단일 장애점 · DNS 유출 · 중간자 공격 · 재전송 공격 · IP 주소 충돌
다른 이름: Virtual Private Network · 가상 사설망 · 브이피엔