클라우드플레어 터널 + 트래픽 프록시 (Cloudflared tunnel + Traefik Proxy)
-
클라우드플레어 터널은 참 편리합니다.
별도의 포트를 노출할 필요도 없고, 클라우드 플레이어의 빠른 망을 통해서 빠르게 로딩할 수 있습니다.다만, 관련된 문서가 적어서 정보 찾기가 조금 힘들다는 것이 단점이지만, 시간이 해결해 줄 것이라고 믿습니다 ^^
아래는 제가 온몸비틀기를 한 결과물 입니다.
- 모든 구간에서의 통신 암호화는 중요하다.
- 클라우드플레어 역시 신뢰할 수 있지만, 별개의 문제다.
- 자체 서명 인증서는 Revoke등 관리하기가 까다롭다.
- 자체 서명 인증서는 또한 권위의 문제도 존재한다.
위와 같은 필요성으로 Traefik과 Cloudflare Tunnel을 사용해서
- Traefik 리버스 프록시로 ACME 프로토콜을 통해서 인증서를 발급하고
- Cloudflared로 연결한다.
현재, Traefik에서 SNI를 사용중입니다.
따라서 IP로 접속하면 HOST에 관한 정보를 전달해야하는데, 이 부분이 가장 힘들었습니다.정답은
'Origin Server Name': 'Hostname that cloudflared should expect from your origin server certificate.'
이 부분 이었습니다.
번역 하자면,
'원본 서버 이름': '클라우드플레어가 원본 서버 인증서에서 예상하는 호스트 이름입니다.'
인건데, 뭘 기대하나 싶었는데 이게 HOST를 전달하는 것이었습니다.
{ "ingress": [ { "hostname": "askfront.com", "id": "1", "originRequest": { "originServerName": "askfront.com" }, "service": "https://traefik" } ], "warp-routing": { "enabled": false } }
이렇게 잡아주면 됩니다.
Cloudflared도 docker-compose로 올렸고, Traefik도 docker-compose로 올렸습니다.
당연히, 같은 네트워크에 있고, Traefik에는 2개의 네트워크를 할당해서 분리했습니다.
같은 네트워크에 속한 부분이 있으니, 서비스 이름( 컨테이너 이름을 설정했다면, 컨테이너 이름) 과 포트로 통신할 수 있습니다.결과는 잘 됩니다. :)
어떻게 해결할 방법이 없어서 사설 인증서라도 적용하고No TLS Verify
옵션을 주었는데, 이제 정석대로 할수 있게 되어 마음이 편해졌네요.클라우드플레어는 정말... 잘 만들었는데 가끔씩 CLI로 확인해야 하는 것들이 있거나, API로만 접근 가능한 것이 있어서 불편할 때도 많네요...
혹시 Traefik 리버스 프록시를 사용하고, Cloudflare의 프록시와 방화벽을 사용하고 싶으나, 그냥 프록시를 걸면 오버헤드 때문에 망설이셨다면 한번 도전해 보세요 :)
혹시 클라우드 플레어 원본 IP를 복원해야 한다면, Traefik에 신뢰할 수 있는 프록시를 선언 하면 됩니다.
저는 가독성 때문에 toml을 사용합니다.
[entryPoints.websecure] address = ":443" [entryPoints.websecure.http3] advertisedPort = 443 [entryPoints.websecure.forwardedHeaders] trustedIPs = [ "173.245.48.0/20", "103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22", "141.101.64.0/18", "108.162.192.0/18", "190.93.240.0/20", "188.114.96.0/20", "197.234.240.0/22", "198.41.128.0/17", "162.158.0.0/15", "104.16.0.0/13", "104.24.0.0/14", "172.64.0.0/13", "131.0.72.0/22", "172.17.0.0/16", "172.18.0.0/16", "172.19.0.0/16", "172.20.0.0/16", "172.21.0.0/16", "172.22.0.0/16", "172.23.0.0/16", "172.24.0.0/16", "172.25.0.0/16", "172.26.0.0/16", "172.27.0.0/16", "172.28.0.0/16", "172.29.0.0/16", "172.30.0.0/16", "172.31.0.0/16" ]
저는 80포트로 들어오면 전부 443으로 308 리다이렉트 합니다.
따라서 제가 443 포트에 선언한websecure
에 대해서만 설정합니다."172.17.0.0/16", "172.18.0.0/16", "172.19.0.0/16", "172.20.0.0/16", "172.21.0.0/16", "172.22.0.0/16", "172.23.0.0/16", "172.24.0.0/16", "172.25.0.0/16", "172.26.0.0/16", "172.27.0.0/16", "172.28.0.0/16", "172.29.0.0/16", "172.30.0.0/16", "172.31.0.0/16"
이 부분은 도커 네트워크 대역입니다. 참고하세요.
혹시 Traefik에 대해 관심있으시면 제 깃허브에 코드를 전부 올려두었습니다.
확인 한번 해보실래요? github.com/navystack
참고 문서
- 관련 프로젝트로 IPranges 라는 프로젝트도 진행하고 있습니다.