Sanstun: A sans-IO, parallel-friendly WireGuard implementation in Rust
Firezone, 암호화 작업 병렬 처리하는 WireGuard 라이브러리 sanstun 발표
Firezone이 기존 boringtun 포크를 대체할 Rust 기반 WireGuard 라이브러리 sanstun을 발표했습니다. 패킷 상태 처리와 암·복호화를 분리해 암호 작업을 다른 스레드에서 처리하도록 설계했습니다. 공개 수치는 자체 벤치마크이며, 45배 이상 속도 향상은 스레드 간 전달 비용을 제외한 이론적 추정입니다. 저장소는 정식 보안 감사를 받지 않았다고 밝혔습니다.
- 주제
본문
Firezone은 2026년 10월 31일 Rust 기반 WireGuard 사용자 공간 구현체 sanstun을 발표했습니다. 기존 firezone/boringtun 포크를 대체하는 프로토콜 상태 머신 라이브러리입니다. 네트워크 입출력뿐 아니라 시간과 난수 같은 부수효과를 프로토콜 상태 처리와 분리하는 sans-IO 설계를 적용했습니다. UDP·TUN 입출력과 이를 연결하는 이벤트 루프는 사용하는 쪽에서 구현해야 합니다.
sanstun은 패킷 상태 관리와 실제 암호화·복호화를 나눠 단일 터널 안에서도 암호 작업을 병렬 처리하도록 설계했습니다. WireGuard는 재전송 공격을 막으려고 세션마다 단조 증가하는 패킷 번호를 사용합니다. 여러 스레드가 이 번호와 타이머 상태를 동시에 다루면 동기화가 필요하므로, sanstun은 begin_encapsulate에서 세션을 확인하고 패킷 번호를 예약한 뒤 PendingEncapsulate를 돌려줍니다. 이 작업을 다른 스레드로 옮겨 암호화를 수행할 수 있습니다. 수신 경로도 시작 처리와 복호화, 완료 처리를 나눕니다. 병렬화하지 않을 때는 같은 스레드에서 암·복호화를 처리하면 됩니다.
Firezone이 공개한 자체 data_path 벤치마크에서 1,280바이트 패킷의 송신 상태 처리에는 약 20.8ns, 암호화에는 약 933.5ns가 걸렸습니다. 수신은 시작 처리가 약 37.7ns, 복호화가 약 914.9ns, 완료 처리가 약 17.7ns였습니다. Firezone은 송신 상태 처리가 암호화 시간의 약 2%라며 암호화를 별도 스레드로 옮길 경우 이론상 45배를 넘는 속도 향상 가능성을 제시했습니다. 계산에는 스레드 간 작업 전달 비용과 추가 오버헤드가 포함되지 않습니다. 공개된 벤치마크는 하드웨어와 컴파일 설정 등 측정 환경을 밝히지 않았으며 다른 WireGuard 구현체와 같은 조건에서 비교한 결과도 제시하지 않았습니다.
수신 패킷은 Interface::receive를 거쳐야 합니다. 이 함수가 메시지를 해석하고 인터페이스 전체에 적용되는 레이트 리미팅을 처리한 뒤 해당 터널로 전달할 메시지를 돌려줍니다. WireGuard의 쿠키 절차는 핸드셰이크 요청을 보낸 쪽이 주장한 출발지 IP를 증명하게 해 요청을 출발지별로 제한하는 데 쓰입니다. 공격자가 위조한 요청을 보내면 수신 측은 요청이 거짓인지 판별하기 전에 비용이 큰 키 교환 연산을 수행할 수 있습니다. sanstun은 수신 메시지 타입을 Interface::receive를 거쳐야 얻도록 API를 설계해 레이트 리미팅을 적용하는 경로를 강제합니다.
Firezone은 boringtun을 2년 넘게 사용하며 버그 수정과 API 변경을 포함해 70건이 넘는 PR을 반영했다고 밝혔습니다. 기존 구현은 세션이 없을 때 라이브러리가 패킷을 내부 버퍼에 쌓는 방식을 지원했지만, 버퍼를 나중에 비우는 절차와 추가 메모리 할당, 크기 설정 문제가 있었습니다. sanstun은 내부 버퍼를 두지 않아 세션이 없을 때 보낼 패킷을 어디에 보관할지 호출자가 정합니다. Firezone은 sanstun을 내놓으며 기존 firezone/boringtun 포크를 폐기 대상으로 표시했습니다.
sanstun은 WireGuard 상태 머신을 제공하는 라이브러리입니다. IP 주소를 기준으로 패킷을 올바른 터널에 연결하는 키 라우팅과 복호화한 내부 IP 패킷의 유효성 검사는 호출자 책임입니다. 운영 환경에서는 충분한 엔트로피를 가진 난수 시드와 단조 증가하는 시간값을 공급해야 합니다. 저장소는 정식 보안 감사를 받지 않았다고 밝힙니다. 공개 자료는 API 설계와 자체 벤치마크를 설명하며, 독립 보안 검증이나 다른 구현체보다 빠르다는 비교 결과를 뒷받침하지 않습니다.
자료: Firezone 블로그 / 정리·해설: Trawling
참고 자료
- GitHub - firezone/sanstun: A fast, sans-IO implementation of the WireGuard® protocol · GitHub — https://github.com/firezone/sanstun