우수한 소프트웨어와 실용적인 튜토리얼
무엇인가요와이어가드
와이어가드 최신 암호화 기술을 활용하는, 구성이 간편하고 빠르며 안전한 오픈 소스 VPN입니다. Raspberry Pi와 같은 저사양 기기부터 고성능 서버까지 쉽게 구축할 수 있는 더 빠르고 간편하며 효율적인 범용 VPN을 제공하는 것이 목표입니다.
IPsec과 OpenVPN 등 대부분의 다른 솔루션은 수십 년 전 보안 연구자이자 커널 개발자인 제이슨 도넨펠트가 이러한 솔루션이 느리고 적절하게 구성하고 관리하기 어렵다는 것을 깨닫고 개발되었습니다.
이를 통해 그는 더 빠르고, 더 안전하며, 배포와 관리가 쉬운 새로운 오픈 소스 VPN 프로토콜과 솔루션을 만들게 되었습니다.
WireGuard는 원래 Linux용으로 개발되었지만, 현재 Windows, macOS, BSD, iOS, Android용으로 출시되었습니다. 현재도 활발하게 개발 중입니다.
WireGuard가 왜 그렇게 인기가 있나요?
WireGuard의 가장 큰 장점 중 하나는 크로스 플랫폼이라는 점 외에도 배포가 쉽다는 것입니다. WireGuard를 구성하고 배포하는 것은 SSH를 구성하고 사용하는 것만큼 쉽습니다.
WireGuard 설정 가이드를 살펴보세요. WireGuard를 설치하고, 공개 키와 개인 키(SSH 등)를 생성하고, 방화벽 규칙을 설정하고 서비스를 시작하세요. 이제 OpenVPN 설정 가이드와 비교해 보세요. 할 일이 정말 많습니다.
WireGuard의 또 다른 장점은 4,000줄에 불과한 간결한 코드 베이스를 가지고 있다는 것입니다. 10만 줄의 코드를 가진 또 다른 인기 오픈소스 VPN인 OpenVPN과 비교해 보세요. WireGuard 디버깅이 훨씬 쉬워진 것은 분명합니다.
단순함을 과소평가하지 마세요. WireGuard는 Noise 프로토콜 프레임워크, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF 및 안전하고 신뢰할 수 있는 구조 등 최신 암호화 기술을 모두 지원합니다.
WireGuard는 커널 공간에서 실행되므로 고속으로 안전한 네트워킹을 제공할 수 있습니다.
주요 가상 네트워크 기능
현재 시장에 출시된 주요 가상 네트워크로는 IPSEC 가상 네트워크, SSL 가상 네트워크, PPTP 가상 네트워크, L2TP 가상 네트워크 등이 있습니다. 이러한 가상 네트워크는 아래 표 1에서 볼 수 있듯이 보안 및 성능 측면에서 분명한 단점이 있습니다.

WireGuard 소개
WireGuard 가상 네트워크는 최신 커널 수준 가상 네트워크입니다. 리눅스 창시자 리누스 토발즈가 강력히 추천했으며, 2020년 3월 리눅스 5.6 커널에 공식적으로 통합되었습니다. 이후 GG는 WireGuard 가상 네트워크를 안드로이드 12의 리눅스 커널에 추가했습니다. WireGuard의 장점은 아래 표 2와 같이 높은 보안성, 높은 성능, 낮은 복잡성입니다.

OpenVPN과 IPSec의 수십만 줄의 코드와 비교했을 때 WireGuard의 코드는 불과 4,000줄뿐입니다.
리눅스 창시자리누스 토발즈우편으로그것을 부르다예술 작품:예술 작품, 원래 이메일: https://lists.openwall.net/netdev/2018/08/02/124
다시 한번 이 플러그인에 대한 애정을 표현하고, 곧 통합되기를 바랍니다. 코드가 완벽하지는 않지만, 훑어봤는데, OpenVPN과 IPSec의 끔찍한 성능에 비하면 정말 예술 작품입니다.
와이어가드 보안
- Curve25519는 현재 가장 높은 수준의 키 교환 알고리즘입니다.
- ChaCha20 대칭 암호화 및 복호화 알고리즘은 AES보다 빠르고 효율적입니다.
- Poly1305는 데이터 무결성과 메시지 진위성을 확인하는 데 사용되는 MAC(메시지 인증 코드) 표준입니다.
- BLAKE2는 보다 안전한 HASH 알고리즘입니다(SHA1, SHA256, MD5와 유사).
- SipHash24 또 다른 HASH 알고리즘입니다.
- HKDF는 키 도출 알고리즘입니다
WireGuard 가상 네트워크 기능
WireGuard 가상 네트워크는 100% 커널에서 처리되므로 사용자 프로세스와 커널 간의 상호 작용 오버헤드가 제거되어 성능이 뛰어나며, 이는 그림 1에서 볼 수 있듯이 SSL 가상 네트워크/Open 가상 네트워크의 2~4배에 달하는 높은 처리량으로 나타납니다. 동시에 대기 시간은 그림 2에서 볼 수 있듯이 SSL 가상 네트워크/Open 가상 네트워크의 30%~40%로 낮습니다.


더 높은 처리량과 더 낮은 지연 시간은 동일한 대역폭을 사용하는 네트워크 환경에서 더 많은 동시 가상 네트워크 사용자 수, 더 낮은 시스템 부하, 그리고 더 안정적인 장기 운영을 의미합니다. 이는 100명에서 10,000명 규모의 사용자, 제로 트러스트, 그리고 SD-WAN을 갖춘 가상 네트워크를 선택할 때 고려해야 할 핵심 요소 중 하나입니다.
가상 네트워크 서비스가 100% 커널에 의해 처리되는지 확인하려면 SHELL에서 netstat –nap 명령을 실행하여 가상 네트워크 서버의 수신 대기 포트에 해당하는 프로그램을 확인할 수 있습니다. 마지막 열에 프로그램 이름이 있으면 사용자 모드 프로그램이 수신 대기 중임을 의미합니다. 마지막 열에 프로그램 이름 없이 "-" 기호가 표시되면 커널이 수신 대기 중임을 의미합니다. 다음은 Dadi Cloud Control System의 다양한 가상 네트워크 서버에 대한 통계이며, 아래 표 3과 같습니다.

WireGuard 가상 네트워크 모듈 소개
WireGuard 가상 네트워크는 공개/개인 키 암호화 시스템입니다. 암호화 매개변수는 자신의 개인 키와 상대방의 공개 키로 구성됩니다. 즉, 통신 당사자는 사전에 공개 키를 교환해야 합니다. 클라이언트 수가 많을 경우, 키의 생성, 수정, 폐기, 교환 및 클라이언트 설정 파일의 획득은 관리 부담이 됩니다. 따라서 IKEv2 가상 네트워크는 CA 암호화 시스템입니다. 실제 도메인 이름을 가진 CA 인증서를 사용하면 사전에 공개 키를 교환하는 단계를 생략할 수 있습니다.
WireGuard 설치
- 공식 설치 설명서: https://www.wireguard.com/install/
- Docker 설치: https://hub.docker.com/r/linuxserver/wireguard
CentOS 7 Wireguard 소스 설치
curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
CentOS 7에 Wireguard 설치
yum install -y wireguard-dkms wireguard-tools
속도가 느리다고 생각되면 먼저 Wireguard 소스로 가서 RPM 패키지를 다운로드하세요.
wget https://copr-be.cloud.fedoraproject.org/results/jdoss/wireguard/epel-7-x86_64/02151984-wireguard-dkms/wireguard-dkms-1.0.20210424-1.el7.noarch.rpm
CentOS 8에 Wireguard 설치
yum install epel-release yum config-manager --set-enabled powerTools yum copr enable jdoss/wireguard yum install wireguard-dkms wireguard-tools
WireGuard 구성
WireGuard 구성 지침
- 서버 설정 파일의 [인터페이스]에는 서버의 개인 키가 저장되고, 클라이언트 설정 파일의 [인터페이스]에도 클라이언트의 개인 키가 저장됩니다.
- 서버 구성 파일의 [Peer]는 클라이언트의 공개 키를 저장하고, 클라이언트 구성 파일의 [Peer]는 서버의 공개 키를 저장합니다.
- 서버와 클라이언트는 각자의 개인 키를 [인터페이스]에 저장하고 서로의 공개 키를 [피어]에 저장합니다.
Wireguard 서버 구성
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf
[인터페이스] #주소만 쓰고 로컬 가상 주소에 할당하면 됩니다. 서버와 클라이언트 주소는 고유하며 충돌할 수 없습니다.주소 = 178.10.10.1/24 SaveConfig = true #서버 방화벽은 UDP 포트의 위장을 활성화하고 외부 네트워크에 매핑하기만 하면 됩니다.PostUp = firewall-cmd --zone=public --add-port 50107/udp &&firewall-cmd --zone=public --add-masquerade PostDown = firewall-cmd --zone=public --remove-port 50107/udp && firewall-cmd --zone=public --remove-masquerade # 상위 방화벽에서 열린 포트를 수신합니다.ListenPort = 50107 #PrivateKey는 서버의 개인 키입니다.PrivateKey = kADzYhPw3F1XCAolbpHQKyPjZE1VQQeyncL60wbFQlM= [Peer] #PublicKey는 클라이언트의 공개 키입니다. PublicKey = xUh7M1dhWZijlQfZv1bqPAvI8dwCfsdm8RD7NfumqXY= # 서버 allowip은 서버의 외부 네트워크 IP 세그먼트와 로컬 네트워크 IP 세그먼트를 쓸 수 없습니다. 로컬 머신이 VPN 네트워킹을 통해 액세스하려는 네트워크 세그먼트만 쓰면 됩니다. 여기서 서버는 클라이언트의 내부 네트워크 IP 세그먼트에 직접 액세스할 필요가 없으므로 가상 주소 세그먼트만 씁니다. AllowedIPs = 178.10.10.2/32 EOF
처음으로 서비스를 시작하려면 재시작을 사용하세요.
systemctl 재시작 wg-quick@wg0.service
이후 구성 변경 후 다시 로드를 활성화합니다.
systemctl wg-quick@wg0.service를 다시 로드합니다.
서비스는 양쪽이 정상적으로 통신할 수 있을 때만 자동으로 시작되도록 설정할 수 있습니다.
systemctl enable wg-quick@wg0.service
WireGuard 클라이언트 구성
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf
[인터페이스] # 개인 키는 클라이언트 개인 키입니다.PrivateKey = CERouQpIqthDNhcSKqS2I/lexMH9z/pImXajg7QLs3E= # 주소는 로컬 가상 주소에 쓰기 및 할당하기만 하면 됩니다. 서버와 클라이언트 주소는 고유하며 충돌할 수 없습니다.주소 = 178.10.10.6/32 # Wireguard 통신에 사용할 네트워크 인터페이스를 결정하세요. 다음은 eth0입니다. PostUp = iptables -I INPUT -i %i -j ACCEPT; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D INPUT -i %i -j ACCEPT;iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] #PublicKey는 서버의 공개 키입니다.PublicKey = yVco0xaLnYtcR1eMjBfRnZ6mmUvmpOSeasS250nLkE4= #endpoint는 서버의 외부 IP+포트입니다.Endpoint = xxx.xx.x.xx:50107 #allowip은 서버의 외부 IP 세그먼트와 로컬 네트워크 IP 세그먼트를 쓸 수 없습니다. 로컬 머신이 VPN 네트워킹을 통해 액세스하려는 네트워크 세그먼트만 작성하면 됩니다. 클라이언트가 서버의 내부 IP 세그먼트에 액세스해야 하므로 서버의 가상 주소 세그먼트와 내부 IP 세그먼트만 작성합니다. 허용 IP = 178.10.10.0/24, 192.168.0.100/24 지속적 유지 = 10 EOF
처음으로 서비스를 시작하려면 재시작을 사용하세요.
systemctl 재시작 wg-quick@wg0.service
이후 구성 변경 후 다시 로드를 활성화합니다.
systemctl wg-quick@wg0.service를 다시 로드합니다.
서비스는 양쪽이 정상적으로 통신할 수 있을 때만 자동으로 시작되도록 설정할 수 있습니다.
systemctl enable wg-quick@wg0.service
Wireguard Mac 구성
# brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"를 설치합니다. # homebrew-bottle 소스를 설치합니다. echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc 소스 ~/.zshrc # wireguard를 설치합니다. brew를 설치합니다. wiregraurd-tools를 설치합니다.
일상에서의 WireGuard 사용
용법:
사용법: wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] # 구성을 저장합니다. 이 명령줄 방법은 제어가 더 쉽습니다. /etc/wireguard/wg0.conf의 구성 파일을 직접 편집하지 않는 것이 좋습니다. touch /etc/wireguard/wg0.conf wg-quick save wg0 # 또는: wg showconf wg0 > /etc/wireguard/wg0.conf # 피어가 NAT 뒤에 있는 경우, 해당 엔드포인트 정보에 직접 액세스할 수 없으므로 해당 정보를 삭제해야 할 수 있습니다. # wg-quick up wg0 시작/중지 # '/etc/wireguard/wg0.conf' 구성 파일을 자동으로 선택합니다. wg-quick up /path/to/wg0.conf # 경로 지정 wg-quick down wg0 # 피어 삭제 wg set wg0 peer $(cat cpublickey1) remove
WireGuard 사용 사례
이전 시나리오는 가장 간단한 사용 시나리오인 기본적인 지점 간(point-to-point) 시나리오일 뿐입니다. 아래에서 다른 사용 시나리오에 대해 살펴보겠습니다.
시나리오 1: PC-LAN
# 클라이언트가 서버의 모든 LAN에 액세스하도록 허용합니다(예: PC-LAN, 이 모드가 일반적으로 사용됨) # 기본 시나리오에 따라 다음 설정을 수행해야 합니다. ## 서버: # 서버 측 엔터프라이즈 라우터에 vpn 네트워크 세그먼트 경로를 추가합니다. # [로컬 LAN IP]를 통해 172.30.0.0/24 ## 클라이언트: # 로컬 라우팅 테이블에 서버 측 네트워크 세그먼트를 추가합니다. ip route add 10.1.0.0/16 via 172.30.0.1 ... # 서버 측 네트워크가 클라이언트 측에 액세스하도록 허용합니다(IP 링크 다운 + 업이 필요 없음. 여기서 0.0.0.0/0은 모든 네트워크를 나타냄) wg set wg0 peer dLssxxxxxxxxxxxxxxxxxq98NQKOivi3MN/VM= 지속적 keepalive 25 허용된 IP 172.30.0.1/32,0.0.0.0/0 엔드포인트 192.168.11.29:51820
시나리오 2: LAN-to-LAN
# 양쪽 LAN을 통합 LAN(즉, LAN-to-LAN)으로 연결합니다.# 기본 시나리오에 따라 다음 설정을 수행해야 합니다.## 서버에서: # 서버 측 엔터프라이즈 라우터에 VPN 네트워크 세그먼트 경로를 추가합니다.# [로컬 LAN IP]를 통해 172.30.0.0/24 # 서버 측 엔터프라이즈 라우터에 클라이언트 측 네트워크 세그먼트 경로를 추가합니다.# [로컬 LAN IP]를 통해 192.168.2.0/24 # ... # 로컬 라우팅 테이블에 클라이언트 측 네트워크 세그먼트 경로를 추가합니다.ip route add 172.30.0.2를 통해 192.168.0.0/16 ... # 클라이언트가 서버 측 네트워크에 액세스하도록 허용합니다(ip link down + up 필요 없음) wg set wg0 peer VbR3Kxgxxxxxxxxxxxxxxxxxxzq3H4ebdgTng= allowed-ips 172.30.0.2/32,192.168.0.0/24## 클라이언트에서: # 클라이언트 엔터프라이즈 라우터에 VPN 네트워크 세그먼트 경로 추가 # 172.30.0.0/24 [로컬 LAN IP]를 통해 # 클라이언트 엔터프라이즈 라우터에 서버 네트워크 세그먼트 경로 추가 # 10.1.0.0/16 [로컬 LAN IP]를 통해 # ... # 로컬 라우팅 테이블에 서버 네트워크 세그먼트 경로 추가 ip route add 10.1.0.0/16 172.30.0.1 ... # 서버가 클라이언트 네트워크에 액세스하도록 허용(IP 링크 다운 + 업이 필요 없음; 0.0.0.0/0은 모든 네트워크를 나타냄) wg set wg0 peer dLssxxxxxxxxxxxxxxxxxx98NQKOivi3MN/VM= 지속적 유지 25 허용 IP 172.30.0.1/32,0
WireGuard가 인기 있는 데에는 그럴 만한 이유가 있습니다. Mullvad VPN과 같은 일부 인기 개인 정보 보호 중심 VPN은 이미 WireGuard를 사용하고 있으며, 가까운 미래에 도입률이 증가할 것으로 예상됩니다. 자세한 정보, 구성 및 시나리오 적용 방법은 공식 문서를 참조하세요.