캐디를 사용한 안전한 HTTP/3 실험

3518 단어 http3caddyapachequic

블리딩 에지 ​​문제



저는 QUIC documentation을 쓰고 있는데 사이트를 HTTP/3(QUIC 위에서 실행됨)로 사용할 수 있으면 좋겠다고 생각했습니다. 이것은 비교적 새로운 프로토콜이므로 몇 가지 친숙한 문제에 부딪혔습니다.

  • 도구: 내가 사용하고 있는 웹 서버(apache)는 HTTP/3 지원을 제공하지 않으며 현재 계획이 없습니다
  • .

  • 가동 시간: 문제의 페이지는 비교적 인기가 있으며 이것을 설정하는 동안 다운되는 위험을 감수하고 싶지 않습니다
  • .

    QUIC의 가능성



    운 좋게도 QUIC 전송 프로토콜의 세부 사항은 여기에서 우리에게 약간의 유연성을 제공합니다.
  • QUIC은 다른 기본 프로토콜(UDP와 TCP)을 사용하므로 Apache를 TCP 포트 443에 두고 UDP 포트에 역방향 프록시를 설정할 수 있습니다
  • .
  • 모든 HTTP/3 지원 브라우저는 QUIC를 시도하고 연결 오류가 발생하면 TCP(및 수정되지 않은 Apache 설정)로 폴백합니다
  • .

    해결책



    수정은 간단한 Caddy 리버스 프록시입니다. "바인딩 분할"을 허용하기 위해 도커 컨테이너에서 실행 중입니다. Caddy는 TCP 및 UDP 포트를 모두 바인딩하려고 하지만 UDP 포트만 제공할 수 있습니다. 컨테이너화는 컨테이너에서 둘 다 바인딩할 수 있는 유연성을 제공하지만 UDP 포트만 세상에 노출합니다.

    세부



    캐디 설치는 다음과 같습니다. "youruser "또는 "yoursite "자리 표시자로 표시된 몇 줄을 수정해야 합니다.

    설정:

    ### change as appropriate for your OS
    sudo snap install docker
    
    mkdir ~/caddy/
    mkdir ~/caddy/caddy_data
    mkdir ~/caddy/caddy_config
    

    ~/caddy/docker-compose.yaml :

    version: "3.7"
    
    services:
      caddy:
        container_name: caddy
        hostname: caddy
        image: caddy:2.4.6
        restart: unless-stopped
        ports:
          - "443:443/udp"
        volumes:
          - /home/youruser/caddy/Caddyfile:/etc/caddy/Caddyfile
          - /path/to/yoursite/fullchain.pem:/caddy.crt
          - /path/to/yoursite/privkey.pem:/caddy.key
          - /home/youruser/caddy/caddy_data:/data
          - /home/youruser/caddy/caddy_config:/config
        extra_hosts:
          - "host-gateway:172.17.0.1"
    
    volumes:
      caddy_data:
        external: true
      caddy_config:
    

    ~/caddy/Caddyfile :

    {
        auto_https off
        servers {
            protocol {
                experimental_http3
            }
        }
    }
    
    yoursite.com {
        tls /caddy.crt /caddy.key
        reverse_proxy * https://host-gateway {
            transport http {
                tls_insecure_skip_verify
            }
        }
    }
    


    시작:

    cd ~/caddy
    sudo docker-compose up -d
    ### tail the logs with `sudo docker logs -f caddy`
    


    광고 HTTP/3



    위는 UDP 포트 443에서 HTTP/3을 제공하는 리버스 프록시를 설정하지만 "실제"HTTP 서버에 광고할 때까지 아무것도 시도하지 않습니다. 다행스럽게도 이 사소한 구성이 프로덕션 서버에 필요한 유일한 변경 사항이었습니다.

    사이트에 대한 내VirtualHost Apache 구성에서:

    Header set alt-svc "h3=\":443\"; ma=3600, h3-29=\":443\"; ma=3600
    


    이는 "Alt-Svc:"헤더가 있는 HTTP/3 서비스(프로토콜의 "표준"및 "드래프트 29"버전 모두)를 알립니다. 이것이 적용되려면 아파치를 바운스해야 합니다.

    인증서 순환



    인증서 회전을 처리하려면 마지막으로 한 가지가 필요합니다. 위의 솔루션은 사이트 인증서와 키를 Caddy 컨테이너에 복사하지만 LetsEncrypt를 사용하는 경우 해당 인증서는 3개월 동안만 유효하며 매월 순환될 가능성이 높습니다. 컨테이너가 항상 상대적으로 최신 인증서를 캡처하는지 확인하기 위해 cron에서 다음을 실행합니다.

    ### bounce the reverse proxy every month
    39 0 25 * * cd /home/youruser/caddy && /path/to/docker-compose down && /path/to/docker-compose up -d
    


    Stephen Cleary CC 2.0의 표지 이미지

    좋은 웹페이지 즐겨찾기