Gately v0.6.6 출시
2026년 11월 12일
보안 강화를 중심으로 한 릴리스입니다. 모든 사용자에게 업그레이드를 권장합니다.
보안 수정
- 출처 요청 헤더 위조: 이전에는 방문자가 보낸
X-Real-Ip등 이름이 정확히 같은 헤더만 제거했습니다. PHP, WSGI, CGI 계열 백엔드는X_Forwarded_For,X_Real_IP를 정식 헤더와 같은 변수로 취급하므로, 방문자가 백엔드에 임의의 클라이언트 주소나 접속 프로토콜을 전달할 수 있었습니다. 이제 방문자가 보낸 출처 계열·출처 포트 계열 요청 헤더를 밑줄 표기 변형까지 포함해 전달 전에 모두 제거합니다. 전달 인증 하위 요청도 같게 처리하며X-Original-URI는 Gately가 직접 기록하므로, 경로로 허용 여부를 판단하는 인증 서비스가 방문자가 보낸 값에 속지 않습니다. - 파일 서비스 로그인 속도 제한: WebDAV, FTP, SMB의 비밀번호 검증에는 시도 횟수 제한이 없었습니다. 이제 같은 출처가 15분 안에 10번 실패하면 윈도가 끝날 때까지 거부합니다(IPv6는 /64 단위, 로그인에 성공해도 횟수는 초기화되지 않음). 최근 검증을 통과한 자격 증명은 횟수를 차지하지 않으며, SMB의 익명 탐색 시도는 집계하지 않습니다.
- 백업 복원: 계정 파일을 복원할 때 새 세션 키를 사용하므로, 이전 백업 때문에 이후 로그아웃이나 「모든 기기에서 로그아웃」으로 폐기된 토큰이 다시 유효해지지 않습니다. 압축 해제 후 총 크기가 128 MB를 넘거나 파일이 256개를 넘는 백업은 거부됩니다.
- 기타: nginx 설정 가져오기에서 블록 중첩 깊이를 제한했습니다(깊게 중첩된 설정이 스택을 소진해 프로세스가 종료되었습니다). 300바이트를 넘는 Host 요청 헤더에는 400을 반환합니다. 로그인 실패 시 감사 기록과 로그에 남기는 사용자 이름은 64자로 잘라냅니다.
- 의존성: Go 1.26.11 표준 라이브러리 보안 수정을 반영하고 golang.org/x/net, klauspost/compress, andybalholm/brotli를 업데이트했습니다. 스토리지 마운트의 SMB 클라이언트는 유지보수되는 cloudsoda/go-smb2로 교체했습니다(GO-2026-5051).
계정과 세션
- 서버 측 세션 폐기: 로그아웃하면 해당 토큰을 폐기합니다. 「설정 → 계정 및 보안 → 로그인 세션」에 「모든 기기에서 로그아웃」(
POST /api/account/sessions/revoke)이 추가되어 비밀번호, Passkey, 서드파티 로그인, fnOS 게이트웨이 로그인으로 발급된 세션이 즉시 모두 무효가 됩니다. API 토큰은 영향을 받지 않습니다. - 외부 요청 제한(
restrictOutbound, 기본값 꺼짐): 켜면 Webhook, 알림, IP 목록 구독, DDNS 콜백, 업데이트 확인, 서드파티 로그인 등 관리자가 설정한 외부 요청이 루프백, 사설, 링크 로컬(169.254.169.254 포함) 주소를 거부합니다. 확인된 IP를 연결할 때마다 검사하므로 리다이렉트와 DNS 리바인딩도 포함됩니다. 리버스 프록시 업스트림, Wake-on-LAN, 스토리지 마운트처럼 내부망을 대상으로 하는 기능은 영향을 받지 않습니다. - 느린 요청 방어: 관리 포트는 엔드포인트별로 요청 본문 읽기를 제한합니다. 일반 엔드포인트는 60초 안에 전송을 마쳐야 합니다. 백업 복원, 업그레이드 패키지, 파일 업로드 같은 대용량 엔드포인트는 전체 시간 제한이 없지만 평균 초당 4 KiB 이상으로 계속 전송해야 합니다.
웹 서비스
- 경로별 백엔드의 접두사 제거 (#86): 경로별 백엔드에 「전달 시 경로 접두사 제거」를 추가했습니다.
/api/zyqd/abc는 백엔드에/abc로 전달되며, 백엔드 주소에 포함된 경로가 앞에 붙습니다. nginx의proxy_pass http://백엔드/;에 해당하며, nginx 설정을 가져올 때 자동으로 변환됩니다. - 방문자 출처 포트 (#83): 「X-Forwarded-* 추가」를 켜면
X-Real-Port와X-Forwarded-For-Port를 백엔드에 보냅니다. Gately가 CDN이나 리버스 프록시 뒤에 있으면 전역 설정에서 「실제 포트 헤더」를 지정할 수 있습니다. - 2단 Gately (#81): 바깥쪽은 WAF만 실행하고 안쪽이 로그인을 맡는 구성에서는 양쪽에 같은 인증 표시 키를 입력하고, 바깥쪽 사이트에서 「백엔드 인증 표시 신뢰」를 켭니다. 안쪽에서 인증된 방문자는 바깥쪽에서도 WAF를 건너뜁니다.
백업과 복원 (#85)
설정 복원에 「현재 관리자 계정 유지」를 추가했습니다. 백업의 계정, API 토큰, 관리 화면의 서드파티 로그인 설정은 현재 값을 그대로 유지하며, 백업에 account.json이 없어도 됩니다. 다른 인스턴스의 설정을 옮겨 올 때 유용합니다. 자세한 내용은 설정 · 백업과 복원을 참고하세요.
문제 수정
- 동적 DNS (#84): dynv6 레코드에서 메인 도메인을
dynv6.net, 하위 도메인을xxxx로 입력했을 때 동기화와 제공업체 레코드 삭제가 404를 반환하던 문제를 수정했습니다.xxxx.dynv6.net영역으로 자동 매칭됩니다.
성능
- 차단 목록에 항목이 많아도 추가·삭제할 때 CIDR 목록을 다시 만들지 않습니다. 사이트 라우팅은 정확한 도메인이 일치하지 않을 때만 와일드카드 도메인을 비교합니다. 속도 제한과 로그인 실패 기록의 만료 정리는 초당 최대 한 번만 실행합니다.
- 사이트 기본 인증과 WebDAV는 bcrypt 검증 성공 결과를 10분간 캐시하여 요청당 CPU 비용을 약 85밀리초에서 마이크로초 수준으로 줄였습니다.
- 포트 전달은 splice를 쓸 수 없을 때 버퍼를 재사용합니다. 실시간 연결 목록은 반환하는 500행만 생성합니다. 출처 계열 헤더 제거에서 메모리 할당이 사라졌습니다.
- 관리 화면의 사이트 통계, Docker 상태와 로그, 터미널 세션 목록은 브라우저 탭이 숨겨져 있는 동안 폴링을 멈춥니다.
업그레이드 안내
- Docker는 새 이미지를 받아 컨테이너를 다시 만듭니다. OpenWrt는 새
.apk/.ipk를 덮어써서 설치합니다. fnOS는 앱 센터에서 새.fpk를 직접 설치합니다. 그 밖의 배포 방식은 「시스템 설정」에서 온라인으로 업그레이드할 수 있습니다. - 업그레이드 후에도 로그인된 세션은 계속 유효합니다. 모든 기기에서 다시 로그인하게 하려면 「모든 기기에서 로그아웃」을 사용하세요.