🔒 보안

VPN

Virtual Private Network (가상 사설망)

VPN(Virtual Private Network)은 공용 네트워크를 통해 암호화된 터널을 생성하여 안전한 통신을 가능하게 합니다. WireGuard, OpenVPN, IPSec 등의 프로토콜이 있으며, 원격 근무와 기업 네트워크 보안에 필수적입니다.

📖 상세 설명

VPN(Virtual Private Network)은 공용 인터넷을 통해 암호화된 "터널"을 생성하여 마치 전용 네트워크에 연결된 것처럼 안전하게 통신하는 기술입니다. VPN은 데이터 암호화, IP 주소 마스킹, 지역 제한 우회 등의 기능을 제공합니다. 기업에서는 원격 근무자가 사내 네트워크에 안전하게 접속하거나, 지사 간 네트워크를 연결하는 데 사용합니다.

VPN 프로토콜은 여러 세대를 거쳐 발전했습니다. IPSec은 네트워크 계층에서 작동하며 사이트 간 VPN에 많이 사용됩니다. OpenVPN은 SSL/TLS 기반의 오픈소스 솔루션으로 유연성이 높습니다. WireGuard는 2020년 Linux 커널에 통합된 최신 프로토콜로, 4,000줄 미만의 간결한 코드, 현대적 암호화(ChaCha20, Curve25519), 빠른 연결 속도가 특징입니다. 2025년 현재 WireGuard가 새로운 VPN 구축의 표준으로 자리잡고 있습니다.

Zero Trust 아키텍처의 부상으로 VPN의 역할이 변화하고 있습니다. 전통적인 VPN은 연결 후 네트워크 전체에 접근하는 "성벽" 모델이었습니다. 반면 Zero Trust Network Access(ZTNA)는 "신뢰하지 않고 항상 검증"하여 특정 리소스에만 세분화된 접근을 허용합니다. Tailscale, Cloudflare Access 같은 솔루션은 WireGuard 기반으로 ZTNA를 구현하여 VPN의 암호화 장점과 Zero Trust의 세분화된 접근 제어를 결합합니다.

SSL VPN(Fortinet, SonicWall 등)의 심각한 취약점이 지속적으로 발견되면서, 많은 조직이 WireGuard 기반 솔루션으로 마이그레이션하고 있습니다. WireGuard는 작은 코드베이스로 감사가 용이하고, 스텔스 모드로 UDP 포트 스캔에 응답하지 않아 공격 표면이 적습니다. Defguard, Netmaker 같은 솔루션은 WireGuard에 MFA, ACL, 중앙 관리 기능을 추가하여 엔터프라이즈 요구를 충족합니다.

💻 코드 예제

# WireGuard VPN 서버 설정 (Ubuntu/Debian)
# WireGuard는 Linux 커널 5.6+에 내장

# 1. 설치
sudo apt update && sudo apt install wireguard

# 2. 키 쌍 생성 (서버)
cd /etc/wireguard
umask 077  # 파일 권한 제한
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 3. 서버 설정 파일 (/etc/wireguard/wg0.conf)
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# 서버 개인키 (절대 공유 금지!)
PrivateKey = SERVER_PRIVATE_KEY_HERE
# VPN 내부 IP 주소
Address = 10.0.0.1/24
# 수신 포트 (UDP)
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 = CLIENT_PUBLIC_KEY_HERE
# 클라이언트에 할당할 IP
AllowedIPs = 10.0.0.2/32
# 선택: 동적 IP 클라이언트용 keepalive
PersistentKeepalive = 25
EOF

# 4. 커널 IP 포워딩 활성화
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 5. WireGuard 시작
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

# 6. 상태 확인
sudo wg show

# === 클라이언트 설정 (/etc/wireguard/wg0.conf) ===
cat > client_wg0.conf << 'EOF'
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY_HERE
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = SERVER_PUBLIC_KEY_HERE
# 서버 주소:포트
Endpoint = vpn.example.com:51820
# 모든 트래픽을 VPN으로 (전체 터널)
AllowedIPs = 0.0.0.0/0
# 또는 특정 네트워크만 (스플릿 터널)
# AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
EOF

# QR 코드 생성 (모바일 클라이언트용)
# sudo apt install qrencode
qrencode -t ansiutf8 < client_wg0.conf

# 보안 참고:
# - WireGuard는 4,000줄 미만의 간결한 코드 (OpenVPN: 100,000+줄)
# - ChaCha20-Poly1305 암호화, Curve25519 키 교환
# - 스텔스: 인증되지 않은 패킷에 응답 안 함 (포트 스캔 불가)
# Tailscale - WireGuard 기반 Zero Trust VPN
# 중앙 관리, SSO 통합, ACL로 세분화된 접근 제어

# 1. 설치 (Linux)
curl -fsSL https://tailscale.com/install.sh | sh

# 2. 연결 (브라우저에서 SSO 인증)
sudo tailscale up

# 기업 SSO 연동 (SAML, OIDC)
sudo tailscale up --login-server=https://login.tailscale.com

# 3. 상태 확인
tailscale status
# 결과 예:
# 100.64.0.1    my-laptop    user@example.com  linux   -
# 100.64.0.2    office-pc    user@example.com  windows -
# 100.64.0.3    server-prod  admin@example.com linux   -

# 4. 다른 기기에 SSH 접속 (Tailscale IP 사용)
ssh 100.64.0.3  # 또는
ssh server-prod  # MagicDNS로 호스트명 사용

# === ACL (Access Control List) 정책 예제 ===
# tailscale.com 관리 콘솔에서 설정
{
  "acls": [
    // 개발자는 개발 서버만 접근 가능
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:dev:*"]
    },
    // 관리자는 모든 서버 접근 가능
    {
      "action": "accept",
      "src": ["group:admins"],
      "dst": ["*:*"]
    },
    // 모든 사용자는 사내 웹앱만 접근
    {
      "action": "accept",
      "src": ["*"],
      "dst": ["tag:webapp:80,443"]
    }
  ],
  "tagOwners": {
    "tag:dev": ["group:devops"],
    "tag:prod": ["group:admins"],
    "tag:webapp": ["group:admins"]
  },
  "groups": {
    "group:developers": ["user1@example.com", "user2@example.com"],
    "group:admins": ["admin@example.com"],
    "group:devops": ["devops@example.com"]
  }
}

# === Subnet Router (사내 네트워크 접근) ===
# 사내에 Tailscale 노드를 설치하고 서브넷 라우터로 설정
sudo tailscale up --advertise-routes=192.168.1.0/24

# 관리 콘솔에서 라우트 승인 후, 모든 Tailscale 기기에서
# 192.168.1.0/24 네트워크 접근 가능

# === Exit Node (전체 인터넷 트래픽 VPN 경유) ===
# 서버에서 Exit Node 활성화
sudo tailscale up --advertise-exit-node

# 클라이언트에서 Exit Node 사용
tailscale up --exit-node=server-prod

# 장점:
# - WireGuard 기반으로 빠르고 안전
# - NAT 통과 자동 처리 (DERP 릴레이)
# - SSO/MFA 통합
# - 세분화된 ACL로 Zero Trust 구현
# - 설치 수분 내 완료 (전통적 VPN: 수 시간~수일)
# OpenVPN 서버 설정 (Ubuntu/Debian)
# 레거시 시스템이나 특수 요구사항에 사용

# 1. 설치
sudo apt update
sudo apt install openvpn easy-rsa

# 2. PKI 초기화 및 인증서 생성
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca nopass           # CA 생성
./easyrsa gen-req server nopass     # 서버 인증서 요청
./easyrsa sign-req server server    # 서버 인증서 서명
./easyrsa gen-dh                    # DH 파라미터
openvpn --genkey secret ta.key      # TLS-Auth 키

# 3. 서버 설정 (/etc/openvpn/server.conf)
cat > /etc/openvpn/server.conf << 'EOF'
port 1194
proto udp
dev tun

# 인증서 경로
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/ta.key 0

# VPN 네트워크
server 10.8.0.0 255.255.255.0

# 클라이언트가 서로 통신 가능
client-to-client

# 모든 트래픽을 VPN으로
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"

# 보안 설정 (2025 권장)
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384

# 로깅
log-append /var/log/openvpn.log
verb 3
EOF

# 4. 클라이언트 인증서 생성
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

# 5. 클라이언트 설정 파일 (.ovpn)
cat > client1.ovpn << 'EOF'
client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun


# CA 인증서 내용



# 클라이언트 인증서 내용



# 클라이언트 개인키 내용



# ta.key 내용

key-direction 1

cipher AES-256-GCM
auth SHA256
verb 3
EOF

# OpenVPN vs WireGuard:
# OpenVPN: 100,000+ 줄 코드, 복잡한 설정, 인증서 관리 필요
# WireGuard: 4,000줄 코드, 간단한 설정, 키 쌍만 사용
# 새 프로젝트는 WireGuard 권장

🗣️ 실무에서 이렇게 말하세요

💬 인프라 현대화 회의에서
"레거시 SSL VPN에서 WireGuard 기반 솔루션으로 마이그레이션을 제안합니다. Fortinet VPN 취약점이 계속 발견되고 있고, WireGuard는 코드베이스가 작아 감사와 유지보수가 쉽습니다. Tailscale이나 자체 WireGuard 서버를 검토해볼 수 있습니다."
💬 Zero Trust 도입 논의에서
"VPN만으로는 Zero Trust를 달성할 수 없습니다. VPN 연결 후에도 사용자가 모든 내부 리소스에 접근하는 것은 문제입니다. ZTNA를 적용해서 역할별로 필요한 서비스에만 접근하도록 ACL을 설정해야 합니다. Tailscale ACL이나 Cloudflare Access를 검토해보세요."
💬 원격 근무 보안 정책에서
"원격 근무자는 반드시 VPN을 통해 사내 시스템에 접속해야 합니다. 스플릿 터널링으로 사내 트래픽만 VPN을 경유하면 성능도 좋고, 개인 인터넷 사용은 영향받지 않습니다. MFA도 필수로 적용하고, 기기 상태 검증도 추가하면 좋겠습니다."

⚠️ 주의사항 & 베스트 프랙티스

VPN만으로 완전한 보안 착각

VPN은 전송 중 데이터를 암호화하지만, 연결 후 내부 위협에는 무방비입니다. VPN + Zero Trust 원칙(세분화된 접근 제어, 지속적 검증)을 함께 적용하세요.

취약한 SSL VPN 방치

Fortinet, SonicWall, Ivanti 등 SSL VPN의 심각한 취약점이 지속 발견됩니다. 패치 적용을 미루지 마세요. 가능하면 WireGuard 기반 솔루션으로 마이그레이션을 검토하세요.

MFA 없이 VPN 운영

VPN 자격 증명만으로 인증하면 피싱이나 자격 증명 유출에 취약합니다. TOTP, 하드웨어 키(YubiKey), 또는 SSO 연동 MFA를 필수로 적용하세요.

VPN 베스트 프랙티스

WireGuard 또는 WireGuard 기반 솔루션(Tailscale, Netmaker) 사용, MFA 필수, ACL로 세분화된 접근 제어, 스플릿 터널링으로 성능 최적화, 로깅 및 모니터링, 정기적 키 로테이션. Zero Trust 원칙과 함께 운영하세요.

🔗 관련 용어

📚 더 배우기