재택 근무자가 VPN에 접속했지만 내부 서비스 일부만 접근됩니다. 예전처럼 "VPN 접속 = 내부망 전체 허용"으로 생각하면 라우팅과 접근 정책을 잘못 판단하게 됩니다.
VPN과 제로 트러스트는 신뢰의 범위를 다르게 잡습니다. 접속 성공과 권한 허용을 분리해서 봐야 합니다.
VPN과 제로 트러스트 보안 아키텍처
재택근무가 확산되면서 "회사 내부 시스템에 어디서든 안전하게 접속"하는 것은 인프라 엔지니어의 핵심 과제가 되었습니다. 과거에는 "내부 네트워크 = 안전"이라는 경계 기반 보안 모델을 사용했지만, 이제는 그 가정 자체를 버린 제로 트러스트 아키텍처가 표준이 되고 있습니다. 이 챕터에서는 VPN의 기술적 원리부터 현대적인 Zero Trust 개념까지 함께 학습합니다.
VPN 기술 원리
- 1IPsec(L3)과 SSL/TLS VPN(L4~L7)의 동작 원리와 차이점을 비교할 수 있다
- 2Zero Trust 아키텍처의 핵심 원칙인 Never Trust, Always Verify를 설명할 수 있다
- 3NAC(Network Access Control)를 통한 디바이스 접속 검증 흐름을 이해할 수 있다
- 4.ovpn 파일로 OpenVPN 클라이언트에 접속하고 트러블슈팅할 수 있다
- 5WireGuard 클라이언트를 설정해 차세대 VPN으로 연결할 수 있다
- 6Cloudflare Zero Trust, Teleport 등 현업 ZTNA 도구를 이해할 수 있다
sudo apt-get install openvpnsudo apt install wireguardsudo apt-get install netcat-openbsdIPsec vs SSL VPN — 두 가지 VPN 기술의 차이
재택근무 중 팀원이 회사 내부 API 서버에 접근해야 합니다. 포트를 외부에 열어두기엔 보안이 걱정되고, VPN을 도입하자니 IPsec과 SSL VPN 중 무엇을 선택해야 할지 모르겠습니다. 각 방식이 어떻게 동작하고 어떤 상황에 적합한지 알아야 인프라 설계에서 올바른 선택을 할 수 있습니다.
확대
VPN의 기본 원리
VPN(Virtual Private Network)은 공용 인터넷 위에 암호화된 터널을 만들어 마치 전용 회선처럼 사용하는 기술입니다. 카페 Wi-Fi에서 회사 DB에 접속한다고 생각해보세요 — 패킷이 평문으로 전송되면 네트워크 위의 누구나 내용을 볼 수 있습니다. VPN은 이 구간을 암호화해서 공용 인터넷을 통과하면서도 내부망에 직접 연결된 것처럼 동작하게 합니다.
확대
IPsec VPN
IPsec(Internet Protocol Security)은 **L3(네트워크 계층)**에서 동작하며, IP 패킷 자체를 암호화합니다.
- 동작 모드
- Transport 모드: 페이로드만 암호화 (호스트-to-호스트)
- Tunnel 모드: 전체 IP 패킷을 새 IP 헤더로 캡슐화 (네트워크-to-네트워크)
- 프로토콜
- AH (Authentication Header): 무결성 인증만
- ESP (Encapsulating Security Payload): 암호화 + 인증
- 키 교환: IKE (Internet Key Exchange) — UDP 500번 포트
IPsec의 특성을 한눈에 정리하면 언제 선택해야 하는지 판단 기준이 명확해집니다.
| 항목 | 내용 |
|---|---|
| 동작 계층 | L3 (네트워크) |
| 클라이언트 | OS 내장 (Windows/macOS/Linux) |
| 방화벽 통과 | 어려움 (UDP 500, ESP 프로토콜 필요) |
| 성능 | 높음 (커널 수준 처리) |
| 주요 사용처 | 사이트 간 VPN, 기업 원격 접속 |
SSL/TLS VPN (OpenVPN)
SSL VPN은 **TLS(전송 계층 보안)**를 사용하여 암호화 터널을 구성합니다. OpenVPN은 가장 널리 사용되는 오픈소스 SSL VPN입니다.
확대
SSL VPN 특징:
| 항목 | 내용 |
|---|---|
| 동작 계층 | L4~L7 (TLS 사용) |
| 클라이언트 | 별도 소프트웨어 설치 |
| 방화벽 통과 | 쉬움 (TCP 443 사용 가능) |
| 인증 방식 | 인증서, 사용자명/비밀번호, MFA |
| 주요 사용처 | 원격 접속 VPN |
IPsec vs SSL VPN 비교
| 항목 | IPsec | SSL VPN |
|---|---|---|
| 표준 | IETF RFC | OpenVPN 등 |
| 계층 | L3 | L4~L7 |
| 클라이언트 | OS 내장 | 별도 앱 필요 |
| NAT 통과 | NAT-T 필요 | 쉬움 |
| 방화벽 통과 | 어려움 | 쉬움 |
| 성능 | 높음 | 보통 |
VPN 터널이 서고 트래픽이 보호되기까지 — 연결 5단계
.ovpn 파일을 실행하면 몇 초 뒤 Initialization Sequence Completed가 뜨고 사내망에 붙습니다. 이 짧은 사이에 클라이언트와 VPN 서버는 서로를 인증하고 → 키를 교환해 → 암호화 터널을 세우고 → 어떤 대역을 터널로 보낼지 라우팅을 잡고 → 실제 패킷을 캡슐화해 주고받습니다. 이 순서를 알면 "어디서 연결이 멈췄나"(인증? 키 교환? 라우팅?)를 단계로 좁힐 수 있고, 뒤에 나올 Zero Trust가 왜 "터널을 믿는 것" 자체를 문제 삼는지도 분명해집니다.
[클라이언트] sudo openvpn --config client.ovpn
│
① 인증 클라이언트가 인증서(또는 ID·키·MFA)로 신원 증명
│ 서버도 자기 인증서로 신원 증명 (상호 인증)
│
② 키 교환 IKE(IPsec) 또는 TLS handshake로 세션키 합의
│ → 개인키 없이도 도청자는 세션키를 못 계산
│
③ 터널 수립 가상 인터페이스 생성 (tun0 · wg0), 이후 전 구간 암호화
│ → "Initialization Sequence Completed"
│
④ 라우팅 설정 "어느 대역을 터널로 보낼지" 결정
│ OpenVPN push route · WireGuard AllowedIPs · 내부 DNS
│
⑤ 캡슐화 전송 원본 패킷을 암호화해 UDP/TCP로 감싸 서버로,
│ 서버가 복호화해 내부망에 전달 (응답은 역순)
▼
[회사 내부망] 사내 API · DB에 전용선처럼 접근
각 단계에서 무슨 일이 일어나고, 막히면 어떤 증상인가:
| 단계 | 하는 일 | 여기서 막히면 |
|---|---|---|
| ① 인증 | 클라이언트·서버가 인증서/키/MFA로 서로 신원을 증명. 실패하면 터널을 아예 안 세움 | 인증서 만료·.ovpn이 참조하는 ca.crt/key 파일 누락 → TLS handshake failed·인증 거부 |
| ② 키 교환 | IKE(UDP 500) 또는 TLS handshake로 세션키 합의. 여기까지 서버 포트에 패킷이 닿아야 진행 | 카페·공용 WiFi가 UDP 1194를 차단 → 서버에 못 닿아 TLS key negotiation failed (TCP 443 폴백 필요) |
| ③ 터널 수립 | tun0·wg0 가상 인터페이스 생성, 이후 트래픽 암호화. ip addr show tun0에 VPN IP가 붙음 | 터널은 섰는데 캡슐화 후 크기가 MTU 초과 → 큰 패킷만 조용히 유실 (핸드셰이크는 되는데 데이터가 끊김) |
| ④ 라우팅 설정 | 서버가 내부 대역 경로·DNS를 push, 클라이언트가 적용 (스플릿 터널이면 그 대역만) | 로컬 서브넷과 VPN 내부망이 같은 대역이면 충돌 → 내부망 트래픽이 로컬로 새 접속 실패 |
| ⑤ 캡슐화 전송 | 원본 IP 패킷을 암호화해 외부 헤더로 감싸 전송, 수신 측이 복호화 | AllowedIPs·push route에 목적 대역 누락 → 터널은 정상인데 그 대역만 안 감 |
즉 "VPN이 안 붙는다"는 이 다섯 단계 중 어디서 멈췄는지의 문제입니다 — 인증서 문제면 ①, 서버에 아예 못 닿으면 ②(포트 차단), tun0은 떴는데 큰 데이터만 끊기면 ③(MTU), IP는 되는데 특정 대역·이름만 안 되면 ④(라우팅/스플릿 터널·DNS)로 좁혀집니다. openvpn --verb 6이나 wg show의 handshake·전송 바이트가 단계별 로그 역할을 합니다. 그리고 이 다섯 단계가 모두 성공하면 전통적 VPN은 "터널 안은 신뢰" 로 내부망을 통째로 엽니다 — Zero Trust는 바로 그 지점을 문제 삼아, 터널이 섰다는 사실만으로 신뢰하지 않고 리소스에 접근할 때마다 신원·기기·정책을 다시 검증합니다(다음 개념 블록).
Zero Trust 아키텍처 — 경계 기반 보안의 한계와 극복
VPN으로 내부망에 접속한 직원 계정이 탈취되었습니다. 공격자는 내부망에 진입한 순간 모든 서버에 자유롭게 접근할 수 있었습니다. 내부는 믿는다는 "경계 기반 보안"의 전제가 무너진 것입니다. Zero Trust는 이 전제를 버리고 내부에서도 매번 인증/인가를 요구하는 방식으로, 클라우드 환경에서 점점 표준이 되어가고 있습니다.
확대
전통적인 경계 기반 보안의 한계
확대
문제점:
- 한 번 내부 진입에 성공하면 자유롭게 이동 가능 (Lateral Movement)
- 내부자 위협에 취약 (직원, 계약업체)
- 클라우드/SaaS 환경에서 "내부"의 경계가 모호
Zero Trust 핵심 원칙
"Never Trust, Always Verify" — 절대 신뢰하지 않고, 항상 검증
모든 접속 요청은 정책 엔진을 거쳐 허용/거부가 결정됩니다(위 그림 오른쪽). 정책 엔진은 사용자 신원(MFA), 디바이스 상태(보안 패치·백신), 접속 위치(지리적 이상 탐지), 요청 행위(정상 패턴 여부), 최소 권한(필요한 리소스만)을 매번 검증합니다.
Zero Trust의 5가지 원칙
- 최소 권한 원칙: 필요한 최소한의 접근 권한만 부여
- 마이크로 세그멘테이션: 내부 네트워크도 세밀하게 분리
- 다중 인증(MFA): 비밀번호 + 추가 인증 수단 필수
- 지속적 검증: 세션 중에도 지속적으로 신뢰 검증
- 암호화: 내부 트래픽도 암호화 (TLS)
NAC (Network Access Control)
NAC는 Zero Trust의 구현 요소 중 하나로, 네트워크에 접속하려는 디바이스를 검증합니다.
확대
실습 — VPN 클라이언트 연결
회사나 팀에서 .ovpn 파일을 받아 VPN에 접속하는 방법을 실습합니다. 백엔드 개발자가 재택근무나 신규 입사 시 가장 먼저 하게 되는 작업입니다.
# 실습 디렉토리 준비
mkdir -p /tmp/networking/part5/exam_26 && cd /tmp/networking/part5/exam_26
# 팀장에게 받은 client.ovpn 파일로 VPN 접속
sudo openvpn --config client.ovpn
# 접속 성공 시 출력 (마지막 줄)
# Initialization Sequence Completed
# VPN 인터페이스 확인 — tun0에 IP가 할당되어야 함
ip addr show tun0
# 3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP>
# inet 10.8.0.6/24 brd 10.8.0.255 scope global tun0
# 내부망 서버 접속 테스트
ping 10.0.0.10
curl -s http://10.0.0.20:8080/health
# 라우팅 테이블 확인 — VPN 서브넷이 tun0을 통해야 함
ip route show | grep tun0
# 10.0.0.0/16 via 10.8.0.1 dev tun0
# 10.8.0.0/24 dev tun0
- latest handshake 시각—wg show 에서 latest handshake가 3분 이상 경과했으면 피어가 연결을 끊은 것 — 재연결 시도 필요
- 전송/수신 바이트 확인—transfer 항목에서 received 값이 0 B이면 패킷이 들어오지 않는 것 — 방화벽 또는 라우팅 문제
- 두 값 조합 해석—sent는 증가하는데 received가 0이면 일방향 차단 — 상대방 서버의 방화벽 또는 보안 그룹 규칙 점검
접속 전 포트 연결 확인 (안 될 때 먼저 체크):
# VPN 서버 UDP 1194 포트가 뚫려 있는지 테스트
nc -u -z -w 5 -v vpn.company.com 1194
# Connection to vpn.company.com 1194 port [udp/*] succeeded!
# 위 메시지가 안 나오면 → 현재 네트워크가 UDP 1194를 차단 중
# 차단된 경우: TCP 443 폴백 가능한지 확인
nc -z -w 5 -v vpn.company.com 443
WireGuard는 OpenVPN보다 훨씬 간단한 설정으로 고성능 VPN을 제공합니다. 요즘 팀 VPN으로 WireGuard를 쓰는 회사가 빠르게 늘고 있습니다.
팀에서 WireGuard 설정 파일(.conf)을 받아 연결하는 방법:
# 받은 wg0.conf 파일을 시스템에 배치
sudo cp ~/Downloads/wg0.conf /etc/wireguard/wg0.conf
sudo chmod 600 /etc/wireguard/wg0.conf
# wg0.conf 내용 예시 (인프라팀이 만들어 준 파일)
cat /etc/wireguard/wg0.conf
# [Interface]
# Address = 10.9.0.5/24 ← 나한테 할당된 VPN IP
# PrivateKey = <내 개인키>
# DNS = 10.9.0.1
#
# [Peer]
# PublicKey = <서버 공개키>
# Endpoint = vpn.company.com:51820
# AllowedIPs = 10.0.0.0/8 ← 이 대역은 VPN 터널로 보냄
# VPN 연결 시작
sudo wg-quick up wg0
# 연결 상태 확인
sudo wg show
# interface: wg0
# public key: ...
# listening port: 12345
# peer: ...
# endpoint: vpn.company.com:51820
# latest handshake: 5 seconds ago
# transfer: 1.23 KiB received, 2.34 KiB sent
# 내부망 접속 테스트
ping 10.0.0.10
ssh admin@10.0.0.20
# VPN 연결 해제
sudo wg-quick down wg0
키 생성 (인프라팀에서 서버 설정 시 사용 — 참고):
# 클라이언트 키 페어 생성
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey # 이 키는 절대 공유하지 않음
cat publickey # 이 키를 서버 관리자에게 전달
트러블슈팅
증상
VPN에 연결은 되었고 tun0 인터페이스도 생겼는데, 회사 내부 서버에 ping이 가지 않습니다.
# VPN 연결 성공
ip addr show tun0
# inet 10.8.0.6/24 ... ← VPN IP 할당 확인
# 내부 서버 ping 실패
ping 10.0.0.10
# Request timeout for icmp_seq 0
# 라우팅 테이블 확인
ip route show
# 10.0.0.0/16 via 10.8.0.1 dev tun0 ← 라우트는 있음
# 10.8.0.0/24 dev tun0 ← VPN 서브넷
# 192.168.1.0/24 dev eth0 ← 로컬 WiFi
진단 — 서브넷 충돌 확인
# 로컬 네트워크 확인
ip route show | grep eth0
# 192.168.1.0/24 dev eth0
# VPN 서버의 내부망 서브넷 확인 (서버 설정에서)
# push "route 10.0.0.0 255.255.0.0" ← 10.0.0.0/16
# 충돌 확인: 로컬이 192.168.1.x이고 내부망이 10.0.0.x이면 괜찮음
# 문제 발생 예시:
# 로컬 WiFi: 192.168.1.0/24
# VPN 내부망: 192.168.1.0/24 ← 동일! 충돌!
해결 방법
서브넷 충돌이 원인인 경우:
이 명령은 서버의 라우팅 또는 인터페이스 설정을 바꿔 원격 접속이 끊길 수 있습니다. 콘솔 접근과 현재 라우팅 백업을 확보한 뒤 실행하세요.
# 서버 설정 변경: 덜 일반적인 서브넷 사용
# /etc/openvpn/server/server.conf 에서:
# server 10.8.0.0 255.255.255.0 → 기존
# push "route 192.168.100.0 255.255.255.0" → 충돌하지 않는 내부망
# 클라이언트에서 수동 라우팅 추가
sudo ip route add 10.0.0.0/16 via 10.8.0.1 dev tun0
VPN 라우팅이 적용 안 되는 경우:
# VPN 서버 로그 확인
sudo tail -f /var/log/openvpn/openvpn.log
# push route가 실제로 전달되는지 확인
# 클라이언트에서 openvpn 실행 시 verbose 3으로 설정하고 로그 확인:
# PUSH: Received control message: 'PUSH_REPLY,...,route 10.0.0.0 255.255.0.0,...'
# 클라이언트 설정에 pull 지시어 있는지 확인
grep pull client1.ovpn
# client 지시어가 있으면 pull이 포함됨
증상
팀장에게 받은 .ovpn 파일로 OpenVPN을 실행했는데 연결이 안 됩니다. GUI 클라이언트(Tunnelblick, OpenVPN Connect)에서는 그냥 "연결 실패"로만 보이고, 터미널에서 실행하면 아래 로그가 출력됩니다.
2024-03-15 10:23:41 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
2024-03-15 10:23:41 TLS Error: TLS handshake failed
2024-03-15 10:23:41 SIGUSR1[soft,tls-error] received, process restarting
ping은 되는데 VPN만 안 됩니다.
ping vpn.company.com
# PING vpn.company.com: 56 data bytes
# 64 bytes from 203.0.113.50: icmp_seq=0 ttl=55 time=12.3 ms
원인 진단 — 방화벽이 UDP 1194를 막는 경우
TLS key negotiation 타임아웃은 대부분 VPN 서버 포트까지 패킷이 도달하지 못하는 경우입니다. ICMP(ping)는 통과하지만 OpenVPN이 쓰는 UDP 1194 포트가 방화벽에서 차단되는 상황이 가장 흔합니다.
# OpenVPN 기본 포트(UDP 1194) 연결 테스트
nc -u -z -v vpn.company.com 1194 -w 5
# nc: connect to vpn.company.com port 1194 (udp) failed: Connection refused
# 또는 아무 응답 없이 5초 후 종료 → 방화벽이 DROP하는 것
# 이 경우 TCP 443 폴백이 가능한지 확인
# .ovpn 파일에 이런 설정이 있는지 확인
grep "proto\|port" client.ovpn
# proto udp ← UDP 사용 중
# port 1194
해결 방법
방법 1: 사무실/카페 WiFi에서 UDP가 차단되는 경우 — TCP 443으로 전환
회사 서버 측에 TCP 443 모드가 활성화되어 있다면, 팀장에게 TCP 버전 .ovpn 파일을 요청합니다. 또는 직접 수정:
# client.ovpn 에서
# proto udp → proto tcp
# port 1194 → port 443
TCP 443은 HTTPS 포트라 대부분의 네트워크에서 차단되지 않습니다.
방법 2: .ovpn 파일에 인증 파일이 빠진 경우
받은 .ovpn 파일이 인증서/키를 파일 경로로 참조하는 형태라면, 해당 파일들이 같은 디렉토리에 있어야 합니다.
# .ovpn 파일 내용 확인
grep -E "^ca |^cert |^key |^tls-auth " client.ovpn
# ca ca.crt ← ca.crt 파일이 같은 폴더에 있어야 함
# cert client1.crt
# key client1.key
# tls-auth ta.key 1
# 파일 존재 여부 확인
ls -la ca.crt client1.crt client1.key ta.key
# ls: cannot access 'ca.crt': No such file or directory ← 이게 문제!
해결: 팀장에게 인증서 파일 전체 묶음(zip)을 다시 받거나, .ovpn 파일이 인라인 방식으로 패키징된 버전을 요청합니다.
방법 3: 방화벽 로그로 정확한 차단 원인 파악
# Linux 클라이언트라면 openvpn --verb 6 으로 상세 로그
sudo openvpn --config client.ovpn --verb 6 2>&1 | head -50
# 로그에서 "Attempting to establish TCP connection with" 또는
# "write UDP: Network is unreachable" 등으로 정확한 원인 파악
왜 이런 일이 생기나
팀 입장에서는 VPN이 잘 되고 있어서 방심하기 쉽습니다. 신규 입사자가 집/카페에서 처음 접속 시도할 때야 환경 문제가 드러납니다. 회사 네트워크 내부에서는 UDP 1194가 직접 통하지만, 일반 인터넷에서는 ISP나 카페 공유기가 막는 경우가 많습니다.
심화 — VPN은 붙었는데 이름만 안 풀릴 때
심화: split DNS와 DNS 누수 — 터널이 서는 것과 이름이 터널로 가는 것은 다르다
VPN 트러블은 대개 '터널이 서느냐(L3)'에 집중하지만, 터널이 정상인데도 이름 해석(DNS) 이 엉키면 내부 서비스에 도메인으로는 못 붙습니다. IP로는 되는데 도메인으로는 안 되는 순간, 문제는 라우팅이 아니라 DNS 경로입니다.
- 터널이 서는 것과 DNS가 터널로 가는 것은 별개입니다: VPN이 연결되면 서버가 내부 DNS 서버와 검색 도메인을 push하지만, 클라이언트가 이를 실제로 적용하는지는 OS·리졸버(systemd-resolved, resolvconf, macOS 등)에 달렸습니다. 적용이 안 되면 클라이언트는 여전히 카페·공용 DNS로 질의해 내부 호스트명을 못 풉니다. 그래서
ping 10.0.0.10(IP)은 되는데ping intranet.company.com(이름)은 실패합니다. - split-horizon DNS: 같은 도메인이 외부에선 공인 IP, 내부에선 사설 IP로 응답하도록 갈라진 경우가 많습니다. VPN을 타야 내부 DNS가 사설 IP를 주는데, 질의가 공용 DNS로 새면 공인 IP가 돌아와 내부 방화벽에서 막히거나 엉뚱한 곳으로 갑니다.
- DNS 캐시가 전환을 늦춥니다: VPN 연결 전에 그 도메인을 조회해 공인 IP를 캐시했다면, 연결 후에도 TTL이 살아 있는 동안 캐시된 공인 IP로 붙습니다. '방금 VPN 켰는데 왜 아직 안 되지'의 흔한 원인 — 리졸버·브라우저 캐시가 옛 답을 쥐고 있는 것입니다.
- DNS 누수(leak)는 반대 문제: split tunnel에서 DNS 질의만 공용 리졸버로 새면, 내부 조회가 실패할 뿐 아니라 '어떤 내부 도메인을 찾는지'가 외부에 노출되는 보안·프라이버시 문제가 됩니다. Zero Trust 관점에선 이름 해석 경로도 통제 대상입니다.
상황: VPN(tun0)은 정상이고 ping 10.0.0.10 같은 사설 IP도 잘 됩니다. 그런데 curl https://intranet.company.com이나 사내 도메인은 해석 실패(NXDOMAIN)이거나 엉뚱한 공인 IP로 갑니다. 라우팅 테이블에 내부망 경로도 정상으로 보입니다.
원인: 터널은 섰지만 DNS가 터널(내부 DNS)로 가지 않는 것입니다. 클라이언트 리졸버가 VPN이 push한 내부 DNS·검색 도메인을 적용하지 못하고 여전히 로컬(카페) DNS로 질의하거나, split-horizon 도메인을 공용 DNS가 공인 IP로 응답하는 상황입니다. 연결 전에 캐시된 공인 IP가 남아 있으면 증상이 더 헷갈립니다.
진단: resolvectl status(또는 cat /etc/resolv.conf, macOS scutil --dns)로 tun0 링크에 내부 DNS·검색 도메인이 실제로 붙었는지 확인합니다. dig intranet.company.com @내부DNS로 내부 리졸버에 직접 물어 사설 IP가 오는지 보고, 기본 리졸버로 물었을 때와 답이 다르면 DNS 경로 문제로 확정합니다. 캐시가 의심되면 resolvectl flush-caches(또는 브라우저 캐시) 후 재확인합니다.
해결: VPN이 push하는 DNS·검색 도메인이 클라이언트 리졸버에 적용되도록 구성합니다 — OpenVPN은 up/down 스크립트나 systemd-resolved 연동, WireGuard는 [Interface]의 DNS = 내부DNS, 도메인을 씁니다. split-horizon이면 내부 도메인 질의가 내부 DNS로 가도록 도메인 라우팅(split DNS)을 설정하고, 전환 직후엔 리졸버·브라우저 DNS 캐시를 비웁니다. Zero Trust에선 DNS 누수 방지를 위해 이름 해석도 통제된 경로로만 나가게 합니다.
실무 맥락
VPN과 Zero Trust의 공존
전통적인 VPN과 Zero Trust는 완전히 다른 것이 아닙니다. 많은 기업에서 VPN을 Zero Trust 방식으로 운영합니다.
기업 원격 접근 성숙도 단계:
1단계: VPN만 사용 (전통적)
외부 → VPN → 내부망 전체 접근 가능
2단계: VPN + MFA
외부 → VPN + OTP인증 → 내부망 접근
3단계: Zero Trust VPN (ZTNA)
외부 → 신원확인 + 디바이스검증 → 특정 앱만 접근
4단계: SASE (Secure Access Service Edge)
모든 트래픽 → 클라우드 보안 엣지 → 최소권한 접근
현업에서 자주 쓰는 Zero Trust 도구
오픈소스:
- Teleport: 서버, DB, 쿠버네티스 접근 Zero Trust 플랫폼
- Authentik: SSO + MFA 오픈소스
- WireGuard: 차세대 고성능 VPN (OpenVPN 대체)
상용 서비스:
- Cloudflare Zero Trust (구 Access + Gateway)
- Zscaler Private Access (ZPA)
- Palo Alto Prisma Access
WireGuard — 현대적 VPN 대안
OpenVPN의 복잡성을 줄인 간단하고 빠른 차세대 VPN입니다.
이 명령은 방화벽 정책을 변경해 현재 접속 중인 세션이나 운영 트래픽에 즉시 영향을 줄 수 있습니다. 적용 전 허용 대상 IP·포트와 롤백 명령을 확인하세요.
# WireGuard 설치 (Ubuntu)
sudo apt install wireguard
# 키 페어 생성
wg genkey | tee privatekey | wg pubkey > publickey
# 서버 설정 (/etc/wireguard/wg0.conf)
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
Address = 10.9.0.1/24
PrivateKey = <서버_개인키>
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <클라이언트_공개키>
AllowedIPs = 10.9.0.2/32
EOF
# 서비스 시작
sudo systemctl enable --now wg-quick@wg0
보안 감사 관점 체크리스트
VPN/Zero Trust 감사 항목:
□ 모든 VPN 접속에 MFA 적용 여부
□ 인증서 유효 기간 및 갱신 관리
□ 불필요한 VPN 계정 비활성화 (퇴사자 등)
□ VPN 접속 로그 90일 이상 보관
□ 취약 암호화 알고리즘 (DES, 3DES) 사용 여부
□ Split Tunneling 정책 (기업 트래픽만 VPN)
□ Zero Trust 정책 정기 검토 (분기별)
정리
VPN 기술 비교
- IPsec: L3, OS 내장, 성능 우수, 방화벽 통과 어려움
- SSL VPN (OpenVPN): L4~L7, 앱 필요, 방화벽 통과 쉬움
Zero Trust 핵심 원칙
- Never Trust, Always Verify
- 최소 권한 원칙 · 마이크로 세그멘테이션
- 지속적 검증 · 내부 트래픽도 암호화
OpenVPN 구축 요소
- easy-rsa: PKI 인증서 관리 (CA, 서버, 클라이언트)
- server.conf: 서버 설정 (서브넷, 라우트, 암호화)
- .ovpn: 클라이언트 통합 설정 파일
- ip_forward + iptables: 포워딩 및 NAT
주요 트러블슈팅
- 서브넷 충돌 → 내부망/클라이언트/VPN 서브넷 모두 다르게 설정
- 인증서 만료 → 만료 전 갱신 자동화 및 모니터링
명령어·단축키 빠른 참조
이 모듈에서 다룬 VPN 클라이언트 접속·진단 명령을 실전 옵션과 함께 모았습니다. "예" 열을 그대로 써도 됩니다.
| 명령어/옵션 | 용도 | 자주 쓰는 예 |
|---|---|---|
openvpn --config <파일>.ovpn | OpenVPN 클라이언트 접속 | sudo openvpn --config client.ovpn |
ip addr show tun0 | VPN 인터페이스·할당 IP 확인 | ip addr show tun0 |
ip route show | grep tun0 | 내부 대역이 터널로 가는지 확인 | ip route show | grep tun0 |
ip route add <망> via <gw> dev tun0 | 누락된 내부망 경로 수동 추가 | sudo ip route add 10.0.0.0/16 via 10.8.0.1 dev tun0 |
nc -u -z -v <host> 1194 | VPN UDP 포트 차단 여부 진단 | nc -u -z -w 5 -v vpn.company.com 1194 |
wg-quick up/down <if> | WireGuard 연결·해제 | sudo wg-quick up wg0 |
wg show | 핸드셰이크·송수신 바이트 확인 | sudo wg show |
wg genkey | wg pubkey | WireGuard 키페어 생성 | wg genkey | tee privatekey | wg pubkey > publickey |
resolvectl status | tun0에 내부 DNS·검색도메인 적용 확인 | resolvectl status |
dig <도메인> @<내부DNS> | 내부 리졸버가 사설 IP 주는지 대조 | dig intranet.company.com @10.9.0.1 |
관련 모듈로 더 깊이:
- NAT 변환과 포트 포워딩(Port Forwarding) 작동 원리 — OpenVPN의 ip_forward + iptables NAT 동작을 이해하는 기초
- 방화벽 정책 설계와 접근 제어 리스트(ACL) 구성 실무 — 마이크로 세그멘테이션을 방화벽 정책으로 구현하는 법
- 인터넷이 차단된 서버를 외부와 연결하는 Proxy 구성 실무 — 폐쇄망에서 외부 접근을 통제하는 Zero Trust 연장선
다음 챕터에서는 폐쇄망 환경에서 Squid Proxy를 사용하여 외부 인터넷에 간접 접근하는 방법을 배웁니다.