Sanstun: Rust로 구현한 sans-IO, 병렬 처리 친화적 WireGuard

2 days ago 6

Firezone이 sanstun을 공개함. WireGuard 상태 머신을 Rust로 구현한 사용자 공간 라이브러리로, 입출력과 상태 로직을 분리하고 사용성, 보안, 병렬 처리 성능을 고려한 API를 제공함 sans-IO 설계는 네트워크 입출력뿐 아니라 시간과 난수도 상태 로직에서 분리함. 내부 패킷 버퍼링을 없애고, 세션이 없을 때의 버퍼링과 핸드셰이크 시작을 호출자가 제어하도록 함 모든 수신 데이터그램이 Interface::receive 를 거치도록 타입을 설계해, 핸드셰이크 요청 제한을 빠뜨리거나 패킷을 잘못된 터널로 전달하는 문제를 방지하도록 함 상태 관리와 암호 연산을 분리해 단일 터널 안에서도 암호화와 복호화를 작업 스레드로 넘길 수 있음. 인터페이스 상태 관리는 단일 스레드에 유지해 내부 요청 제한기에 잠금이나 원자적 카운터가 필요하지 않음 공개 벤치마크에서 1,280바이트 패킷 암호화의 상태 관리 비중은 약 2% 였음. 이를 바탕으로 45배 이상의 잠재적 가속이 가능하지만, 스레드 간 전달 비용과 추가 오버헤드를 제외한 수치여서 실제 달성은 어려움 sans-IO와 sanstun의 설계 목표 sanstun은 WireGuard 상태 머신의 Rust 구현으로, 병렬 처리에 적합하고 Rust 관용에 맞는 API를 통해 사용성, 보안, 성능을 추구함 sans-IO는 입출력과 부수 효과를 상태 및 비즈니스 로직에서 분리하는 설계 방식임 분리 대상에는 파일 및 네트워크 입출력뿐 아니라 시간과 난수도 포함됨 부수 효과가 없어 구성 요소를 조합하고 테스트하기 쉬우며, 함수 색깔 문제를 피하고 Rust 소유권 규칙과도 잘 맞음 Rust에만 국한되지 않으며 다른 언어에도 적용할 수 있음. 자세한 개념은 sans-IO 소개에서 확인 가능함 boringtun 포크에서 새 구현으로 Firezone은 처음에 boringtun을 사용했으나, 제품 요구사항이 바뀌면서 버그 수정과 API 추가를 포크에 계속 적용함 업스트림에 반영할 수 있도록 기존 API 동작을 유지했지만, 100% API 호환성을 지키기가 점점 어려워짐 2년 넘게 사용하고 수정했으며, 의존성 업데이트를 제외해도 패치 및 수정 내역이 70개 이상의 PR에 달함 여기에는 경계 사례의 버그 수정, 새 API, 설정 가능한 동작 추가가 포함됨 초기의 큰 변경 중 하나는 시간 처리를 완전한 sans-IO 방식으로 전환한 것임 firezone/boringtun#5에서 In...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵