SSH와 Nginx로 직접 호스팅하는 HTTP 터널

57 minutes ago 2

OpenSSH와 nginx만으로 로컬 HTTP 서비스를 외부에 공유하는 터널을 구성할 수 있음. 짧은 SSH 명령 하나로 터널을 열고 공유용 HTTPS URL을 얻음 SSH 원격 포트 포워딩이 서버의 빈 포트를 로컬 서비스에 연결하고, nginx는 서브도메인에서 포트 번호를 추출해 해당 포트로 요청을 전달함 포트 번호만으로는 접근을 충분히 제한하기 어려워, 만료 시각과 해시를 담은 인증 정보를 URL에 넣고 nginx의 ngx_http_secure_link_module로 검증함 도우미 스크립트가 SSH 세션 프로세스의 수신 포트를 찾아 인증 URL을 생성함. 포트 소유 프로세스를 확인하는 단계에는 sudo 권한이 필요함 이 구성은 비밀값을 아는 사용자에게 서버의 다른 TCP 포트까지 노출할 수 있음. server_name 정규식을 임시 포트 범위로 제한하면 보안을 강화할 수 있음 OpenSSH와 nginx로 로컬 서비스 공유하기 localhost:8080에서만 실행되는 블로그 미리보기를 다른 사람에게 보여주는 상황에서 HTTP 터널을 활용할 수 있음 터널링 도구마다 호스팅 방식과 클라이언트 요구사항이 다름 ngrok과 Cloudflare Quick Tunnels는 상용 서비스로 운영됨 frp와 localtunnel은 직접 호스팅할 수 있지만 전용 클라이언트가 필요함 sish는 일반 SSH 클라이언트로 사용할 수 있지만 특정 SSH 서버가 필요함 서버에서 이미 실행 중인 OpenSSH와 nginx를 활용하면, 최종적으로 ssh -R 0:localhost:8080 http-over-ssh 명령으로 터널과 공유 URL을 얻을 수 있음 원격 포트와 HTTPS 프록시 연결 ssh -N -R 0:localhost:8080 web02.luffy.cx처럼 원격 포트를 0으로 지정하면 서버가 빈 포트를 할당함 예를 들어 41535가 할당되면 해당 서버 포트로 들어오는 연결을 로컬의 localhost:8080으로 전달함 nginx는 server_name ~^p(?<port>\d\d\d\d\d)\.ssh\.luffy\.cx$로 서브도메인의 5자리 포트 번호를 추출함 https://p41535.ssh.luffy.cx 요청을 proxy_pass http://127.0.0.1:$port로 전달함 HTTPS 수신 설정은 IPv4와 IPv6 모두에 적용함 *.ssh.luffy.cx의 와일드카드 DNS 레코드와 인증서도 필요함 예...

Read Entire Article