How to improve SSL/TLS performance with kTLS offload

kTLS (Kernel Transport Layer Security)는 SSL/TLS 작업을 간소화하기 위한 커널 내 오프로드 메커니즘 입니다. 본 블로그에서는 kTLS 를 커널에서 활성화하고, kTLS 가 활성화된 iperf 툴을 사용하여 SSL 성능을 확인해 보겠습니다. 그리고, kTLS 의 하드웨어 오프로딩이 지원되는 DPU(Data Processing Unit) 를 활용하여 활성화 하는 방법과 이에 따른 성능 가속화를 확인해 보겠습니다.


TLS(Transport Layer Security)는 인터넷에서 TCP 연결을 보호하는 데 사용되는 널리 배포되는 프로토콜 입니다. TLS는 또한 최신 웹 표준인 HTTP/2에 필요한 기능 입니다. Ketnel TLS(kTLS) 는 TLS 프로토콜을 하드웨어로 오프로드할 수 있는 새로운 기회를 제공합니다.

DPU는 TLS 데이터 경로 오프로드를 통해 AES-GCM의 암호화, 암호 해독 및 인증을 가속화할 수 있습니다. TLS 오프로드는 데이터를 저장하지 않고 컨텍스트만 업데이트하고 DPU를 통과하는 동안 데이터를 처리합니다. DPU에서 패킷을 암호화/암호화할 수 없는 경우 유저 스페이스의 애플리케이션이 이를 대체 처리합니다.


  • 시험 환경

  • Ubuntu 20.04

  • Kernel Version 5.12.0

  • DPU : Mellanox BF2


kTLS 기능을 사용하려면 무엇보다 kTLS ULP 설정이 필요하다. 대부분의 리눅스 응용 프로그램은 OpenSSL을 기본 라이브러리로 사용하지만 최근까지 OpenSSL은 kTLS를 공식적으로 지원하지 않았습니다. 따라서 많은 개발자들이 kTLS ULP를 프로그래밍하고 kTLS를 활용하기 위해서는 다음 과 같이 커스터마이징을 해사 OpenSSL 컨텍스트 정보를 얻어와서 사용해야 했습니다. 그러나 OpenSSL 1.1 이상에서는 내부 OpenSSL 컨텍스트 정보에 액세스할 수 없기 때문에 OpenSSL 1.0에서만 이러한 수정이 가능했습니다. 다행히 OpenSSL 3.0.0부터는 공식적으로 kTLS 지원이 OpenSSL 메인 릴리즈에 추가되었습니다. 현재 애플리케이션이 OpenSSL을 사용하여 kTLS를 사용하기 위해서는 다음과 같이 SSL 옵션을 애플리케이션에 추가해 줘야 합니다.

SSL_set_options(fd, SSL_OP_ENABLE_KTLS); 

하지만 Ubuntu 20.04부터는 OpenSSL 1.1 만 기본 패키지로 제공되기 때문에, kTLS 기능을 사용하려면 OpenSSL 3.0.0을 다운로드하여 컴파일 해야 합니다. 다음 단계를 거쳐 이런 작업을 수행할 수 있습니다.


# wget https://www.openssl.org/source/openssl-3.0.0.tar.gz
# tar -xvzf openssl-3.0.0.tar.gz
# cd openssl-3.0.0
# ./Configure --prefix=/home/netlox/source/ssl --openssldir=/home/netlox/source/ssl enable-ktls '-Wl,-rpath,$(LIBRPATH)'
# make
# make install

다음으로 kTLS로 SSL/TLS 성능을 측정하기 위해 kTLS 가 활성화된 iperf 애플리케이션을 컴파일 하도록 하겠습니다. 그리고 뒤에서는이를 활용해서 성능 측정을 해보도록 하겠습니다.


# git clone git@github.com:netlox-dev/iperf_ssl.git
# cd iperf_ssl
# ./autogen.sh
# ./build.sh /home/netlox/source/ssl

iperf를 실행하기 위해서는 기존의 일반적인 방법을 따르지만 kTLS 활성화를 위한 몇 가지 추가 옵션이 필요 합니다.

Server Mode
# src/iperf  iperf --tls=v1.2 --ktls -s

Client Mode 
# src/iperf --tls=v1.2 --ktls -c <ip> -t 60 -i 1

여기 까지는 DPU 가 아닌 일반적인 NIC 을 사용할때의 절차이고, DPU(본 블로그에서는 Mellanox BF2 기준)를 사용시는 다음과 같이 인터페이스에 옵션을 설정하여 하드웨어 오프로딩을 활성화해야 합니다.

# ethtool -K <interface-name> tls-hw-tx-offload on
# ethtool -K <interface-name> tls-hw-rx-offload on

커널 레벨의 kTLS 통계도 다음 명령어를 통해 확인할 수 있습니다.

Kernel kTLS stats :
# cat /proc/net/tls_stat

Offloaded kTLS stats :
# ethtool -S <interface-name> | grep tls


결론

 

본 게시물에서는 DPU 를 통한 kTLS 의 하드웨어 오프로딩 시 약 2배 정도의 TLS 대역폭 성능 향상을 확인할 수 있습니다. 하지만 이러한 이점에도 불구하고, 클라우드 네이티브 아키텍처에서는 모든 마이크로 서비스 계층에서 SSL/TLS/mTLS를 사용하여 플랫폼에 과도한 부담을 주지 않도록 마이크로 서비스를 신중하게 설계할 필요가 있습니다. 유즈 케이스가 프라이빗 클라우드인지 퍼블릭 클라우드인지, 애플리케이션의 유형인지와 같은 여러 가지 요소를 고려해야 합니다. 다음 블로그에서는 NetLOX 의 LOXILIGHT 을 활용하여, Kubernetes 의 Nginx Ingress Controller TLS/SSL 기능을 하드웨어로 오프로딩 하는 방안에 대하 알아 보겠습니다. 그리고 이와 함께, 대역폭 성능 효과 뿐만 아니라 지연시간, CPU 자원 사용률등 세부적인 분석을 해보도록 하겠습니다.











조회수 277회댓글 0개

최근 게시물

전체 보기