- 리눅스 한 학기 살기 - 4주차2025년 04월 09일 16시 30분 10초에 업로드 된 글입니다.작성자: kugorang
들어가며
라즈베리파이에 VPN이 함께하면 무엇도 두렵지 않아! 지난 3주에 걸쳐 ssh와 원격 데스크톱 설정을 완료했다고 생각하던 찰나, 공인 IP에 SSH(22번)나 RDP(3389번) 포트를 그냥 노출시키는 건 엄청 위험하다는 것을 알게 되었고 그로 인해 라즈베리파이5의 보안 강화를 위해 VPN을 설치하게 되었다. VPN은 외부에서 라즈베리파이가 있는 내부 네트워크로 안전하게 접속할 수 있는 암호화된 터널을 제공하기 때문에, 보안상 걱정이 없을 것으로 보인다.
사용 목적(외부에서 집 안의 라즈베리파이로 안전하게 접속)에 가장 적합하고, 비교적 설정이 간편하며, 라즈베리파이 환경에서 많이 사용되는 VPN 솔루션 두 가지를 정리하고 그에 따른 설정 방법과 Trouble Shooting 과정을 단계별로 설명하겠다.
추천 VPN 솔루션
비교적 사용하기 편한 VPN 솔루션은 아래 두 가지였다.
- Tailscale (테일스케일)
- 장점: 설정이 매우 간편하다. 복잡한 방화벽 설정이나 포트 포워딩이 대부분 필요 없다 (NAT Traversal 기술 사용). ZeroTier와 유사한 메쉬(Mesh) VPN 방식으로, 개인 사용자에게는 무료 플랜으로도 충분하다. 보안성이 높고 관리가 용이하다.
- 단점: 중앙 관리 서버(Control Plane)를 Tailscale 회사에서 운영한다 (데이터 자체는 P2P 암호화 통신). 완전한 독립성을 원한다면 다른 옵션을 고려해야 할 수 있다.
- 추천 대상: VPN 설정이 처음이거나, 복잡한 네트워크 설정 없이 쉽고 빠르게 보안 접속 환경을 구축하고 싶은 사용자에게 가장 강력히 추천한다.
- WireGuard (와이어가드)
- 장점: 최신 VPN 프로토콜로, 가볍고 성능이 매우 뛰어나다. OpenVPN보다 설정이 간결하고 라즈베리파이 같은 저사양 기기에서도 효율적으로 동작한다. 오픈 소스이며 보안성이 검증되었다.
- 단점: 일반적으로 공유기(라우터)에서 포트 포워딩 설정이 필요하다. 공인 IP 주소가 유동적이라면 DDNS(동적 DNS) 설정이 추가로 필요할 수 있다. Tailscale보다는 설정 과정이 조금 더 복잡하다.
- 추천 대상: 네트워크 설정(포트 포워딩, DDNS)에 대한 이해가 있고, 직접 VPN 서버를 운영하며 모든 통제권을 가지고 싶은 사용자에게 적합하다.
설정 방법 (Step-by-Step)
방법 1: Tailscale 설정하기 (가장 쉬운 방법)
- Tailscale 계정 생성: 웹 브라우저에서 Tailscale 공식 홈페이지에 접속하여 Google, Microsoft, GitHub 계정 등을 이용해 무료 계정을 생성한다.
- 라즈베리파이에 Tailscale 설치:
- 라즈베리파이의 터미널을 연다 (SSH 또는 직접 연결).
- 다음 명령어를 순서대로 실행하여 Tailscale을 설치하고 실행한다.
# GPG 키 추가 및 저장소 설정 스크립트 다운로드 및 실행 curl -fsSL https://tailscale.com/install.sh | sh # Tailscale 서비스 시작 및 활성화 (자동 실행 등록) sudo systemctl enable --now tailscaled
- 라즈베리파이를 Tailscale 계정에 연결:
- 터미널에 다음 명령어를 입력한다.
sudo tailscale up
- 명령어를 실행하면 터미널에 인증 URL이 표시된다. 이 URL을 복사하여 컴퓨터나 스마트폰의 웹 브라우저에 붙여넣고, 1단계에서 생성한 Tailscale 계정으로 로그인하여 기기를 인증한다.
- 인증이 완료되면 라즈베리파이가 Tailscale 네트워크에 등록된다.
- 터미널에 다음 명령어를 입력한다.
- 접속할 클라이언트 기기(PC, 노트북, 스마트폰 등)에 Tailscale 설치:
- Tailscale 홈페이지의 Download 페이지로 이동하여 사용하는 운영체제(Windows, macOS, Linux, Android, iOS 등)에 맞는 클라이언트를 다운로드하고 설치한다.
- 설치 후 Tailscale 클라이언트를 실행하고, 1단계에서 생성한 동일한 Tailscale 계정으로 로그인한다.
- Tailscale IP 주소 확인 및 접속:
- Tailscale 클라이언트(또는 웹 관리 콘솔의 Machines 탭)에서 라즈베리파이의 Tailscale IP 주소 (보통
100.x.x.x
형태)를 확인한다. - 이제 이 Tailscale IP 주소를 사용하여 SSH 또는 RDP 클라이언트에서 라즈베리파이로 접속한다.
- SSH 예시:
ssh <라즈베리파이_사용자명>@<라즈베리파이_Tailscale_IP>
- RDP 예시: RDP 클라이언트에서 연결 주소에
<라즈베리파이_Tailscale_IP>
입력
- SSH 예시:
- Tailscale 클라이언트(또는 웹 관리 콘솔의 Machines 탭)에서 라즈베리파이의 Tailscale IP 주소 (보통
- (중요) 방화벽 설정 및 외부 접근 차단:
- Tailscale을 통해 안전하게 접속할 수 있게 되었으므로, 기존에 열어두었을 수 있는 SSH/RDP 포트(22, 3389)에 대한 외부 인터넷에서의 직접 접근을 차단해야 보안이 강화된다.
- Ubuntu의 기본 방화벽인
ufw
를 사용한다면 아래 코드 블럭을 참고한다. - 공유기(라우터) 설정: 공유기에서 설정했던 SSH/RDP 포트 포워딩 규칙이 있다면 반드시 삭제한다.
# ufw 활성화 (이미 활성화되어 있다면 생략) sudo ufw enable # Tailscale 네트워크에서의 모든 접속 허용 (가장 간단한 방법) # 또는 특정 포트만 허용하려면 아래 규칙 대신 ssh/rdp 규칙 사용 sudo ufw allow in on tailscale0 # 만약 특정 포트만 허용하고 싶다면 (예: SSH, RDP) # sudo ufw allow from <Tailscale_네트워크_대역>/<CIDR> to any port 22 proto tcp # sudo ufw allow from <Tailscale_네트워크_대역>/<CIDR> to any port 3389 proto tcp # (Tailscale 네트워크 대역은 웹 관리 콘솔 등에서 확인 가능하나, 위 'allow in on tailscale0'가 더 간편) # 외부 인터넷에서의 SSH/RDP 접근 차단 (기존 허용 규칙 삭제 또는 deny 규칙 추가) # 예시: 모든 외부 IP에서의 SSH 접근 차단 sudo ufw deny 22/tcp sudo ufw deny 3389/tcp # 만약 이전에 'sudo ufw allow 22' 등으로 열었다면 해당 규칙 삭제 필요 # sudo ufw delete allow 22/tcp # sudo ufw delete allow 3389/tcp # 설정 확인 sudo ufw status verbose
방법 2: WireGuard 설정하기 (PiVPN 스크립트 활용)
PiVPN은 라즈베리파이에서 OpenVPN 또는 WireGuard 서버를 쉽게 설치하고 관리할 수 있도록 도와주는 스크립트이다. 직접 설정하는 것보다 훨씬 간편하다.
- (사전 준비) 공유기 포트 포워딩:
- WireGuard는 클라이언트가 서버에 접속하기 위해 특정 UDP 포트를 사용한다. 기본값은
51820
UDP 포트이다. - 집에서 사용하는 공유기(라우터)의 설정 페이지에 접속하여, 외부에서 들어오는 UDP 51820번 포트 트래픽을 라즈베리파이의 내부 IP 주소로 전달하도록 포트 포워딩 규칙을 설정해야 한다. (라즈베리파이의 내부 IP는
ip addr
명령어로 확인 가능하며, 고정 IP로 설정하는 것이 좋다). - 참고: 사용 중인 인터넷 회선이 CGNAT 환경이라면 포트 포워딩이 불가능할 수 있다. 이 경우 Tailscale 사용이 더 적합하다.
- WireGuard는 클라이언트가 서버에 접속하기 위해 특정 UDP 포트를 사용한다. 기본값은
- (사전 준비) DDNS 설정 (선택 사항):
- 집의 공인 IP 주소가 자주 변경된다면, 외부에서 항상 동일한 주소로 접속할 수 있도록 DDNS 서비스를 설정하는 것이 좋다. (예: DuckDNS, No-IP 등 무료 서비스 이용 가능) PiVPN 설치 과정에서 DDNS 설정을 돕는 옵션이 있다.
- PiVPN 설치 스크립트 다운로드 및 실행:
- 라즈베리파이 터미널에서 다음 명령어를 실행한다.
curl -L https://install.pivpn.io | bash
- 스크립트가 실행되면 설치 과정 안내가 표시된다.
- 라즈베리파이 터미널에서 다음 명령어를 실행한다.
- PiVPN 설정 진행:
- 설치 과정에서 여러 질문이 나온다.
- 사용자 선택: 라즈베리파이의 어떤 사용자로 PiVPN 설정을 관리할지 선택한다 (보통 기본 사용자).
- VPN 프로토콜 선택: WireGuard를 선택한다.
- WireGuard 포트: 기본값
51820
UDP를 사용하거나 원하는 포트 번호로 변경할 수 있다. (변경했다면 1단계 포트 포워딩 설정도 맞춰야 한다). - DNS Provider: 클라이언트가 VPN 접속 시 사용할 DNS 서버를 선택한다 (Google, Cloudflare 등 추천).
- Public IP or DNS: 현재 공인 IP 주소를 사용하거나, 2단계에서 설정한 DDNS 주소를 입력한다.
- 자동 보안 업데이트: 활성화하는 것을 권장한다.
- 설치가 완료되면 재부팅하라는 메시지가 나올 수 있다.
sudo reboot
명령어로 재부팅한다.
- 설치 과정에서 여러 질문이 나온다.
- 클라이언트 설정 파일 생성:
- VPN에 접속할 기기(PC, 스마트폰 등) 각각에 대한 설정 파일(.conf)을 생성해야 한다.
- 터미널에서 다음 명령어를 실행한다.
pivpn add
- 클라이언트의 이름(예:
myphone
,mylaptop
)을 입력하라는 메시지가 나오면 원하는 이름을 입력하고 Enter 키를 누른다. - 설정 파일은 라즈베리파이의
/home/<사용자명>/configs/
디렉토리에<클라이언트이름>.conf
파일로 생성된다.
- 클라이언트 설정 파일 전송 및 적용:
- 생성된
.conf
파일을 안전한 방법 (예: SCP, USB 메모리 등)으로 VPN에 접속할 클라이언트 기기로 전송한다. 이메일 등 안전하지 않은 방법으로 전송하지 않도록 주의한다. - 각 클라이언트 기기에 WireGuard 클라이언트 앱을 설치한다. (WireGuard 공식 홈페이지 Installation 페이지 참고)
- 설치된 WireGuard 클라이언트 앱에서 전송받은
.conf
파일을 가져오기(Import) 한다.
- 생성된
- VPN 연결 및 접속:
- 클라이언트 기기의 WireGuard 앱에서 가져온 터널 설정을 활성화(Activate/Connect)한다.
- VPN 연결이 성공하면, 이제 라즈베리파이의 내부 IP 주소 (공유기 네트워크 내의 IP 주소, 예:
192.168.x.x
)를 사용하여 SSH 또는 RDP로 접속할 수 있다. VPN을 통해 클라이언트 기기가 라즈베리파이와 동일한 가상 내부 네트워크에 연결된 것처럼 동작하기 때문이다.
- (중요) 방화벽 설정 및 외부 접근 차단:
- WireGuard VPN 접속을 허용하고, 외부 인터넷에서의 직접적인 SSH/RDP 접근은 차단해야 한다.
ufw
사용 시 아래 코드 블럭을 참고한다.- 공유기(라우터) 설정: 공유기에서 SSH/RDP 포트 포워딩 규칙은 반드시 삭제하고, WireGuard용 UDP 포트(예: 51820) 포워딩 규칙만 남겨둔다.
# ufw 활성화 (이미 활성화되어 있다면 생략) sudo ufw enable # WireGuard 포트 허용 (PiVPN 설치 시 설정한 UDP 포트) sudo ufw allow 51820/udp # 기본 포트 사용 시, 변경했다면 해당 포트 번호 입력 # 내부 네트워크 및 VPN 클라이언트에서의 SSH/RDP 접근 허용 (선택적 강화) # 예: 10.6.0.0/24가 WireGuard의 기본 가상 네트워크 대역일 경우 # sudo ufw allow from 10.6.0.0/24 to any port 22 proto tcp # sudo ufw allow from 10.6.0.0/24 to any port 3389 proto tcp # 또는 내부 로컬 네트워크 대역 추가 허용 (예: 192.168.0.0/24) # sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp # 모든 외부 인터넷에서의 SSH/RDP 접근 차단 sudo ufw deny 22/tcp sudo ufw deny 3389/tcp # 이전에 허용 규칙이 있었다면 삭제 # sudo ufw delete allow 22/tcp # sudo ufw delete allow 3389/tcp # 설정 확인 sudo ufw status verbose
정리
- 간편함과 자동 설정을 원한다면 Tailscale을 강력히 추천한다. 별도의 포트 포워딩이나 DDNS 설정 없이 대부분의 환경에서 잘 동작한다.
- 네트워크 설정에 익숙하고 직접 서버를 완벽하게 제어하고 싶다면 WireGuard (PiVPN 사용 추천)가 좋은 선택이다. 뛰어난 성능을 제공하지만, 약간의 추가 설정(포트 포워딩 등)이 필요하다.
어떤 방법을 선택하든, VPN 설정 후에는 반드시 방화벽 설정을 확인하고 외부 인터넷에서의 직접적인 SSH/RDP 접근을 차단하여 VPN을 사용하는 목적을 달성하는 것이 중요하다.
WireGuard 설정
나는 네트워크 설정에 익숙했고, 외부 업체가 VPN을 관리하는 게 조금 꺼려져서 WireGuard를 선택했다. 위에서 기술했던 것처럼, PiVPN을 활용하니 WireGuard가 금방 설정이 되었다. VPN 서버 설정 이후엔 내가 주로 사용하는 IT 기기 4개에 각각 `.conf`파일을 생성하여, VPN에 접속하게 하였다.
WireGuard 설정 절차는 아래와 같다.
1. 클라이언트별
.conf
파일 생성:- Gram 노트북, Windows Desktop, Mac Mini, iPad 각각의 기기에서 라즈베리파이 VPN 서버에 접속하려면, 각 기기마다 고유한 설정 파일(
.conf
)이 필요하다. - WireGuard는 각 연결을 고유한 암호화 키 쌍(공개키/개인키)으로 식별하고 인증한다. 따라서
pivpn add
명령어를 사용하여 총 4번 실행하고, 각 기기를 식별할 수 있는 이름(예:gram-notebook
,win-desktop
,mac-mini
,my-ipad
)을 지정하여 4개의 개별.conf
파일을 생성해야 한다. - 생성된 각
.conf
파일은 해당 기기(노트북, 데스크탑, 맥미니, 아이패드)에만 안전하게 전송하여 설치해야 한다.
2. 기존 SSH/RDP 공유기 포트 포워딩 설정 처리:
- VPN 환경 구축 후 보안을 강화하려면, 기존에 설정해 둔 SSH(TCP 22번) 및 RDP(TCP 3389번)에 대한 공유기(라우터)의 포트 포워딩 설정은 반드시 삭제하거나 비활성화해야 한다.
ufw
방화벽에서deny
하는 것만으로는 부족하다. 공유기에서 포트 포워딩 규칙이 살아있으면, 외부 인터넷에서 해당 포트로 들어오는 트래픽이 라즈베리파이까지 도달하게 되어 VPN을 사용하는 의미가 퇴색되고 보안 위협에 계속 노출된다.- VPN 설정 후 공유기에는 오직 WireGuard가 사용하는 UDP 포트(기본값 51820)에 대한 포트 포워딩 규칙만 남겨두어야 한다. 다른 모든 포트 포워딩 규칙(특히 SSH, RDP)은 제거하는 것이 VPN을 통한 보안 접속의 핵심이다.
VPN이 왜 보안에 좋을까?
여기까지 절차를 진행하다 문득 내 머릿 속에서 VPN이 왜 보안에 좋은지, 원리는 무엇인지 제대로 정리가 안 되어 있다는 생각이 들어서 내용을 정리해봤다. VPN(Virtual Private Network, 가상 사설망)의 작동 원리와 이점을 최대한 쉽게 설명하면 다음과 같다.
- VPN의 기본 원리: 암호화된 터널 생성
- VPN은 인터넷이라는 공용 네트워크 위에 암호화된 가상의 터널을 만드는 기술이다.
- 비유: 고속도로(인터넷) 위에 나만 사용할 수 있는 비밀 통로(VPN 터널)를 만드는 것과 같다. 이 통로 안으로 들어가는 모든 차량(데이터)은 외부에서 볼 수 없도록 특수하게 포장(암호화)된다.
- 클라이언트 기기(노트북, 스마트폰 등)에서 VPN 서버(라즈베리파이)에 접속하면, 이 두 기기 사이에 안전한 암호화 터널이 생성된다.
- VPN을 사용하면 SSH/RDP 포트 포워딩 없이 접속 가능한 이유:
- 터널 연결: 클라이언트 기기는 먼저 공유기에 포트 포워딩된 WireGuard UDP 포트(예: 51820)를 통해 라즈베리파이의 VPN 서버에 접속하여 VPN 터널 자체를 개통한다.
- 가상 네트워크 참여: 일단 VPN 터널이 연결되면, 클라이언트 기기는 라즈베리파이가 속한 내부 네트워크(또는 VPN이 생성한 가상 네트워크 대역, 예: 10.6.0.x)에 마치 직접 연결된 것처럼 취급된다. 클라이언트 기기는 VPN 서버로부터 가상 IP 주소를 할당받는다.
- 내부 통신: 이제 클라이언트 기기는 이 안전한 VPN 터널 내부를 통해 라즈베리파이의 내부 IP 주소(예: 192.168.x.x) 또는 WireGuard 가상 IP 주소(예: 10.6.0.1)로 직접 SSH나 RDP 접속을 시도한다. 이 통신은 이미 개통된 VPN 터널 안에서 이루어지므로, 외부 인터넷에서 라즈베리파이의 SSH(22번)나 RDP(3389번) 포트로 직접 들어가는 것이 아니다.
- 결론: 공유기는 단지 VPN 터널을 만들기 위한 WireGuard 포트(UDP 51820)만 열어주면 되고, 일단 터널이 생기면 그 안에서 이루어지는 SSH/RDP 통신은 공유기의 추가적인 포트 포워딩 설정 없이도 라즈베리파이에 도달할 수 있다.
- VPN이 보안에 뛰어난 이유:
- 공격 표면 최소화 (Reduced Attack Surface): 기존에는 SSH, RDP 등 여러 포트를 외부에 노출해야 했지만, VPN을 사용하면 오직 하나의 VPN 포트(예: UDP 51820)만 노출하면 된다. 공격자가 침투를 시도할 수 있는 "문"의 개수가 크게 줄어든다.
- 모든 트래픽 암호화 (Encryption): VPN 터널을 통과하는 모든 데이터(SSH 접속 정보, RDP 화면 데이터, 파일 전송 등)는 강력하게 암호화된다. 따라서 중간에 데이터를 가로채더라도(예: 카페의 공용 Wi-Fi 사용 시) 내용을 해독할 수 없어 안전하다.
- 강력한 인증 (Strong Authentication): WireGuard는 최신 암호화 기술(공개키/개인키)을 사용하여 접속하려는 클라이언트가 정말 허가된 기기인지 엄격하게 인증한다. 단순히 ID/비밀번호 방식보다 훨씬 안전하며, 무작위 대입 공격(Brute-force attack) 등을 효과적으로 방어할 수 있다. 허가되지 않은 기기는 VPN 터널 자체를 만들 수 없다.
- 내부망 분리 효과: VPN을 통해 접속한 클라이언트는 마치 내부망에 있는 것처럼 동작하지만, 실제로는 VPN 서버(라즈베리파이)가 통신을 중개한다. 방화벽(ufw) 설정을 통해 VPN을 통해 들어오는 접속이라도 특정 서비스(SSH, RDP 등)만 허용하고 나머지는 차단하는 등 세밀한 접근 제어가 가능하다.
정리하면, VPN은 인터넷상에 암호화된 비밀 통로를 만들어, 이 통로를 통해서만 라즈베리파이에 접속하도록 하는 방식이다. 이 때문에 여러 개의 서비스 포트를 외부에 직접 노출할 필요 없이, 오직 VPN 연결을 위한 포트 하나만 관리하면 되고, 모든 통신은 암호화되어 안전하게 보호된다. 따라서 공유기의 SSH/RDP 포트 포워딩은 삭제하고 WireGuard 포트 포워딩만 남겨두는 것이 올바른 설정이다.
728x90WireGuard는 왜 UDP를 사용하는가?
설정을 하다보면 WireGuard의 ufw 설정이 udp로 표기 되어 있는 것을 알 수 있다. 왜 UDP일지, 연결에 패킷 손실이 발생해도 괜찮은지 궁금해져서 찾아보았다.
WireGuard가 신뢰성 있는 TCP 대신 UDP를 사용하는 데에는 명확하고 중요한 이유가 있었다. 이는 성능과 효율성을 극대화하기 위한 의도적인 설계 결정이다.
1. "TCP over TCP" 문제 회피:
- 가장 큰 이유는 "TCP over TCP" 문제를 피하기 위해서이다.
- VPN 터널을 통해 전송되는 데이터(예: SSH, RDP, 웹 브라우징 트래픽)는 이미 TCP를 사용하는 경우가 많다. TCP는 데이터 전송의 신뢰성(패킷 도착 보장, 순서 보장)을 위해 자체적으로 확인 응답(ACK), 재전송 타이머 등의 메커니즘을 가지고 있다.
- 만약 VPN 터널 자체도 TCP를 사용하여 이 내부 TCP 트래픽을 감싸게 되면(TCP over TCP), 문제가 발생한다.
- 성능 저하: 내부 TCP 세션에서 패킷 손실이 발생하면, 내부 TCP는 재전송을 시도한다. 그런데 외부 VPN 터널의 TCP 역시 해당 패킷 손실을 감지하고 자체적으로 재전송을 시도할 수 있다. 이 과정에서 불필요한 재전송이 중첩되고, 각 계층의 타임아웃이 겹치면서 응답 속도가 급격히 느려지고(latency 증가) 전체적인 처리량(throughput)이 감소하는 "TCP Meltdown" 현상이 발생할 수 있다. 특히 무선이나 불안정한 네트워크 환경에서 이 문제는 더욱 심각해진다.
- UDP는 이러한 자체적인 복잡한 신뢰성 보장 메커니즘이 없다. 따라서 WireGuard가 UDP를 사용하면, 터널 내부의 프로토콜(TCP 등)이 자체적으로 신뢰성 제어를 온전히 담당하게 하여 위와 같은 성능 저하 문제를 원천적으로 방지한다.
2. 성능과 효율성:
- UDP는 TCP에 비해 헤더(header)가 훨씬 작고 단순하다. 연결 설정 과정(3-way handshake)이나 복잡한 상태 관리가 필요 없다.
- 이는 다음과 같은 장점을 가진다.
- 낮은 지연 시간(Low Latency): 데이터 전송에 필요한 부가적인 처리(overhead)가 적어 더 빠르게 데이터를 보낼 수 있다. 실시간 통신이나 빠른 반응 속도가 중요한 RDP, 게임 등에 유리하다.
- 높은 처리량(Higher Throughput): 프로토콜 자체의 부담이 적어 동일한 네트워크 환경에서 더 많은 데이터를 전송할 수 있는 잠재력을 가진다.
- 가벼움: 라즈베리파이와 같은 저사양 임베디드 기기에서도 CPU 및 메모리 자원을 덜 소모하여 효율적으로 동작할 수 있다.
3. 단순성:
- WireGuard는 설계 철학 자체가 단순함과 보안성에 중점을 둔다. UDP를 사용함으로써 프로토콜 자체의 복잡성을 크게 줄일 수 있었고, 이는 코드 검증 및 보안 감사에도 유리하게 작용했다.
UDP는 '비신뢰성'인데 괜찮은가?
- UDP 자체는 패킷 전송 순서나 도착을 보장하지 않지만, WireGuard는 UDP를 단순히 데이터그램을 보내는 전송 수단으로만 활용한다.
- WireGuard 프로토콜 수준에서 암호화, 인증, 세션 관리, 키 교환 등을 통해 연결의 보안성과 무결성을 보장한다. 즉, 데이터 내용의 신뢰성(순서, 도착 보장)은 터널 내부의 프로토콜(예: TCP)에 맡기되, 터널 자체의 보안과 안정성은 WireGuard가 책임지는 구조이다.
- 만약 터널 내부를 흐르는 데이터가 UDP 기반의 서비스(예: 일부 게임, VoIP)라면, 애초에 약간의 패킷 손실을 감수하고 실시간성을 우선하는 서비스이므로, VPN 터널까지 TCP를 사용해 지연 시간을 늘릴 필요가 없다.
결론적으로, WireGuard가 UDP를 선택한 것은 TCP의 신뢰성이 불필요해서가 아니라, "TCP over TCP" 문제를 피하고 VPN 터널 자체의 성능(속도, 효율성)을 극대화하여 현대 네트워크 환경에 더 적합한 VPN 프로토콜을 만들기 위한 현명한 설계적 판단이다.
네트워크에 표기되는 wg0는 무엇인가?
WireGuard 설정 후 원격 데스크톱을 통해 이리저리 살펴보던 중, 네트워크가 `wg0`라고 표기된 것을 볼 수 있었다. 역시나 호기심 대마왕인지라 궁금증이 또 도져 이건 어떤 의미인지 찾아보게 되었다.
wg0
는 WireGuard VPN 연결을 위해 생성된 가상 네트워크 인터페이스(Virtual Network Interface)의 이름이다.네트워크 인터페이스는 운영체제가 네트워크와 통신하기 위해 사용하는 소프트웨어적인 통로 또는 하드웨어 장치를 가리킨다. 예를 들면 다음과 같다.
eth0
: 첫 번째 이더넷(유선랜) 카드wlan0
: 첫 번째 무선랜(Wi-Fi) 카드lo
: 루프백(Loopback) 인터페이스 (자기 자신과 통신하기 위한 가상 인터페이스)
마찬가지로, WireGuard가 VPN 터널을 생성하면, 운영체제는 이 터널을 통해 데이터를 주고받을 수 있도록 새로운 네트워크 인터페이스를 만든다. 이때 관례적으로 사용되는 이름 규칙이
wg
+ 숫자 이다.wg
: WireGuard 인터페이스임을 나타내는 접두사이다.0
: 해당 시스템에서 생성된 첫 번째(0번부터 시작) WireGuard 인터페이스임을 나타내는 인덱스 번호이다. 만약 여러 개의 독립적인 WireGuard 터널을 동시에 설정한다면wg1
,wg2
와 같이 숫자가 증가하는 인터페이스가 생성될 수 있다.
wg0
인터페이스의 역할:- VPN 터널의 끝점: 운영체제 입장에서 볼 때,
wg0
는 암호화된 VPN 터널의 한쪽 끝을 나타낸다. - IP 주소 할당: WireGuard 설정에 따라 이
wg0
인터페이스에는 VPN 내부 네트워크에서 사용될 IP 주소(예: PiVPN 기본 설정의 경우 서버는10.6.0.1
)가 할당된다. - 트래픽 라우팅: 운영체제는 특정 목적지(예: VPN 클라이언트의 가상 IP)로 향하는 트래픽을 이
wg0
인터페이스를 통해 내보내도록 라우팅 테이블을 설정한다.wg0
으로 보내진 트래픽은 WireGuard에 의해 암호화되어 실제 물리적 인터페이스(eth0
또는wlan0
등)를 통해 상대방 피어(Peer)에게 전송된다. - 암호화/복호화 지점: 외부 피어로부터 WireGuard 포트(UDP)를 통해 들어온 암호화된 패킷은 WireGuard에 의해 복호화된 후,
wg0
인터페이스를 통해 들어오는 트래픽으로 운영체제에 전달된다. - 방화벽 규칙 적용 대상:
ufw
와 같은 방화벽 설정을 할 때,wg0
인터페이스를 명시하여 VPN 터널을 통해 들어오거나 나가는 트래픽에 대한 규칙을 구체적으로 적용할 수 있다. (예:sudo ufw allow in on wg0 ...
)
요약하자면,
wg0
는 WireGuard VPN 연결이 운영체제 내에서 식별되고 관리될 수 있도록 WireGuard 소프트웨어가 생성한 가상의 네트워크 통로 이름이라고 생각하면 된다.Trouble Shooting
WireGuard 설정 중 아주 귀찮은 일이 하나 있어 같이 정리해본다. 공유기 포트포워딩과 라즈베리파이5 Ubuntu의 ufw 설정에서 22번과 3389번을 삭제해야 하는데, 실수로 `sudo ufw deny <포트번호>`를 해버렸고, 냥냥하게 `exit`까지 입력해버렸었다. 내가 무슨 짓을 한 건지 알게 된 건 그리 오래 걸리지 않았다.
sudo ufw deny <포트번호>
또는sudo ufw deny <포트번호>/<프로토콜>
과 같이 출처(source) IP 주소나 인터페이스를 특정하지 않고 단순히 포트만 지정하여 deny 규칙을 추가하면, 기본적으로 외부 IP, 내부 IP, VPN IP 등 모든 출처에서 해당 포트로 들어오는 트래픽(Incoming)을 차단하게 된다.- WireGuard 설정 중 보안을 강화하기 위해 SSH(22번 포트)와 원격 데스크톱(기본 원격 데스크톱은 RDP(3389번) 포트에 대해
sudo ufw deny 22/tcp
또는sudo ufw deny 3389/tcp
와 같은 명령어를 실행했다. - 이러한 포괄적인
deny
규칙은 특정allow
규칙으로 허용되지 않는 한, 모든 소스 IP 주소(내부 IP 대역 포함)에서의 접속 시도를 막는다. - 따라서 내부 네트워크(예: 동일한 공유기 아래의 다른 PC)에서 라즈베리파이의 내부 IP 주소로 접속하거나, WireGuard VPN을 통해 접속하는 경우에도 해당 포트가 차단되어 SSH와 원격 데스크톱이 작동하지 않게 된 것이다.
해결 방법:
접근을 허용해야 하는 특정 네트워크 대역(내부 IP, WireGuard VPN IP)에 대해서 명시적으로
allow
규칙을 추가해야 한다.- 현재 방화벽 규칙 확인:
- 먼저 현재 설정된 규칙 목록을 번호와 함께 확인한다. (SSH 접속이 불가능하면 라즈베리파이에 직접 모니터와 키보드를 연결해야 할 수 있다.)
sudo ufw status numbered
- 출력된 목록에서
DENY IN
으로 되어 있는 22번, 3389번 (또는 사용하는 원격 데스크톱 포트) 규칙을 확인한다.
- 필요한
allow
규칙 추가:- 내부 네트워크 대역에서의 접속 허용: (자신의 내부 네트워크 대역으로 변경해야 한다. 보통
192.168.0.0/24
,192.168.1.0/24
등이다.)# 예시: 192.168.1.x 대역에서 SSH(22) 및 RDP(3389) 허용 sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp sudo ufw allow from 192.168.1.0/24 to any port 3389 proto tcp
- WireGuard VPN 네트워크에서의 접속 허용: (PiVPN 기본 설정은
10.6.0.0/24
이지만, 다를 수 있으니 확인 필요)# 예시: WireGuard 인터페이스(wg0)를 통해 들어오는 SSH(22) 및 RDP(3389) 허용 sudo ufw allow in on wg0 to any port 22 proto tcp sudo ufw allow in on wg0 to any port 3389 proto tcp # 또는 wg0 인터페이스로 들어오는 모든 트래픽을 허용하려면 (덜 안전할 수 있음) # sudo ufw allow in on wg0
- 내부 네트워크 대역에서의 접속 허용: (자신의 내부 네트워크 대역으로 변경해야 한다. 보통
- (선택) 불필요한
deny
규칙 삭제:- 위와 같이 특정
allow
규칙을 추가했다면, 처음에 추가했던 포괄적인deny
규칙은 삭제해도 된다. (규칙 번호는sudo ufw status numbered
로 확인)# 예시: DENY IN 22/tcp 규칙 삭제 (번호가 5번이라고 가정) sudo ufw delete 5 # 또는 sudo ufw delete deny 22/tcp sudo ufw delete deny 3389/tcp
- 단, ufw의 기본 정책(policy)이
deny incoming
이라면, 명시적인deny
규칙 없이도 허용되지 않은 모든 접속은 차단되므로, 위allow
규칙만 정확히 추가하는 것이 더 일반적이다.
- 위와 같이 특정
- 변경 사항 적용 및 확인:
- 규칙 추가/삭제 후 상태를 다시 확인한다.
sudo ufw status verbose
- 이제 내부 네트워크와 VPN을 통해 SSH 및 원격 데스크톱 접속이 가능한지 확인한다.
- 규칙 추가/삭제 후 상태를 다시 확인한다.
방화벽 규칙을 잘못 설정하면 시스템에 접근하지 못하게 될 수 있으므로, 규칙 추가/삭제 시 신중해야 한다. 특히 원격으로 작업 중일 때는 더욱 주의가 필요하다. 그래서 결국 모니터, 마우스, 키보드까지 다시 다~ 부착하여 ufw 설정을 다시 잡았다.
라즈베리파이 ufw 때문에 주섬주섬 장비를 챙기는 나의 모습 원격 환경에선 정말 조심하자 ㅠㅠ
마치며
여기까지가 내 라즈베리파이5의 WireGuard 설정 내용이었다. 보안상의 이유로 언급하진 않았지만 서브 도메인에 Private IP를 A 레코드로 설정하여 보다 쉽게 VPN 접속을 할 수 있게끔 해두었고, 의미가 있을지 모르겠지만 WireGuard의 UDP 포트도 포트포워딩을 통해 다른 포트를 사용하게끔 했다.
알고보면 어렵지 않은데 이래저래 시행 착오가 많아서 어렵게 느껴졌던 것 같다. 이 글을 보시는 분들은 겁먹지 말고 VPN 설정을 무사히 잘 마치시길 바라며 글을 마친다.
728x90'프로그래밍' 카테고리의 다른 글
리눅스 한 학기 살기 - 5주차 (1) 2025.04.13 게임 산업의 주요 운영 체제 (1) 2025.04.13 게임·VR·게이미피케이션 분야의 애자일 도입 사례 (0) 2025.04.02 리눅스 한 학기 살기 - 3주차 (0) 2025.04.01 Unity Engine의 C#과 Unreal Engine의 C++ 비교 (0) 2025.03.31 다음글이 없습니다.이전글이 없습니다.댓글 - Tailscale (테일스케일)