← 뒤로가기

Cloudflare Tunnel SSH가 갑자기 안 붙을 때 정리한 기록

웹은 멀쩡한데 SSH만 죽어 있던 상황에서 Cloudflare Tunnel 경로와 ProxyCommand 설정으로 다시 접속을 살린 과정을 정리했다.

며칠 전부터 라즈베리파이는 살아 있는데 SSH만 붙지 않는 상태가 이어졌다.

증상은 단순했다.

  • 웹 서비스는 정상 응답
  • SSH 호스트는 timeout
  • 즉 장비 전체가 죽은 것이 아니라 SSH 경로만 비정상

처음에는 cloudflared, sshd, 공유기 경로를 의심했다.

그런데 Cloudflare Tunnel 쪽을 다시 확인해보니 가장 먼저 드러난 문제는 SSH용 경로가 터널에 없었다는 점이었다.

먼저 확인한 것

Cloudflare Zero Trust의 터널에는 웹용 경로만 남아 있었다.

  • 메인 웹 도메인 -> http://localhost:80
  • 보조 웹 도메인 -> http://localhost:80
  • 별도 웹 도메인 -> http://localhost:80

즉 웹은 열리는데 SSH는 열릴 수 없는 상태였다.

그래서 터널에 아래 경로를 다시 추가했다.

ssh 호스트 -> ssh://localhost:22

여기까지 하면 바로 해결될 줄 알았는데, 실제로는 여전히 평범한 ssh 접속이 붙지 않았다.

왜 여전히 안 붙었는가

핵심은 이 구조가 일반적인 공개 22/tcp 포트가 아니라는 점이었다.

Cloudflare Tunnel에서 ssh://localhost:22를 걸어둔 뒤에는 보통 아래 방식 중 하나로 접속해야 한다.

  • 브라우저 SSH
  • cloudflared를 이용한 client-side SSH
  • Access for Infrastructure

즉 아래처럼 평범하게 붙는 구조가 아니었다.

ssh user@ssh-host

이 명령이 바로 붙으려면 로컬 쪽에서 Cloudflare 경유를 명시해야 했다.

실제로 다시 살린 방법

내 맥에는 이미 cloudflared가 설치되어 있었고, 아래 명령으로 바로 접속이 살아나는 것을 확인했다.

ssh -o ProxyCommand='cloudflared access ssh --hostname %h' user@ssh-host

즉 문제는 장비가 죽은 것이 아니라, 로컬 SSH 클라이언트가 Cloudflare Access 경유를 모르고 있었다는 쪽에 가까웠다.

결국 남긴 설정

매번 긴 명령을 치지 않도록 ~/.ssh/config에 아래 항목을 추가했다.

Host my-pi
  HostName ssh-host
  User user
  ProxyCommand cloudflared access ssh --hostname %h

Host ssh-host
  User user
  ProxyCommand cloudflared access ssh --hostname %h

이후에는 아래 두 방식이 모두 정상 동작했다.

ssh my-pi
ssh user@ssh-host

이번에 얻은 결론

이번 일은 단순한 접속 장애라기보다, 내가 SSH 경로를 어떻게 이해하고 있었는지 다시 정리하게 만든 사건이었다.

정리하면:

  1. 웹이 살아 있다고 해서 SSH 경로도 당연히 살아 있는 것은 아니다.
  2. Tunnel에 ssh://localhost:22를 추가해도, 로컬 클라이언트 쪽 Cloudflare 경유 설정이 없으면 평범한 ssh는 안 붙을 수 있다.
  3. 이런 구조라면 ProxyCommand를 미리 넣어두는 편이 덜 헷갈린다.

다음에는 여기서 한 걸음 더 나아가서 브라우저 SSH나 별도 관리 경로를 같이 두는 쪽이 더 안전할 것 같다.

이어서 보기