
USTPS 위에서 재구현된 SSH
USSH는 USTP-Secure 위에 구축된 셸 프로토콜이자 클라이언트/서버 쌍입니다.
TCP 터널이 아니며 SSH를 TCP 내부에 래핑하지 않습니다.
상태: 베타
라이선스: MIT
chacha20 = CHACHA20_POLY1305aes-256-gcm = AES_256_GCMaes-128-gcm = AES_128_GCMchacha205322python3 ussh_server.py \
--peer-ip <CLIENT_IP_OR_DOMAIN> \
--peer-port 0 \
--bind-ip 0.0.0.0 \
--bind-port 5322 \
--cipher chacha20 \
--congestion-control auto
--password를 생략하면 서버는 시작 시 USSH 로그인 비밀번호를 입력하라는 메시지를 표시합니다.
대화형 시작 시 서버는 자신을 systemd 서비스로 설치할지 여부를 묻습니다. 정상적으로 실행하려면 n이라고 답하세요. 이 질문을 건너뛰려면 --no-systemd-prompt를 사용하세요.
python3 ussh_client.py \
--peer-ip <SERVER_IP_OR_DOMAIN> \
--peer-port 5322 \
--bind-ip 0.0.0.0 \
--bind-port 0 \
--cipher chacha20 \
--congestion-control off \
--cleartext off
클라이언트는 SSH처럼 비밀번호를 대화형으로 입력하라는 메시지를 표시합니다.
클라이언트는 처음 본 서버 X25519 공개 키를 ~/.ussh_known_hosts.json에 저장합니다.
이후 해당 키가 변경되면 클라이언트는 새 키를 조용히 신뢰하는 대신 TOFU 불일치 오류로 중단합니다.
서버 호스트 키를 의도적으로 교체한 경우, 대화형 확인 후 저장된 TOFU 키 교체를 허용하도록 --regen-key 플래그로 클라이언트를 실행하세요.
USSH 인터넷 초안: https://datatracker.ietf.org/doc/draft-x1co-ussh/--cleartext auto|on|off--cleartext on|offauto인 경우 USSH는 클라이언트 요청을 따릅니다.on 또는 off인 경우 서버가 최종 클리어텍스트 모드를 강제합니다.--cleartext on을 사용하면 USSH는 실제 인터넷에서 클리어텍스트가 위험하며 로컬 네트워크와 같은 통제된 환경에서만 권장된다는 경고를 출력합니다.ACK: 10 MAC:<tag>, NACK: 42 MAC:<tag>, HELLO: ..., CLOSE: 같은 읽기 가능한 ASCII 제어 라인과 바이너리 UPACK (UPAK) DATA 프레임을 사용합니다.ACK와 는 디버깅 가능성을 위해 평문으로 유지되지만, 위조된 ACK/NACK 제어 공격을 방지하기 위해 세션별 HMAC 태그로 인증됩니다.USTPS 혼잡 제어가 on인지 off인지도 협상합니다.NACKUPACK DATA 페이로드당 900바이트를 상속합니다.IP:port가 변경되면 현재 USSH 세션은 종료될 것으로 예상되며 사용자는 깨끗하게 다시 연결해야 합니다.IP:port에서 클라이언트를 검증하고, 세션을 해당 엔드포인트에 바인딩하며, 엔드포인트가 변경되면 다시 연결합니다.USTPS 혼잡 제어를 상속합니다.--congestion-control auto|on|off--congestion-control on|offauto인 경우 USSH는 클라이언트 요청을 따릅니다. 서버가 on 또는 off인 경우 서버가 최종 모드를 강제합니다.stdout 바이트 스트림만 재조립합니다.ls, find 또는 컴파일러 로그와 같은 대용량 출력이 손상될 수 있기 때문입니다.ussh_server.py가 실행 중인 머신에서 실제 PTY 기반 셸을 시작합니다.--cipher가 설정되면 서버는 해당 정확한 암호를 사용합니다.--cipher가 생략되거나 auto로 설정되면 서버는 클라이언트가 요청한 암호를 사용합니다.~/.ussh_host_key에 영구 X25519 호스트 키를 유지하므로 TOFU가 재연결 및 재시작에도 안정적으로 유지됩니다.--regen-key를 사용하세요.<peer-ip-or-domain>:<peer-port>별로 저장되므로 다른 주소/포트의 다른 서버는 다른 호스트 ID로 처리됩니다.