며칠 전부터 라즈베리파이는 살아 있는데 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 경로를 어떻게 이해하고 있었는지 다시 정리하게 만든 사건이었다.
정리하면:
- 웹이 살아 있다고 해서 SSH 경로도 당연히 살아 있는 것은 아니다.
- Tunnel에
ssh://localhost:22를 추가해도, 로컬 클라이언트 쪽 Cloudflare 경유 설정이 없으면 평범한ssh는 안 붙을 수 있다. - 이런 구조라면
ProxyCommand를 미리 넣어두는 편이 덜 헷갈린다.
다음에는 여기서 한 걸음 더 나아가서 브라우저 SSH나 별도 관리 경로를 같이 두는 쪽이 더 안전할 것 같다.