콘텐츠로 이동

터널로 게이트웨이 노출

Cloudflare, Tailscale, ngrok, Pinggy, OpenVPN 또는 커스텀 명령을 사용하여 게이트웨이를 인터넷에서 접근 가능하게 만드는 방법을 설명합니다.

기본적으로 Revka 게이트웨이는 127.0.0.1에 바인딩되어 실행 중인 머신에서만 접근할 수 있습니다. 웹훅을 수신하거나, 인터넷을 통해 기기를 페어링하거나, 다른 네트워크에서 대시보드에 접근하려면 퍼블릭 인그레스가 필요합니다. Revka에는 외부 터널 도구(Cloudflare, Tailscale, ngrok, Pinggy, OpenVPN, 또는 직접 지정한 명령)를 래핑하는 내장 터널 레이어가 포함되어 있으며, 데몬과 함께 시작 및 종료됩니다.

이 가이드에서는 게이트웨이를 외부에서 접근할 수 있는 두 가지 방법(allow_public_bind를 통한 신뢰할 수 있는 LAN 접근과 퍼블릭 인터넷을 위한 터널)을 설명하고, 각 프로바이더 설정 방법을 안내합니다. 게이트웨이 서버 자체에 대한 내용은 대시보드 실행revka 게이트웨이, 데몬 & 서비스를 참조하세요.

게이트웨이는 자체적으로 퍼블릭 인터넷에 노출되지 않습니다. [gateway][tunnel]에서 다음 두 가지 노출 방식 중 하나를 선택합니다.

  • 직접 퍼블릭 바인딩 — 리스너를 루프백이 아닌 주소(0.0.0.0, [::], 또는 LAN IP)에 바인딩합니다. 신뢰할 수 있는 LAN 환경이나 Docker 내부처럼 네트워크 경계가 방화벽으로 보호되는 경우에 사용합니다. allow_public_bind로 제어합니다.
  • 터널 — 게이트웨이는 127.0.0.1에 유지하고, 터널 프로바이더가 인터넷 facing URL을 게이트웨이로 포워딩합니다. 리스너 자체가 루프백에 유지되므로 Revka를 퍼블릭 인터넷에 노출하는 권장 방법입니다.

두 방법을 함께 사용할 수 있지만, 터널은 localhost로도 충분히 포워딩되므로 대부분의 경우 두 방법을 동시에 사용할 필요는 없습니다.

리슨 주소는 [gateway].host에서 가져옵니다. 루프백(127.0.0.1, localhost, ::1) 이외의 모든 주소는 퍼블릭 바인딩으로 처리됩니다.

[gateway]
host = "127.0.0.1" # default — localhost only
port = 42617
allow_public_bind = false # guard against accidental exposure
타입기본값의미
hoststring"127.0.0.1"바인드 주소. 0.0.0.0 = 모든 IPv4 인터페이스, [::] = 모든 IPv6 인터페이스. 환경 변수: REVKA_GATEWAY_HOST
portint42617리슨 포트. 환경 변수: REVKA_GATEWAY_PORT
allow_public_bindboolfalse루프백이 아닌 바인딩을 명시적으로 허용. 환경 변수: REVKA_ALLOW_PUBLIC_BIND

CLI에서 실행 시마다 호스트와 포트를 재정의할 수 있습니다.

Terminal window
revka daemon --host 127.0.0.1 # localhost only (default)
revka daemon --host 0.0.0.0 # all interfaces, LAN access
revka daemon --port 9090 # override the gateway port

터널 설정이나 allow_public_bind = true 없이 퍼블릭 주소에서 게이트웨이를 시작하면 Revka는 시작 시 경고 로그를 출력하며 세 가지 안전한 옵션을 안내합니다. 127.0.0.1을 유지하거나, 터널을 구성하거나, allow_public_bind = true를 설정하여 노출을 명시적으로 허용하고 경고를 숨기는 방법입니다. 터널을 구성하면 경고가 자동으로 사라집니다.

터널은 외부 도구를 래핑합니다. Revka는 바이너리(또는 Pinggy의 경우 SSH 세션)를 실행하고, 출력에서 퍼블릭 URL을 감시하며 출력 후, 데몬이 종료될 때 깔끔하게 종료합니다. tunnel.provider로 프로바이더를 선택하고 해당 프로바이더의 하위 섹션을 설정합니다.

[tunnel]
provider = "cloudflare" # none | cloudflare | tailscale | ngrok | openvpn | pinggy | custom
[tunnel.cloudflare]
token = "eyJhIjoiMTI..."
필드타입기본값의미
tunnel.providerstring"none"시작할 프로바이더. 빈 문자열은 "none"과 동일합니다.

프로바이더 값은 대소문자를 구분하지 않으므로 "CloudFlare"와 같은 기존 PascalCase 설정도 동작합니다. 단, 새 설정에서는 소문자 형식을 사용하세요. provider"none" 이외의 값이면 해당 하위 섹션이 존재하고 필수 필드가 설정되어 있어야 합니다. 그렇지 않으면 데몬이 tunnel.provider = "ngrok" but [tunnel.ngrok] section is missing과 같은 오류와 함께 시작을 거부합니다.

일반적인 프로바이더(Cloudflare, Tailscale, ngrok, Custom)는 revka onboard 5단계에서 대화형으로 설정할 수 있습니다. OpenVPN과 Pinggy는 config.toml을 직접 편집하여 설정합니다.

cloudflared 바이너리와 Cloudflare Zero Trust 터널 토큰을 래핑합니다. 시작 시 Revka는 로컬 포트에 대해 cloudflared tunnel --no-autoupdate run을 실행하고 stderr에서 퍼블릭 URL을 읽습니다(최대 30초 대기).

[tunnel]
provider = "cloudflare"
[tunnel.cloudflare]
token = "eyJhIjoiMTI..." # required — from the Zero Trust dashboard
필드타입필수 여부의미
tokenstring필수Zero Trust 대시보드에서 발급한 Cloudflare 터널 토큰

cloudflared가 설치되어 있고 PATH에 등록되어 있어야 합니다. cloudflared는 URL을 stdout이 아닌 stderr로 출력합니다.

  1. 프로바이더의 도구를 설치합니다. Cloudflare는 cloudflared, Tailscale은 tailscale, ngrok은 ngrok, OpenVPN은 openvpn이 필요합니다. Pinggy와 Custom(SSH 기반 명령 사용 시)은 ssh만 있으면 됩니다.

  2. [tunnel] 섹션을 추가합니다. 위의 예시를 참고하여 ~/.revka/config.toml에 프로바이더와 자격증명을 설정합니다.

  3. 게이트웨이를 localhost에 유지합니다. [gateway].host = "127.0.0.1"을 그대로 두세요. 터널이 로컬 포트로 포워딩하므로 allow_public_bind를 설정할 필요가 없습니다.

  4. 데몬을 시작합니다. Revka가 게이트웨이와 함께 터널을 실행하고 퍼블릭 URL을 출력합니다.

    Terminal window
    revka daemon
    # 🔗 Starting cloudflare tunnel...
    # 🌐 Public URL: https://your-tunnel.example.com
  5. 퍼블릭 URL로 페어링합니다. 출력된 URL을 열고 페어링을 완료합니다. 6자리 코드는 원격 브라우저가 아닌 터미널에 표시됩니다. 원격 페어링 플로우에 대한 자세한 내용은 대시보드 실행을 참조하세요.

먼저 게이트웨이가 로컬에서 응답하는지 확인하세요. 헬스 엔드포인트는 인증이 필요 없고 민감한 정보를 노출하지 않습니다.

Terminal window
curl http://127.0.0.1:42617/health
# {"status":"ok","paired":true,"require_pairing":true,...}

그런 다음 터널 URL을 통해 동일한 경로에 접근해 보세요. 로컬 확인은 성공하지만 터널이 동작하지 않는 경우:

  • 데몬이 섹션 누락 오류와 함께 종료됩니다. provider가 설정되어 있지만 해당 [tunnel.<provider>] 하위 섹션이나 token / auth_token / config_file과 같은 필수 필드가 없는 경우입니다. 해당 내용을 추가하세요.
  • 퍼블릭 URL이 출력되지 않습니다. 프로바이더 도구가 PATH에 없거나 타임아웃(Cloudflare 30초, ngrok/Pinggy 15초) 내에 URL을 출력하지 않은 경우입니다. 도구를 직접 실행하여 동작을 확인한 후 데몬 로그를 확인하세요.
  • 다른 머신에서 게이트웨이에 접근할 수 없다는 대시보드 메시지가 나타납니다. 터널 없이 루프백에 바인딩된 상태입니다. [tunnel] 섹션을 추가하거나, 신뢰할 수 있는 LAN 환경이라면 allow_public_bind = true를 설정하세요.

revka doctor를 실행하여 구조화된 진단 정보를 확인하세요. LAN 바인딩, 리버스 프록시, Raspberry Pi 등 네트워크 배포에 대한 자세한 내용은 네트워크 배포, Raspberry Pi & 프록시를 참조하세요.