SSH 원격 포워딩과 nginx secure_link로 만드는 셀프호스팅 HTTP 터널
- ssh -N -R 0:localhost:8080으로 원격 포워딩하면 서버가 빈 포트를 자동 할당하고, nginx가 정규식 server_name으로 p41535.ssh.luffy.cx 요청을 127.0.0.1:41535로 프록시함
- 포트 번호가 사실상 유일한 비밀이라 ngx_http_secure_link_module로 MD5 해시와 만료 시각을 URL 사용자명에 실어 검증하고, 해시 불일치는 401, 만료는 410으로 응답함
- Let's Encrypt DNS-01 챌린지로 와일드카드 인증서를 받고, *.ssh.luffy.cx CNAME과 CAA issuewild 레코드를 Route 53의 acme 존에 둠
- Authorization 헤더를 지우고 Upgrade 헤더를 전달해 WebSocket 프록시까지 같은 설정으로 처리함
- 댓글에서는 Tailscale·Cloudflare 같은 SaaS가 self-hosted 경계를 흐린다는 지적과 함께 iroh 기반 HTTPS 터널, 클라이언트 인증서 방식, 집 IPv4에 nginx 직접 운영이 대안으로 나옴
Hacker News opinions
터널 자체는 진짜 좋은데 Tailscale이나 Cloudflare가 다 해주니까 self-hosted라는 말이 점점 흐려짐. 중간자 없이 완전히 돌아가는 이런 방식이 결국 답이라고 봄.
그거 그냥 wireguard 아님?
self-hosted라고 해놓고 왜 *.ssh.luffy.cx 같은 서드파티 서비스를 씀?
그건 자기 도메인으로 바꾸면 됨.
난 https over iroh가 제일 기대됨. 포트포워딩도 공인 IP도 필요 없고 공용 릴레이로 시그널링한 다음 직접 연결함. irohttps:// 같은 스킴만 정의하면 되는데.
그건 ICE/TURN/STUN 계열 아니냐? 어느 게 실제로 동작하는지는 까먹었는데 아무튼 그런 거임.
iroh-ssh는 지금도 돌아감. 완벽하진 않은데 CGNAT 뒤에서 웹 인터페이스 포트포워딩하는 정도는 충분함.
비슷한 걸 userspace wireguard로 만들고 있음. 곧 공개할 예정.
코드는 없는데 브라우저에 특정 클라이언트 인증서가 있을 때만 콘텐츠를 주는 nginx가 더 낫다고 봄. 공개키만 공유하면 끝인데 모바일 브라우저가 인증서 처리를 잘 못 함.
HTTPS 서버는 항상 자기 공개키를 내주는데, 클라이언트 시크릿 같은 걸 말하는 거임?
딱 필요했던 건데 존재를 몰랐음.
self-hosting은 결국 엔드포인트를 노출해야 하고 방어 도구가 거의 없다는 게 단점임.
난 그냥 공유기 80/443을 집 LAN nginx로 포워딩하고 도메인을 집 IPv4로 돌림. 파일 넣으면 끝이고 수십 년째 잘 돌아감. 터널이며 자격증명이며 필요한 경우도 있겠지만 대부분 사람한테는 해당 없음.
ISP 약관이 문제 될 수 있음. 얼마나 빡세게 잡는지에 따라 다르지만.
집 IPv4에 서버 돌리면 프라이버시 문제도 있음. 님이 최근에 무슨 영화 봤는지까지 다 보임.