Raspberry Pi에서 AI 에이전트를 실행하고 공인 IP 없이 어디서나 접속하기
요약
Raspberry Pi를 활용해 24시간 구동되는 AI 에이전트 호스트를 구축하고, CGNAT 환경에서도 공인 IP 없이 어디서나 접속할 수 있는 네트워킹 방법을 소개합니다. 기존의 포트 포워딩이나 VPN 방식의 한계를 넘어 오버레이 네트워크를 통해 에이전트에게 영구적인 주소를 부여하는 가이드를 제공합니다.
핵심 포인트
- CGNAT 환경에서도 공인 IP 없이 외부 접속 가능
- Raspberry Pi의 저전력·저소음 특성을 활용한 에이전트 호스트 구축
- 포트 포워딩 및 VPN 방식의 운영상 한계 분석
- 오버레이 네트워크를 통한 에이전트 중심의 네트워킹 접근법
저는 단 하나의 목적을 위해 Raspberry Pi를 구매했습니다. 바로 집에서 24시간 내내 AI 에이전트 (AI agent)를 실행하고, 커피숍에 있는 제 노트북, 특정 클라우드 리전의 VM, 또는 도움이 필요한 다른 에이전트 등 어디에서나 접속할 수 있도록 하는 것이었습니다. Raspberry Pi를 준비하는 것은 쉬웠습니다. 진짜 프로젝트는 "어디서나 접속하기"였습니다.
대부분의 사람들이 부딪히는 벽은 바로 이것입니다. Pi는 ISP의 라우터 뒤에 위치하며, 대개 Carrier-grade NAT (CGNAT) 뒤에 있어 공인 IP (Public IP)도 없고 인바운드 포트 (Inbound ports)도 없습니다. 포트 포워딩 (Port forwarding)은 연결 방식에 따라 사용할 수 없거나, 주소를 거리의 절반과 공유하고 있는 상황에서는 도움이 되지 않습니다. 모뎀이 재부팅될 때마다 IP가 변경됩니다. 시도하는 모든 원격 접속 도구는 작동하다가 어느 순간 멈춰버리며, 각 도구는 관리해야 할 또 다른 데몬 (Daemon)이 됩니다.
이 글은 마침내 성공한 설정 방식에 대한 가이드입니다. 오버레이 네트워크 (Overlay network) 상에서 Pi를 일급 동료 (First-class peer)로 실행하여, 재부팅과 IP 변경에도 살아남는 영구적인 주소를 갖게 하는 방식입니다. 공인 IP도, 포트 포워딩도, 계속 유지해야 하는 터널 (Tunnel)도 필요 없습니다. 단 하나의 설치 명령만으로, Pi는 당신과 다른 에이전트들에 의해 어디에서나 접속 가능해집니다.
Pi가 훌륭한 에이전트 호스트인 이유 (그리고 끔찍한 서버인 이유)
Raspberry Pi는 거의 완벽한 에이전트 박스입니다. 항상 켜져 있고, 전력 소모가 낮으며, 소음이 없고, ARM 아키텍처는 대부분의 에이전트가 수행하는 작업에 충분합니다. 에이전트의 정상 상태 (Steady state)는 주로 듣고, 생각하고, 도구 (Tools)를 호출하는 것이지, 프레임을 렌더링하는 것이 아니기 때문입니다.
문제는 네트워킹입니다. 이제 에이전트는 서버입니다. 서버에는 주소가 필요하며, 접속이 가능해야 합니다. 가정용 연결은 이 중 어느 것도 무료로 제공하지 않습니다. 고정 IP (Static IP)도 없고, 인바운드 포트도 없으며, 점점 더 설정조차 할 수 없는 NAT 계층이 추가되고 있습니다. 따라서 흥미로운 엔지니어링 문제는 에이전트가 아니라, 당신과 에이전트 사이의 네트워크입니다.
일반적인 옵션들 — 그리고 그 비용
솔직하게 말해서, 표준적인 도구 상자는 다음과 같습니다:
- 포트 포워딩 (Port forwarding) + 다이내믹 DNS (dynamic DNS). ISP(인터넷 서비스 제공업체)가 실제 공인 IP를 제공하고 포트를 개방할 수 있게 해준다면 작동합니다. 하지만 CGNAT(Carrier-Grade NAT)는 이 두 가지를 모두 무력화합니다. 또한, 당신은 IP를 얻을 뿐 정체성(identity)을 얻는 것이 아닙니다. 에이전트의 주소는 여전히 연결 상태에 따라 계속 변경됩니다.
- 역 SSH 터널 (Reverse SSH tunnels) 및 터널 서비스. 견고하며 널리 사용됩니다. 비용은 운영 측면에서 발생합니다. Keepalive(연결 유지), 재연결 로직, 그리고 당신과 Pi 사이의 단일 장애점 (single point of failure) 문제가 있습니다.
- VPN (Tailscale, WireGuard 및 기타 서비스들). 진정으로 훌륭한 제품들입니다. 하지만 VPN은 _기기들 (machines)_을 하나의 프라이빗 네트워크로 연결합니다. 즉, 이제 모든 장치에 대한 참여 정책과 신뢰를 관리해야 하며, 에이전트의 도달 가능성(reachability)은 해당 네트워크가 계속 유지되는지에 달려 있게 됩니다.
이 중 틀린 방법은 없습니다. 단지 에이전트가 아닌 기기를 중심으로 설계되었을 뿐입니다.
접근 방식: 터널이 아닌 에이전트에게 주소를 부여하기
제 설정을 바꾼 전환점은 다음과 같습니다: Pi의 포트를 노출하는 것을 멈추고, 에이전트 자체에 오버레이 네트워크 (overlay network) 상의 영구적인 가상 주소를 부여하는 것입니다.
제가 사용하는 것은 Pilot Protocol입니다. 에이전트를 위해 구축된 오픈 소스 오버레이 네트워크입니다. 아래의 모든 내용은 이 프로젝트의 문서를 참조합니다. 모든 노드는 재시작, IP 변경, 네트워크 이동 시에도 유지되는 영구적인 주소를 할당받습니다. 트래픽은 암호화된 UDP 터널 (X25519 키 교환, AES-GCM)을 통해 흐르며, NAT 트래버설 (NAT traversal) 기능이 내장되어 있습니다: STUN + 홀 펀칭 (hole punching) 방식을 사용하며, 네트워크가 직접 경로를 차단할 경우 릴레이 (relay) 폴백(fallback) 기능을 제공합니다. 제 라우터 뒤에 있는 Pi는 제가 단 하나의 포트도 열지 않고도 데이터 센터의 VM만큼이나 쉽게 도달할 수 있습니다.
특히 홈 랩 (home lab) 환경에서는 두 가지 세부 사항이 중요합니다. 첫째, 데몬 (daemon)은 외부 의존성이 전혀 없는 Go 언어로 작성된 정적 바이너리 (static binary)입니다. 따라서 함께 설치할 것이나 건강 상태를 유지해야 할 런타임 (runtime)이 없으며, 이는 디스크 용량이 제한적인 Pi에서 매우 중요합니다. 둘째, 신뢰는 명시적입니다: 피어 (peers)는 상호 핸드셰이크 (mutual handshake)를 통해 연결됩니다. "네트워크에 접속되어 있음"과 "당신에게 신뢰받음"은 별개의 개념이므로, 당신의 Pi는 단순히 도달 가능하다는 이유만으로 낯선 이의 접속을 허용하지 않습니다.
Raspberry Pi에서 AI 에이전트를 실행하고 어디서나 접속하기: 단계별 가이드
처음부터 끝까지의 전체 경로를 소개합니다.
1단계 — Pi에 설치하기. SSH로 접속하여 설치 프로그램을 실행합니다. 설치 프로그램이 플랫폼을 감지하고, 미리 빌드된 바이너리 (pre-built binary)를 가져오며, systemd 서비스를 설정하므로 재부팅 후에도 데몬 (daemon)이 자동으로 다시 실행됩니다.
curl -fsSL https://pilotprotocol.network/install.sh | sh
이것이 설치의 전부입니다. Python 환경, Node 런타임 (runtime), 유지 관리해야 할 Docker 데몬 (daemon)이 전혀 필요 없습니다.
2단계 — 데몬을 시작하고 주소 할당받기.
pilotctl daemon start --hostname pi-agent
출력 결과는 다음과 같습니다:
starting daemon (pid 12345).....
Daemon running (pid 12345)
Address: 0:0000.0000.xxxx
...
해당 주소는 에이전트의 영구적인 식별자 (identity)입니다. 재부팅, IP 변경, 심지어 Pi를 완전히 다른 네트워크로 이동하더라도 동일하게 유지됩니다.
3단계 — 어디서나 핸드셰이크 (Handshake) 수행하기. 노트북, 클라우드 VM, 또는 두 번째 에이전트에서 Pi와의 신뢰 관계를 구축합니다:
pilotctl handshake pi-agent
Pi 측에서 승인합니다 (양쪽 끝을 모두 제어하므로, Pi에서 일회성으로 pilotctl approve를 실행하면 됩니다). 그런 다음 터널 (tunnel)이 작동하는지 확인합니다:
pilotctl ping pi-agent
4단계 — 에이전트와 통신하기. 메시지는 네트워크 레지스트리 (registry)를 통해 이름으로 라우팅되므로, 양측이 어디에 있든 Pi를 pi-agent로 호출하면 됩니다:
pilotctl send-message pi-agent --data 'check my server logs and summarize anything unusual'
메시지는 Pi 데몬 (daemon)의 수신함에 도착하며, 에이전트 코드가 이를 읽고 작업을 수행한 뒤 응답합니다. 이 과정에서 공인 IP (public IP)는 전혀 관여하지 않습니다.
5단계 — Pi 에이전트에 실제 기능 부여하기. 이 부분이 제가 실제로 좋아하는 부분입니다. Pi의 에이전트는 로컬에서 입력된 IPC 서비스로 실행되는 에이전트 네이티브 앱 (agent-native apps)을 설치할 수 있습니다. 이 앱들은 JSON 입력, JSON 출력, 서명 검증 (signature-verified) 방식을 따르며 필요에 따라 자동으로 생성됩니다. 루프는 발견, 설치, 호출 순으로 진행됩니다:
pilotctl appstore catalogue
pilotctl appstore install io.pilot.cosift
pilotctl appstore call io.pilot.cosift cosift.search '{"q":"current agent frameworks"}'
따라서 저의 Pi 에이전트는 제가 스크래퍼 (scraper)를 직접 유지 관리하지 않고도 근거 있는 웹 검색 (grounded web search) 기능을 갖추게 되었으며, 만약 신뢰할 수 없는 입력에 에이전트를 노출하더라도 AEGIS가 프롬프트 인젝션 (prompt injection)에 대응하는 런타임 방화벽 (runtime firewall)으로서 로컬에서 실행됩니다. 기능 하나당 명령어 하나면 충분하며, REST 배관 작업(plumbing)이나 브라우저도 필요 없습니다.
실제로 얻게 되는 것
- 영구적인 주소. 재부팅, IP 변경, 네트워크 이동 시에도 유지됩니다. 이제 홈 연결을 인프라 (infrastructure)로 취급하며 고심할 필요가 없습니다.
- 포트 개방 없는 도달 가능성. 릴레이 폴백 (relay fallback) 기능이 포함된 NAT 트래버스 (NAT traversal)를 통해 CGNAT 및 폐쇄된 네트워크를 처리합니다. 만약 Pi가 아웃바운드 UDP를 차단하는 네트워크에 위치하더라도, 데몬 (daemon)은 TCP/443을 통한 호환성 전송 (compat transport) 방식을 지원합니다.
- 명시적인 신뢰. 모든 피어 (peer)는 핸드셰이크 (handshake)를 통해 승인됩니다. 항상 켜져 있는 귀하의 Pi는 도달 가능하지만, 무방비로 열려 있지는 않습니다.
- 고립된 터널이 아닌 네트워크. 이 오버레이 (overlay) 네트워크에는 243,000명 이상의 에이전트와 사용자가 있으며, 귀하의 Pi는 그 안에서 서비스와 피어를 발견하거나, 혹은 프라이빗한 2노드 (two-node) 설정으로 유지할 수 있습니다. 두 방식 모두 작동합니다.
- CLI를 넘어설 때를 위한 SDK. Go, Python, Node, Swift 바인딩 (bindings)을 제공하며, 만약 에이전트가 MCP를 사용한다면 MCP 서버도 지원합니다.
이 설정이 적합하지 않은 경우
솔직한 한계점을 말씀드리자면, 데몬은 설계상 장시간 실행되므로 서버리스 함수 (serverless functions)는 범위에서 제외됩니다. 만약 Pi에 가끔 셸 (shell) 접속만 필요하다면, 성숙한 VPN이나 터널 제품이 더 간단한 도구입니다. 또한, 사람이 일반 HTTP를 통해 Pi에 접속해야 한다면, 오버레이는 웹 서버가 아닙니다. 해당 경우를 위해 IP 트래픽을 브릿지(bridge)하는 선택적인 게이트웨이 바이너리 (gateway binary)가 있지만, 터널 서비스가 더 직접적인 해답이 될 수 있습니다. 오버레이가 진가를 발휘하는 순간은 도달하려는 대상이 '에이전트 (agent)'일 때입니다. 즉, 다른 소프트웨어에 의해 자체적인 조건으로 주소 지정이 가능해야 하는 정체성을 가진 존재일 때입니다.
원 커맨드 (One-Command) 설정
네트워킹이 프로젝트의 주 목적이 아니게 되는 순간, Pi는 완벽하게 항상 켜져 있는 (always-on) 에이전트의 거처가 됩니다. 제 장치는 이미 몇 달째 이런 방식으로 작동하고 있습니다: 부팅, 데몬 (daemon) 시작, 주소 변경 없음, 어디서든 접속 가능.
curl -fsSL https://pilotprotocol.network/install.sh | sh
전체 커맨드 레퍼런스 (command reference), SDK 가이드, 그리고 신뢰 모델 (trust model)에 대한 적절한 설명을 원하신다면, Pilot Protocol 문서가 다음 단계로 확인해야 할 곳입니다. Pi 자체를 위해서는: 설치, 시작, 핸드셰이크 (handshake), 완료. 이제 당신의 에이전트는 마침내 고유한 홈 주소를 갖게 되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기