
USTPS 위에서 재구현된 SSH
USSH는 USTP-Secure 기반으로 구축된 셸 프로토콜 및 클라이언트/서버 쌍입니다.
TCP 터널이 아니며 SSH를 TCP 내부에 감싸지 않습니다.
상태: Beta
라이선스: 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
클라이언트는 SSH처럼 비밀번호를 대화형으로 입력받습니다.
클라이언트는 처음 본 서버 X25519 공개 키를 ~/.ussh_known_hosts.json에 저장합니다.
나중에 해당 키가 변경되면 클라이언트는 새 키를 조용히 신뢰하는 대신 TOFU 불일치 오류와 함께 중단합니다.
서버 호스트 키를 의도적으로 교체한 경우, 대화형 확인 후 저장된 TOFU 키를 교체할 수 있도록 클라이언트를 --regen-key와 함께 실행하세요.
USSH 인터넷 드래프트: https://datatracker.ietf.org/doc/draft-x1co-ussh/ACK: 10 MAC:<tag>, NACK: 42 MAC:<tag>, HELLO: ..., CLOSE: 같은 읽을 수 있는 ASCII 제어 라인과 이진 UPACK (UPAK) DATA 프레임을 사용합니다.ACK 및 NACK는 디버깅을 위해 평문으로 유지되지만, 위조된 ACK/NACK 제어 공격을 방지하기 위해 세션별 HMAC 태그로 인증됩니다.UPACK DATA 페이로드당 900바이트라는 USTPS 전송 페이로드 상한을 상속합니다.IP:port가 변경되면 현재 USSH 세션은 종료될 것으로 예상되며 사용자는 깨끗하게 다시 연결해야 합니다.USTPS Congestion이 on인지 off인지도 협상합니다.IP:port에서 클라이언트를 검증하고, 세션을 해당 엔드포인트에 바인딩하고, 엔드포인트가 변경되면 다시 연결합니다.USTPS Congestion을 상속합니다.--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로 취급됩니다.