Using HTTP/3 over QUIC on HAProxy
HAProxy를 이용한 HTTP/3 (QUIC) 설정 가이드
HAProxy를 이용한 HTTP/3 (이하 h3) 프로토콜을 설정하기 위한 가이드 입니다. HAProxy에서는 이전 버전부터 QUIC 프로토콜을 실험적으로 지원해 왔으며, 2022년 5월에 출시된 최신 LTS 버전인 2.6 버전에도 실험적 지원을 합니다.
OpenSSL 또한 QUIC을 정식지원 하지 않기 때문에 OpenSSL에서 QUIC 구현체에서 사용할 수 있는 API를 지원하기 위해 fork된 프로젝트인 QUICTLS 소스를 받아 설치해야 합니다. OpenSSL은 QUIC 구현체를 정식 지원하기 위한 로드맵을 발표했습니다. QUICTLS는 OpenSSL에서 정식으로 QUIC 프로토콜을 지원하기 전까지의 임시 솔루션으로써 사용할 수 있으며, OpenSSL에서 정식 지원을 할 때 까지 유지될 것이라고 합니다.
정식 지원하는 것이 아닌 만큼 가급적이면 프로덕션 환경이 아닌 개인 프로젝트 또는 테스트 환경으로만 설치해 보시는 것을 권장 드립니다.
이 가이드는 Rocky Linux 9.x 기준으로 작성되었으며, OpenSSL 및 HAProxy 설치에 필요한 종속 패키지들의 설치 과정은 SKIP 하도록 하겠습니다. 필요시 Source Install HAProxy 2.0 with TLS 1.3 on CentOS 7 – Umount Blog 문서를 참고해 주시기 바랍니다.
QUICTLS(OpenSSL) 설치
참고로 얘기 드리자면 CentOS 7.x, Rocky Linux 9.x 에서 테스트시 문제 없이 진행되지만 Rocky Linux 8.x 에서 Perl 관련 warning이 발생하며, warning을 무시하고 설치를 진행 후 h3 작동 테스트에서 정상작동을 하지 않았습니다. 또한 Perl 최신 버전을 설치하여 quictls 설치를 진행하면 warning은 발생하지 않지만 h3 작동 테스트시에는 여전히 정상작동 하지 않았습니다. 내부 환경에 의한 문제일수도 있기 때문에 직접 테스트 후 정상 작동한다면 댓글 부탁드립니다.
[root 10-19-12-241 /]# cd /usr/local/src/ [root 10-19-12-241 src]# git clone https://github.com/quictls/openssl [root 10-19-12-241 src]# cd openssl [root 10-19-12-241 openssl]# mkdir -p /opt/quictls/ssl [root 10-19-12-241 openssl]# ./Configure --libdir=lib --prefix=/opt/quictls [root 10-19-12-241 openssl]# make -j $(nproc) [root 10-19-12-241 openssl]# make install
HAProxy 설치 및 구성
HAProxy 설치
현재 최신 LTS 버전인 2.6.6 버전으로 설치를 진행하였습니다.
[root 10-19-12-241 /]# cd /usr/local/src/ [root 10-19-12-241 src]# http://www.haproxy.org/download/2.6/src/haproxy-2.6.6.tar.gz [root 10-19-12-241 src]# tar xvzf haproxy-2.6.6.tar.gz [root 10-19-12-241 src]# cd haproxy-2.6.6 [root 10-19-12-241 haproxy-2.6.6]# make -j $(nproc) \ TARGET=linux-glibc \ USE_LUA=1 \ USE_PCRE=1 \ USE_ZLIB=1 \ USE_SYSTEMD=1 \ USE_GZIP=1 \ USE_PROMEX=1 \ USE_QUIC=1 \ USE_OPENSSL=1 \ SSL_INC=/opt/quictls/include \ SSL_LIB=/opt/quictls/lib \ LDFLAGS="-Wl,-rpath,/opt/quictls/lib" [root 10-19-12-241 haproxy-2.6.6]# make install-bin
HAProxy 구성
quic을 위한 주요 구성 내용만 나열하도록 하겠습니다.
: vi /etc/haproxy/haproxy.cfg
frontend umount.net bind :80 bind :443 ssl crt /etc/haproxy/ssl/umount.net.pem alpn h2 bind quic4@:443 ssl crt /etc/haproxy/ssl/umount.net.pem alpn h3 http-request redirect scheme https unless { ssl_fc } http-response set-header alt-svc "h3=\":443\";ma=900;" default_backend umount.net
하이라이트되어 있는 4, 7번 라인이 중요합니다. 문서에 따르면 처음 요청은 h2로 접속하지만 그 이후의 요청은 h3가 된다고 합니다. alt-svc 헤더에서 ma 값을 900초로 설정하였습니다. 이 값은 매우 짧은 값으로, 정상 작동하는 것이 확인되면 원하는 만큼 길게 설정하셔도 무방합니다.
브라우저에서 HTTP/3 확인
위의 설정이 모두 마무리 되었으면 HAProxy를 재시작 하고 브라우저에서 확인해 보겠습니다. 브라우저를 키고 개발자 모드를 활성화 한 후 설정한 사이트에 접속하여 확인할 수 있습니다.
참고: HTTP/3 프로토콜은 UDP를 사용하기 때문에 방화벽에서 UDP/443 포트를 오픈해 주셔야 합니다.