- QUIC와 HTTP/3 트래픽 비중이 커지면서 mitmproxy 11은 HTTP/3를 기본 활성화해 최신 웹 트래픽 분석 범위를 넓힘
- 투명 프록시와 리버스 프록시뿐 아니라 WireGuard와 local mode에서도 HTTP/3가 동작해 다양한 캡처 환경에 적용 가능함
- Chrome은 QUIC에서 사용자가 추가한 Certificate Authority를 신뢰하지 않아 공개 신뢰 인증서, 명령줄 스위치, HTTP/2 폴백 중 하나를 선택해야 함
- DNS 구현은 Hickory DNS 기반으로 바뀌며 A/AAAA 외 쿼리, HTTPS records, DNS-over-TCP, hosts 파일 제어, ECH 키 제거를 다룸
- ECH 같은 프라이버시 기능은 중간자 프록시의 인증서 생성 흐름을 어렵게 만들지만, mitmproxy는 DNS 응답 조정으로 동작 가능성을 유지함
HTTP/3 지원 범위
- mitmproxy 11은 HTTP/3를 투명 프록시와 리버스 프록시 모드에서 지원함
- 리버스 프록시에서는 하나의 mitmproxy 인스턴스가 TCP와 UDP 패킷을 모두 수신하고, 전달되는 HTTP 버전을 처리함
- 예시 명령:
mitmproxy --mode reverse:https://http3.is
- 예시 명령:
- WireGuard와 local mode에서도 HTTP/3를 사용할 수 있음
- 예시 명령:
mitmproxy --mode wireguard mitmproxy --mode local
- 예시 명령:
- Firefox, Chrome, 여러 cURL 빌드와 다른 클라이언트로 테스트해 호환성 문제를 줄임
- HTTP/3 지원 작업은 2022년에 Manuel Meitinger와 Maximilian Hils가 시작했으며, mitmproxy 11에서 기본 활성화됨
Chrome의 QUIC 인증서 제약
- 현재 알려진 주요 제한은 Chrome이 QUIC에서 사용자가 추가한 Certificate Authority를 신뢰하지 않는다는 점임
- Chrome에서 HTTP/3 트래픽을 다루려면 다음 중 하나가 필요함
- Let’s Encrypt 같은 공개적으로 신뢰되는 인증서 제공
- Chrome을 관련 명령줄 스위치와 함께 실행
- HTTP/2로 폴백되는 동작 수용
- Firefox는 이와 같은 동작을 하지 않음
- HTTP/3 문제 해결 팁은 #7025에서 확인할 수 있음
Hickory DNS 기반 재구현
- DNS HTTPS records와 Encrypted Client Hello(ECH) 같은 프라이버시 기능이 등장하면서 mitmproxy의 DNS 처리 중요도가 커짐
- 기존 DNS 구현은
getaddrinfo를 사용했기 때문에 한계가 있었음- IPv4와 IPv6 주소용 A/AAAA 쿼리만 지원함
- HTTP/3 지원을 알리는 HTTPS records 같은 쿼리에 응답할 수 없었음
- mitmproxy 11은 DNS 지원을 Rust 기반 DNS 라이브러리인 Hickory DNS 위에 다시 구현함
- Hickory를 통해 Windows, Linux, macOS에서 운영체제의 기본 네임서버를 얻고, A/AAAA가 아닌 쿼리를 해당 네임서버로 전달함
- 새
dns_name_servers옵션으로 전달 대상 네임서버를 지정할 수 있음mitmdump --mode dns --set dns_name_servers=8.8.8.8
hosts 파일 제어와 DNS-over-TCP
- Hickory 전환과 함께 시스템 hosts 파일을 무시하는 옵션이 추가됨
- 새
dns_use_hosts_file옵션을 사용하면 Linux의/etc/hosts같은 hosts 파일 반영 여부를 제어할 수 있음 - mitmproxy의 내부 DNS 해석도 Hickory로 옮길 계획이며, 이후에는 같은 머신에서 특정 도메인을 투명 리디렉션할 때 이 기능이 유용해짐
- 현재는 hosts 파일을 항상 고려하기 때문에 같은 머신 리디렉션 설정에서 mitmproxy가 자기 자신으로 재귀 연결될 수 있음
- 예시 동작:
echo "192.0.2.1 mitmproxy.org" >> /etc/hosts mitmdump --mode dns dig @127.0.0.1 +short mitmproxy.org 192.0.2.1 mitmdump --mode dns --set dns_use_hosts_file=false dig @127.0.0.1 +short mitmproxy.org 3.161.82.13 - DNS는 기본적으로 UDP를 사용하지만, 단일 UDP 패킷에 들어가지 않는 레코드를 처리할 때 TCP가 필요할 수 있음
- mitmproxy 11은 임의 쿼리 타입을 지원하면서 메시지 크기와 TCP 처리의 중요도가 커졌고, DNS-over-TCP도 동작함
ECH 키 제거와 인증서 생성
- mitmproxy는 사용자 지정 인증서가 없을 때 TLS ClientHello의 Server Name Indication(SNI) 를 사용해 유효한 인증서를 구성함
- SNI가 없으면 클라이언트가 신뢰할 인증서를 생성하지 못할 수 있음
- Encrypted Client Hello(ECH)는 클라이언트가 DNS HTTPS records로 ECH 키를 얻은 뒤, 초기 ClientHello 핸드셰이크 메시지를 그 키로 암호화하는 방식임
- DNS 쿼리와 핸드셰이크가 모두 암호화되면 수동 중간자는 대상 도메인을 알 수 없고, 대상 IP 주소만 확인할 수 있음
- 공유 호스팅과 Content Delivery Networks에서는 IP 주소만으로 대상 도메인을 확정하기 어려움
- 이 프라이버시 개선은 mitmproxy의 인증서 생성 방식과 충돌함
- mitmproxy 11은 HTTPS records에서 ECH 키를 제거해 인증서 생성에 필요한 도메인 정보를 확보함
- 클라이언트는 초기 핸드셰이크 메시지를 암호화할 키를 얻지 못함
- mitmproxy는 대상 도메인을 파악하고 일치하는 인증서를 구성할 수 있음
- ECH는 mitmproxy 사용을 더 어렵게 만들 수 있지만, 웹 전반의 프라이버시를 높이는 변화로 볼 수 있음