VPN 터널링
카페의 공용 와이파이에서 회사 내부 서버에 접속한다고 생각해 봅시다. 내부 서버의 주소는 사설 주소여서 인터넷에서는 닿지 않고, 암호화하지 않은 데이터를 공용 인터넷으로 보내면 중간의 네트워크 장비나 같은 와이파이를 쓰는 누군가가 내용을 볼 수 있습니다. 이 문제를 풀어 주는 것이 VPN(Virtual Private Network, 가상 사설망)입니다. VPN은 공용 인터넷 위에 암호화된 가상의 통로를 만들어, 물리적으로는 공용망을 지나면서도 논리적으로는 사설망처럼 통신하게 합니다. 이 통로를 만드는 핵심 방법이 터널링(tunneling)입니다.
터널링은 원래의 패킷(내부 패킷)을 다른 패킷 안에 넣어서(캡슐화) 보내는 방식입니다. 택배 상자를 더 큰 상자에 넣어 보내는 것과 비슷합니다. VPN에서는 내부 패킷 전체를 암호화한 뒤 새 헤더를 붙이므로, 중간 장비는 바깥 헤더만 볼 수 있을 뿐 안의 주소와 내용은 읽을 수 없습니다. 이 토픽에서는 캡슐화 과정, 노트북에서 사내 서버까지 패킷이 지나가는 여정, 그리고 VPN의 종류와 대표 방식을 단계별로 봅니다.
핵심 개념
VPN
공용 인터넷 위에 암호화된 터널을 만들어 사설망처럼 쓰게 하는 기술입니다. 원격 근무자가 회사 내부 자원에 안전하게 접속하거나, 떨어진 지사끼리 네트워크를 잇는 데 씁니다.
핵심 개념
터널링과 캡슐화
원래의 패킷을 다른 프로토콜의 패킷 안에 넣어 전달하는 방식입니다. 안쪽 패킷은 목적지에 도착해서야 꺼내지므로, 중간 장비는 바깥 패킷의 주소만 보고 전달합니다.
핵심 개념
암호화와 인증
터널 안의 데이터를 암호화해 도청을 막고, 상대가 맞는지 인증과 무결성 검사로 확인해 위조와 변조를 막습니다. 터널의 두 끝은 키를 미리 정하거나 키 교환으로 공유합니다.
핵심 개념
VPN 게이트웨이
회사나 지사의 네트워크 쪽에서 터널의 한쪽 끝을 맡는 장비입니다. 들어온 암호화 패킷을 복호화해 내부망에 넘기고, 나가는 패킷은 암호화해 터널로 내보냅니다.
핵심 개념
원격 접속과 사이트 간
개별 기기가 게이트웨이와 터널을 만드는 것이 원격 접속 VPN이고, 두 네트워크의 게이트웨이끼리 터널을 만드는 것이 사이트 간 VPN입니다. 사이트 간에서는 안쪽 기기들이 VPN을 의식하지 않고 통신합니다.
핵심 개념
IPsec · WireGuard · OpenVPN
대표적인 VPN 프로토콜입니다. IPsec은 IP 계층에서 패킷을 보호하고, WireGuard는 UDP 위에서 동작하는 간결한 방식이며, OpenVPN은 TLS를 이용합니다.
VPN의 배경
전용선을 빌려 지사를 잇던 방식은 비용이 컸고, 공용 인터넷을 쓰면서도 사설망 같은 보안을 얻으려는 필요에서 VPN이 널리 쓰이게 되었습니다. IP 계층의 보안 구조는 IPsec으로 표준화되어 있고(RFC 4301이 구조를 정의), 데이터 보호는 ESP(RFC 4303)가 맡습니다. 키 교환 프로토콜은 IKEv2(RFC 7296)입니다. 비교적 최근에는 코드 규모가 작은 WireGuard가 리눅스 커널 5.6에 포함되며 널리 쓰이고 있습니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
VPN이 무엇이고 왜 쓰나요?
공용 인터넷 위에 암호화된 터널을 만들어 사설망처럼 안전하게 통신하게 하는 기술입니다. 원격 근무자가 회사 내부 자원에 안전하게 접속하고, 지사끼리 네트워크를 이을 때 씁니다.
면접 질문
터널링(캡슐화)이란 무엇인가요?
원래의 패킷을 다른 패킷 안에 넣어 전달하는 것입니다. VPN에서는 내부 패킷을 암호화해 새 IP 헤더를 붙여 보내고, 도착한 끝점이 바깥 헤더를 벗기고 복호화해 원래 패킷을 꺼냅니다.
면접 질문
원격 접속 VPN과 사이트 간 VPN의 차이는?
원격 접속은 개별 기기가 회사 게이트웨이와 터널을 만드는 방식이고, 사이트 간은 본사와 지사의 게이트웨이끼리 터널을 만들어 두 네트워크를 잇는 방식입니다.
면접 질문
VPN만 있으면 안전한가요?
아닙니다. VPN은 터널 구간의 도청과 변조를 막을 뿐입니다. 접속 후의 접근 권한 관리, 기기 보안, 사내망 안의 보안은 따로 필요합니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
WireGuard — 클라이언트와 서버 설정 (개념 예시)
# 클라이언트: /etc/wireguard/wg0.conf [Interface] PrivateKey = <클라이언트 개인키> Address = 10.8.0.2/32 [Peer] PublicKey = <서버 공개키> Endpoint = 198.51.100.1:51820 AllowedIPs = 192.168.10.0/24 PersistentKeepalive = 25 # 서버: /etc/wireguard/wg0.conf [Interface] PrivateKey = <서버 개인키> Address = 10.8.0.1/24 ListenPort = 51820 [Peer] PublicKey = <클라이언트 공개키> AllowedIPs = 10.8.0.2/32
WireGuard는 설정 파일의 Interface 절에 이 기기의 개인키와 터널 안에서 쓸 가상 주소를 적고, Peer 절에 상대의 공개키와 접속 주소(Endpoint)를 적습니다. 클라이언트의 AllowedIPs에 적은 192.168.10.0/24로 가는 트래픽만 터널로 보내므로 분할 터널 구성입니다. AllowedIPs는 보낼 때 목적지에 맞는 피어를 고르는 라우팅 표이고, 받을 때는 복호화한 패킷의 출발지가 범위 안인지 거르는 필터입니다. 서버 쪽에서는 클라이언트의 가상 주소 10.8.0.2만 허용합니다. PersistentKeepalive는 NAT 뒤에서 연결이 끊기지 않게 주기적으로 패킷을 보냅니다. 키는 wg genkey 같은 명령으로 만들며 개인키는 밖에 알리면 안 됩니다. 서버가 사내망으로 패킷을 전달하려면 패킷 전달(ip_forward)과 라우팅도 설정해야 하고, 위 설정은 구조를 보이는 최소 예시입니다.
리눅스 셸 — 터널 상태와 암호화된 패킷 확인
# 터널 켜기 / 상태 보기 (root 권한) sudo wg-quick up wg0 sudo wg show # 터널 인터페이스와 경로 확인 ip addr show wg0 ip route # 사내 서버로 통신 확인 ping 192.168.10.5 # 인터넷 쪽 인터페이스에서 보이는 것 (암호문) sudo tcpdump -n -i eth0 udp port 51820
wg-quick up은 설정 파일대로 wg0 터널 인터페이스를 만들고 경로를 추가하며, wg show는 상대 피어, 마지막 핸드셰이크 시각, 주고받은 바이트 수를 보여 줍니다. ip route에는 AllowedIPs 범위가 wg0 인터페이스로 가도록 경로가 생겨, 그 주소로 가는 패킷이 자동으로 터널에 들어갑니다. 터널이 정상이면 ping이 사내 서버에 닿습니다. 바깥 인터페이스에서 tcpdump를 하면 노트북과 게이트웨이 사이의 UDP 패킷만 보이고 안의 내용은 읽을 수 없는 암호문입니다. 이것이 캡슐화와 암호화의 효과입니다.
Python — 캡슐화와 암호화 흉내 내기
import json from cryptography.fernet import Fernet key = Fernet.generate_key() # 두 끝점이 미리 공유한 키라고 가정 tunnel = Fernet(key) inner = {"src": "10.8.0.2", "dst": "192.168.10.5", "data": "GET /"} outer = { "src": "203.0.113.20", "dst": "198.51.100.1", "payload": tunnel.encrypt(json.dumps(inner).encode()), # 내부 패킷 전체를 암호화 } print(outer["payload"][:20]) # 토큰 앞부분(base64): 내부 주소와 데이터는 보이지 않음 restored = json.loads(tunnel.decrypt(outer["payload"])) # 게이트웨이에서 복호화 print(restored["dst"]) # 192.168.10.5
내부 패킷(inner)을 딕셔너리로 만들고 그 전체를 Fernet으로 암호화해 외부 패킷(outer)의 payload에 담는 모습으로 캡슐화와 암호화를 흉내 냅니다. 외부 패킷의 src와 dst는 공인 주소이고, 내부 패킷의 주소와 데이터는 암호문 안에 숨어 있습니다. Fernet은 cryptography 라이브러리가 제공하는 대칭키 암호화 방식이어서 별도로 설치해야 합니다. 게이트웨이는 같은 키로 복호화해 원래의 내부 패킷을 얻습니다. 실제 VPN은 키 교환, 재전송 방지, 패킷 단위 암호화 같은 처리가 더 있으므로 이 코드는 원리만 보이는 최소 예시이며 실제 터널로 쓸 수 없습니다.
Q1
VPN(Virtual Private Network)의 핵심 아이디어는?
Q2
VPN에서 말하는 터널링(Tunneling)이란?
Q3
원격 근무자가 회사 내부망 자원에 접속할 때 VPN을 사용하는 이유는?