🚀 2026 스타트업 컨퍼런스

FreeBSD로 홈 NAS 구축하기 3편: 묵직한 OpenVPN 대신 WireGuard를 선택한 이유

FreeBSD로 홈 NAS 구축하기 3편: 묵직한 OpenVPN 대신 WireGuard를 선택한 이유

김현수·2026년 1월 4일·3

FreeBSD 홈 NAS 구축 3편. 무거운 OpenVPN 대신 가볍고 빠른 WireGuard를 선택한 이유와 네트워크 아키텍처, 기본적인 설치 및 설정 개념을 다룹니다.

안녕하세요. 지난 시간 우리는 FreeBSD 위에서 ZFS로 튼튼한 저장소를 만들고, PF(Packet Filter)로 기본적인 방화벽 벽돌을 쌓았습니다. 이제 드디어 그 성 안으로 들어갈 수 있는 비밀 통로, 즉 VPN을 뚫을 차례입니다. 솔직히 말씀드리면, 이번 단계가 홈 서버 구축의 꽃이자 가장 골치 아픈 관문이기도 합니다. 집과 사무실, 물리적으로 떨어진 두 공간을 하나의 네트워크처럼 묶어야 하니까요. 목표는 명확합니다. 사무실에 있는 제 FreeBSD NAS에 집이나 카페에서도 안전하게 접속해 블로그 데이터를 백업하고 파일을 관리하는 것입니다.

처음 VPN 구성을 고민할 때, 관성처럼 OpenVPN을 떠올렸습니다. 저도 지난 10년 가까이 OpenVPN을 써왔고, 익숙함이 주는 편안함은 무시할 수 없으니까요. 하지만 홈 NAS 환경에서, 그것도 리소스 관리가 중요한 시점에 OpenVPN은 다소 과하다는 생각이 들었습니다. OpenVPN은 마치 거대한 종합 선물 세트 같습니다. 사용자 공간(User Space)에서 작동하며, SSL/TLS 스택을 전부 끌어안고 있어 코드가 무겁고 복잡합니다. 반면 WireGuard는 충격적일 정도로 가볍습니다. 리눅스 커널 기준으로 WireGuard 코드는 약 4,000줄에 불과합니다. 10만 줄이 넘어가는 OpenVPN과 비교하면 다이어트가 아니라 다시 태어난 수준이죠.

결정적으로 WireGuard는 '서비스'라기보다 '암호화된 네트워크 인터페이스'에 가깝게 동작합니다. 커널 공간(Kernel Space)에서 직접 패킷을 처리하고 암호화하기 때문에, 사용자 공간을 오가는 컨텍스트 스위칭 비용이 획기적으로 줄어듭니다. 또한, 복잡한 클라이언트-서버 모델 대신 P2P(Peer-to-Peer) 방식을 채택해 설정이 직관적입니다. "서버 설정하고 클라이언트 인증서 굽고..." 하는 복잡한 절차 대신, 그저 서로의 키(Key)와 허용 IP만 알면 되는 식이죠. 엔지니어로서 '단순함이 곧 성능이자 보안'이라는 원칙을 다시 한번 확인하는 순간이었습니다.

네트워크 아키텍처는 이렇습니다. 사무실 네트워크(192.168.0.0/24)에 있는 FreeBSD NAS가 WireGuard의 거점 역할을 합니다. 그리고 집(192.168.100.0/24)에 있는 제 노트북이 이 거점으로 접속하게 되죠. 이때 VPN 내부에서는 10.8.0.0/24라는 별도의 사설 대역을 사용할 겁니다. 사무실 공유기인 TP-Link Archer AX12가 문지기 역할을 하며 포트 포워딩을 해주고, 내부로 들어온 트래픽은 FreeBSD의 PF 방화벽이 깐깐하게 검사하는 구조를 짰습니다. 이렇게 하면 물리적으로는 떨어져 있어도 논리적으로는 바로 옆 책상에 있는 서버처럼 NAS에 접근할 수 있게 됩니다.

FreeBSD에서 WireGuard를 설치하는 과정은 리눅스만큼이나 쾌적합니다. pkg install wireguard-tools 명령어로 도구를 설치하고, kldload if_wg로 커널 모듈을 올리면 끝입니다. sysrc를 통해 부팅 시 자동으로 실행되도록 설정하는 것도 잊지 말아야겠죠. 여기서 중요한 점은 단순히 VPN 소프트웨어를 띄우는 게 아니라, 서버가 트래픽을 중계할 수 있도록 만들어야 한다는 것입니다. NAS가 단순한 저장소가 아니라 일종의 라우터가 되어야 하기에 net.inet.ip.forwarding=1 설정을 통해 IP 포워딩을 활성화해야 합니다. 이 설정 하나를 빼먹어서 "왜 연결은 됐는데 인터넷이 안 되지?" 하며 밤을 새운 기억, 개발자라면 누구나 한 번쯤 있을 겁니다.

마지막으로 가장 긴장되는 순간, 방화벽 설정입니다. 지난 포스트에서 우리는 block all이라는 아주 강력한 정책으로 모든 문을 닫아걸었습니다. 이제 WireGuard를 위해 아주 좁고 안전한 틈을 열어야 합니다. 우선 WireGuard의 핸드셰이크(Handshake)를 위해 UDP 51820 포트를 열어야 하고, VPN 터널을 타고 들어온 내부 트래픽(10.8.0.0/24)이 NAS의 SSH나 서비스에 접근할 수 있도록 허용해야 합니다. 여기서 실수를 하면 기껏 VPN을 뚫어놓고도 방화벽에 막혀 패킷이 증발하는 허무한 상황을 맞이하게 됩니다. 다음 글에서는 실제로 키를 생성하고, 리눅스 클라이언트와 연결해 핑(Ping)이 오가는 짜릿한 순간을 공유하겠습니다. 터미널 앞에서의 고군분투는 계속됩니다.

김현수
김현수10년 차 시니어 개발자

SI의 척박한 땅에서 시작해 빅테크의 대규모 트래픽까지 경험한 생존형 개발자입니다. '화려한 기술'보다 '퇴근을 보장하는 안정성'을 신봉하며, 주니어들의 삽질을 방지하기 위해 펜을 들었습니다.

김현수님의 다른 글

댓글 0

첫 번째 댓글을 남겨보세요!