- [리눅스 한 학기 살기 #4] 라즈베리파이 VPN 구축: Tailscale vs WireGuard(PiVPN) 비교와 ufw 삽질기2025년 04월 09일 16시 30분 10초에 업로드 된 글입니다.작성자: kugorang
TL;DR — 3줄 핵심 요약
• 문제: 집 안의 라즈베리파이에 밖에서 접속하려고 SSH(22)·RDP(3389) 포트를 공유기에 열어 두면, 전 세계의 자동 스캔 프로그램이 그 포트를 계속 두드린다.
• 기술/원인: VPN은 두 기기 사이에 암호화된 가상 인터페이스(wg0, tailscale0)를 만들고, 그 인터페이스를 지나는 패킷만 암호화해 상대에게 보낸다. 그래서 바깥에는 VPN 포트 하나만 열려 있으면 되고, SSH·RDP는 터널 안쪽 주소로만 접근한다.
• 해결/인사이트: 포트포워딩은 VPN 포트만 남기고 삭제한다. ufw는 기본 정책을 deny incoming으로 두고 VPN 인터페이스에서 들어오는 트래픽만 허용한다. 원격 작업 중 ufw를 잘못 만지면 접속이 끊기므로 콘솔 접근 수단을 먼저 확보한다.
두 가지 선택지

라즈베리파이에 VPN이 함께하면 무엇도 두렵지 않아! - Tailscale: 기기마다 클라이언트를 설치하고 같은 계정으로 로그인하면 메쉬 네트워크가 만들어진다. NAT 뒤에 있어도 연결되므로 포트포워딩과 DDNS가 필요 없다. 제어 서버는 Tailscale이 운영하고 실제 데이터는 기기 간 암호화 통신이다. 개인 용도는 무료 범위로 충분하다.
- WireGuard(PiVPN): 서버를 직접 운영한다. 공유기에서 UDP 포트를 열고, 공인 IP가 바뀌면 DDNS를 붙여야 한다. 대신 모든 통제가 자기 손에 있고, 프로토콜이 가볍다.
Tailscale 설치
curl -fsSL https://tailscale.com/install.sh | sh sudo systemctl enable --now tailscaled sudo tailscale up # 표시되는 URL로 접속해 기기 인증 tailscale ip -4 # 100.x.x.x 주소 확인다른 기기에도 같은 계정으로 로그인하면 100.x.x.x 주소로 서로 접근한다. ssh 사용자@100.x.x.x 형태로 바로 붙는다.
WireGuard 설치(PiVPN)
curl -L https://install.pivpn.io | bash # 프로토콜: WireGuard, 포트: 51820/UDP, DNS: 원하는 서버, 공인 IP 또는 DDNS 입력 pivpn add # 클라이언트별 .conf 생성 pivpn -c # 접속 중인 클라이언트 확인- 공유기에서 UDP 51820을 라즈베리파이 내부 IP로 포워딩한다.
- 공인 IP가 유동이면 DuckDNS 같은 DDNS를 등록한다.
- CGNAT 회선이면 포트포워딩이 불가능하므로 Tailscale이 낫다.
- 클라이언트마다 키 쌍이 다르므로 .conf 파일을 기기별로 만든다(노트북, 데스크톱, 맥미니, 태블릿 등).
왜 VPN이면 SSH 포트를 열지 않아도 되나
- 클라이언트가 서버의 VPN 포트(UDP 51820)로 접속해 터널을 연다.
- 서버가 클라이언트에 가상 IP(예: 10.6.0.2)를 준다.
- 클라이언트는 그 터널 안에서 서버의 내부 IP(192.168.x.x)나 가상 IP(10.6.0.1)로 SSH·RDP를 보낸다.
- 공유기는 VPN 포트만 전달하면 되고, SSH·RDP 패킷은 터널 안에서 암호화된 채로 오간다.
결과적으로 바깥에 노출되는 문이 하나로 줄고, 그 문은 키가 맞아야 열린다. 공격 표면이 줄고, 통신 전체가 암호화되며, 기기 단위 인증이 된다.
WireGuard가 UDP를 쓰는 이유
- TCP over TCP 문제: VPN 터널이 TCP이고 그 안의 트래픽도 TCP면, 양쪽이 각자 재전송을 시도해 지연이 급격히 늘어난다(TCP meltdown).
- 오버헤드: UDP는 헤더가 작고 연결 수립 절차가 없다. 지연이 낮고 처리량이 높다.
- 단순성: 구현이 짧아 검증하기 쉽다. 신뢰성은 터널 안의 프로토콜이 담당한다.
wg0는 무엇인가
wg0는 WireGuard가 만든 가상 네트워크 인터페이스다. eth0(유선), wlan0(무선)처럼 커널이 다루는 통로이고, 여기에 VPN 내부 IP가 붙는다. 이 인터페이스로 나가는 패킷은 암호화되어 실제 랜카드로 전송된다. ufw에서 "allow in on wg0"처럼 인터페이스 단위로 규칙을 걸 수 있다.
ufw에서 실제로 겪은 실수
sudo ufw deny 22/tcp # 이렇게 하면 VPN에서 들어오는 접속까지 막힌다출발지를 지정하지 않은 deny는 모든 출처를 막는다. 그래서 VPN으로 접속해도 22번이 막혀 원격 작업이 끊긴다. 해결은 허용 규칙을 명시하는 것이다.
sudo ufw default deny incoming sudo ufw allow 51820/udp # WireGuard sudo ufw allow in on wg0 # VPN 인터페이스 전체 허용 # 또는 포트만 골라서 sudo ufw allow in on wg0 to any port 22 proto tcp sudo ufw allow in on wg0 to any port 3389 proto tcp sudo ufw status numbered sudo ufw delete 잘못된번호원격에서 방화벽을 바꾸기 전에는 콘솔 접근(모니터·키보드) 수단을 확보하거나, 규칙을 먼저 넣고 확인한 뒤 기존 규칙을 지우는 순서를 지킨다.
자주 묻는 질문 (FAQ)
Q1. Tailscale과 WireGuard 중 무엇을 먼저 시도해야 하나요?
A. 네트워크 설정이 처음이라면 Tailscale이다. 포트포워딩과 DDNS 없이 계정 로그인만으로 연결된다. 직접 서버를 운영하고 제어권을 갖고 싶거나 CGNAT이 아니라면 WireGuard를 쓰면 되고, PiVPN 스크립트로 대부분 자동 설정된다.
Q2. VPN을 켜면 인터넷이 느려지나요?
A. 터널을 통과하는 트래픽에 암호화 비용이 붙지만 WireGuard는 가볍다. 다만 전체 트래픽을 터널로 보내는 설정(0.0.0.0/0 라우팅)이면 집 인터넷 회선 속도가 상한이 된다. 필요한 내부 대역만 터널로 보내면 체감 차이가 거의 없다.
Q3. VPN 포트 51820도 열어 두는데 안전한가요?
A. 키가 맞아야 응답하므로 스캔에는 거의 응답하지 않는다. 다만 포트 번호를 바꾸면 무작위 스캔에 걸릴 확률이 줄고, 실패한 인증 시도를 로그로 확인하는 습관이 도움이 된다.
728x90728x90'프로그래밍' 카테고리의 다른 글
[리눅스 한 학기 살기 #5] 라즈베리파이5(ARM64) Ubuntu 24.04에 Docker Engine 공식 저장소로 설치하기 (1) 2025.04.13 게임 산업의 주요 운영 체제 (1) 2025.04.13 게임·VR·게이미피케이션 분야의 애자일 도입 사례 (0) 2025.04.02 [리눅스 한 학기 살기 #3] Ubuntu 24.04 원격 데스크톱: xrdp 대신 grdctl로 RDP 접속 붙이기 (0) 2025.04.01 Unity Engine의 C#과 Unreal Engine의 C++ 비교 (0) 2025.03.31 다음글이 없습니다.이전글이 없습니다.댓글