SSH를 HTTPS를 통해 전송하기
- SSH를 HTTPS를 통해 전송하려면 클라이언트와 서버 양쪽을 조정해야 함.
- 클라이언트 설정 예시에서는
~/.ssh/config
파일에 ProxyCommand
과 ServerAliveInterval
을 설정함.
- 사용하는
~/.ssh/https-tunnel.bash
스크립트는 CONNECT
메서드를 헤더로 보내면서 socat
을 사용해 TLS 연결을 생성함.
서버 설정 예시
- 아파치2 HTTPS 서버 설정에서는
proxy_connect_module
을 로드하고 AllowCONNECT
지시어를 사용해 특정 대상에 대한 CONNECT
HTTP 메서드 사용을 허용함.
- 서버 측에서는
https-server
에서 단일 대상인 ssh-server
호스트만을 위해 CONNECT
메서드를 사용할 수 있도록 설정함.
배경
- 병원에 머무르면서 대부분의 연결 유형이 차단된 병원 Wi-fi를 통해 원격으로 작업을 하고자 함.
- 병원 네트워크는 HTTP와 HTTPS 연결만 허용하며, SSH는 완전히 차단됨.
- SSH를 HTTP 또는 HTTPS를 통해 전송하는 방법에 대한 탐색.
가능한 방법들
- 단일 포트에서 SSH와 HTTPS 프로토콜을 공동 호스팅하고 투명하게 분배하는
sslh
프로젝트.
-
sslh
는 프로토콜을 다른 프로토콜에 포함시키지 않고, 다양한 휴리스틱을 사용해 실제 백엔드로 리디렉션함.
-
openssh
의 ProxyCommand
지시어를 사용해 SSH 프로토콜을 다른 프로토콜에 완전히 포함시키는 방법.
SSH over HTTP
- 간단한 SSH over HTTP 시도를 위해 아파치2를 설정해
CONNECT
메서드를 단일 대상 ssh-server:22
에 대해 허용함.
- 클라이언트 측은
socat
을 사용해 쉽게 조정됨.
-
ServerAliveInterval
을 사용해 HTTP 연결이 유휴 상태에서도 끊기지 않도록 함.
SSH over HTTPS
-
socat
은 HTTPS 프록시를 지원하지 않으나 TLS 캡슐화는 지원함.
-
CONNECT
기반 메서드를 수동으로 구현하기 쉬움.
-
~/.ssh/https-tunnel.bash
스크립트를 사용해 SSH over HTTPS 터널링을 구현함.
마무리
- HTTPS의 보편적인 존재는 매우 제한적인 중간 장치를 통해 데이터를 전송할 수 있게 해줌.
-
CONNECT
메서드는 TCP 페이로드 스트림을 TLS 호스트 스트림으로 래핑하는 유용한 해킹임.
-
ServerAliveInterval
은 유휴 연결에 친화적이지 않은 하위 전송에 대해 연결을 유지하는 데 사용됨.
GN⁺의 의견
- 이 글에서 가장 중요한 것은 제한적인 네트워크 환경에서도 SSH 연결을 가능하게 하는 창의적인 해결책을 제시했다는 점임.
- SSH와 HTTPS를 결합하는 방법은 네트워크 보안과 관련된 전문 지식을 가진 사람들에게 특히 흥미로울 수 있음.
-
ProxyCommand
와 ServerAliveInterval
설정을 통해 네트워크 제한을 우회하는 방법은 네트워크 관리자나 보안 전문가들에게 유용한 정보를 제공함.