이 글인 이중 NAT 환경에서 포트포워딩 없이 터널링을 이용하여 외부에서 라즈베리파이에 SSH로 접속하는 방법에 대해 정리한 글입니다.
개발 환경
기기 정보
모델 : Raspberry Pi Zero W
OS : Raspberry Pi OS Lite (32 bit)
라즈베리파이 제로 W 모델은 구형 모델이라 아키텍처 상으로 Ubuntu Server를 지원하지 않고, 64 bit 라즈베리파이 운영체제도 지원하지 않는다. 학습용 웹 서버로 가지고 놀아볼 생각이라, 가장 가벼운 OS인 Raspberry Pi OS Lite(32 bit)를 설치하였다.
(Raspberry Pi OS는 기본적으로 Debian Linux 기반이기에 Ubuntu랑 명령어가 동일해서 학습하기엔 적당하다는 판단이었다.)
Pain Point : 이중 NAT 구조와 관리 권한의 부재

현재 우리 집의 네트워크 구조는 외부망 - 통신사 라우터(공유기1) - 사설 라우터(공유기2)로 이어지는 이중 NAT(Double NAT) 구조다. 이런 환경에서 외부 접속을 하러면 두 공유기 모두 포트포워딩 설정을 해줘야 한다.
하지만 통신사 공유기의 관리자 페이지 비밀번호를 모른다는 점, 그리고 물리적 위치 또한 알 수 없는 상태라는 것이다. (예상가는 위치는 있지만 현재 가구 배치 상 열어볼 수가 없기에 사실 상 모르는 것과 같다...) 이는 인프라를 구축하는데 있어서 가장 기본인 포트포워딩이 불가능하다는 것을 의미했다.
방법이 없을까 조사하던 중에, 내부에서 외부로 먼저 통로를 열어주는 터널링(Tunneling) 기법을 발견했다. Cloudflare Tunnel이나 Tailscale이 사용하는 이 방식은 복잡한 네트워크 설정 없이도 안전한 연결을 보장한다.
이번 글에서는 Tailscale을 이용해 이중 NAT 환경에서도 라즈베리파이에 SSH로 원격 접속할 수 있는 인프라 구축 과정을 정리해 보고자 한다.
왜 Tailscale 인가?
내가 놓여있는 상황에서는 포트포워딩을 통한 원격 접속은 사실 상 불가능했기 때문에, 이를 우회하는 방법으로 터널링을 선택하였다. 터널링은 Tailscale 뿐만 아니라 Cloudflare Tunnel, ngrok 등이 있고, 이러한 터널링 도구들은 NAT Traversal이라는 핵심 기능을 제공한다.
- 일반적인 포트포워딩은 외부에서 내부로 들어오는 인바운드(Inbound) 방식이지만, 반대로 NAT Traversal은 내부에서 외부로 먼저 연결을 시도하는 아웃바운드(Outbound) 방식을 사용
- 안에서 밖으로 나가는 연결은 대부분 방화벽에서 허용한다는 점을 이용하여 포트포워딩 없이도 외부에 연결이 가능
Tailscale은 다른 터널링 도구들과 비교했을 때, 가상 고정 IP 제공 (MagicDNS), WireGuard 기반의 경량화, 그리고 P2P Mesh Network라는 특징을 가지고 있다.
- 가상 고정 IP 제공 (MagicDNS) : 일반적인 웹 터널링은 특정 포트를 URL 주소로 연결해 주지만, Tailscale은 기기 자체에 100.x.x.x 대역의 전용 IP를 부여해 웹 뿐만 아니라 SSH, VNC 등 모든 연결을 하나의 IP로 관리가 가능
- WireGuard 기반의 경량화 : 저사양 기기에서는 리소스 관리가 핵심인데, Tailscale은 WireGuard를 사용하여 CPU와 메모리 점유율이 낮음
- P2P Mesh Network : 서버를 거치는 일반적인 터널링과 달리, Tailscale은 기기 간 직접 연결(P2P)을 시도하여 속도가 매우 빠르고 지연 시간이 적음
이러한 이유로 다양한 터널링 도구들 중에서 Tailscale을 선택하여 진행하였다.
Tailscale을 이용한 라즈베리파이 원격 접속 환경 구축
실제로 이제 라즈베리파이에 터널을 뚫어 원격으로 접속할 수 있는 환경을 만들어보자.
가장 먼저 라즈베리파이에 Tailscale 엔진을 설치한다. SSH(로컬) 혹은 직접 터미널에 아래 명령어를 입력해 설치한다.
curl -fsSL https://tailscale.com/install.sh | sh

설치가 완료되면, 서비스를 시작하고 나의 계정과 기기를 동기화해야 한다.
sudo tailscale up
명령어를 입력하면, 화면에 인증 주소(https://login.tailscale.com/a/xxxx의 형태)가 나타난다. 이 주소를 복사해 메인 PC 브라우저에 입력하여 로그인을 완료한다.

로그인이 성공하면 터미널에 Success. 라는 문구가 뜬다.

이후 이제 접속하고자 하는 PC 혹은 다른 디바이스에 Tailscale을 설치한다. 공식 홈페이지에서 설치 파일을 받아서 실치를 진행할 수 있다.
https://tailscale.com/download/windows
Download | Tailscale
Tailscale is the zero configuration VPN that doesn't go through the public internet.
tailscale.com

설치 파일을 받아 설치를 진행한다.

설치가 끝나면 자동으로 실행되며, 라즈베리파이에서 로그인했던 계정으로 로그인을 진행한다.

이렇게 로그인을 하고 나면, 시스템 트레이에서 Tailscale이 실행되고 있는지 확인할 수 있다.

여기까지 성공하면 이제 두개의 기기는 서로 같은 네트워크 상으로 묶여 있는 것이다. 100.x.x.x 형태의 고정 IP가 각 디바이스에 부여되었으며, 앞으로 SSH를 연결할 때에는 해당 IP로 연결하면 된다. (당연히 서로 묶여있는 경우에만 가능하다.)
라즈베리파이에서 아래 명령어로 가상 IP가 무엇인지 확인할 수 있고,
tailscale ip -4
Windows 터미널에서 SSH를 접속할 때에는 해당 IP를 사용하여 접속하면 된다.
ssh user@100.x.x.x
나는 현재 PC는 동일한 네트워크에 연결되어 있어서, 갤탭을 핫스팟으로 연결하고 라즈베리파이에 SSH로 접속해 보았다. 매우 잘 접속되는 것을 볼 수 있다.

이렇게 외부에서 접속할 수 있는 SSH 연결 끝!!
Tailscale에 연결되어 있는 기기들과 IP를 명령어로 확인하고 싶으면 아래 명령어를 사용하면 확인할 수 있다.
tailscale status
전체 흐름은 가상 사설망(VPN) 구축을 한 샘이다. 방금 구축한 Tailscale은 분할 터널링(Split Tunneling)을 지원하여 목적지의 주소가 일반적인 목적지(www.naver.com 등)이면 기본 인터넷을 이용하고, 100.xxx.xxx.xxx인 경우에는 Tailscale 터널을 사용하여 통신이 이루어지기 때문에 인터넷 속도가 느려지지 않고 통신이 가능하다.
뭔가 신기하면서도 나만의 웹 서버를 구축하기 위한 초기 세팅이 완료된 것 같다. 이후에는 웹 서버를 구축하는 것까지 한 번 진행해 봐야겠다.
'🖥️ Dev > Infra' 카테고리의 다른 글
| [Infra][Docker][Error] docker: Error response from daemon: unauthorized (0) | 2026.02.08 |
|---|---|
| [Infra][Docker] 도커 네트워크로 백엔드와 DB 연동해서 배포하기 (0) | 2026.02.04 |
| [Infra][Server] 포트포워딩 없이 외부에서 내 서버로! 연결 확인 및 첫 웹 서버 배포 (with. Tailscale) (0) | 2026.01.26 |
| [Infra][Docker] 도커 이미지 이해하기 (1) | 2025.07.20 |
| [Infra][Docker] 도커 기본 명령어 모음 (0) | 2025.07.20 |
since 2025.01.27. ~ 개발자를 향해....🔥