- Traefik은 컨테이너 환경에서 유명하지만, 단일 Go 실행 파일로 배포할 수 있어 컨테이너 엔진 없이도 리버스 프록시로 운용할 수 있음
- 파일을 직접 서빙하는 nginx/caddy/apache2 계열보다 HAProxy에 가까운 프록시이며, 요청 전달·응답 반환·헤더 조정에 초점을 둠
- Docker 라벨을 쓰지 않아도 설정 파일 provider로 구성할 수 있고, 정적 설정과 동적 설정을 나눠 라우터·서비스·미들웨어를 관리함
- TLS Passthrough와 HAProxy의 PROXY protocol 입출력을 지원하지만, PROXY protocol은 대상 서비스도 지원해야 하며 apache2와 nginx는 지원함
- 인증 통합과 사용자 에이전트·IP 차단은 기본 기능만으로 부족할 수 있어, ForwardAuth·oauth2-proxy·서드파티 플러그인의 관리 부담까지 함께 판단해야 함
컨테이너 밖에서도 쓸 수 있는 Traefik
- Traefik은 최근 몇 년 동안 home-lab YouTube 영역에서 인기를 얻었고, 주로 Docker나 Kubernetes 같은 컨테이너 인프라와 함께 소개됨
- 기능 성격은 nginx/caddy/apache2보다 HAProxy에 더 가까움
- 요청을 서비스로 전달하고 응답을 반환함
- 헤더와 요청·응답의 일부를 수정할 수 있음
- 파일 서빙은 지원하지 않음
- 컨테이너 환경에서는 Traefik도 컨테이너로 실행하고 Docker 소켓을 마운트해 다른 컨테이너를 자동 감지할 수 있음
- 프록시 동작은 컨테이너의 Docker 라벨로 설정 가능함
- 새 컨테이너를 감지하면 Let’s Encrypt TLS 인증서를 자동 요청하고 서비스를 공개할 수 있음
단일 바이너리와 systemd 배포
- Traefik은 Go로 작성되어 단일 실행 파일로 컴파일됨
- 바이너리 배포판은 Traefik 설치 문서에서 받을 수 있음
- 컨테이너 엔진 없이 Traefik 자체와 대상 서비스를 모두 실행할 수 있음
- systemd 서비스 유닛 예시는 Traefik 저장소에 있음
- 실제 운영에서는 설정 파일 외에도 별도 사용자 생성과 설정 파일 권한 설정이 필요함
설정 파일 기반 구성
- 컨테이너를 쓰지 않으면 Docker 라벨을 사용할 수 없지만, Traefik은 파일 provider로 설정 가능함
- 설정은 크게 두 부분으로 나뉨
- 정적 설정: Let’s Encrypt 같은 인증서 공급자와 Traefik이 수신하는 포트인 엔트리포인트를 둠
- 동적 설정: 라우터, 서비스, 미들웨어를 둠
- Traefik은 파일 시스템 이벤트를 감지해 동적 설정을 핫 리로드할 수 있음
- 문서는 핵심 개념과 설정 예시를 각 방식에 맞춰 제공함
- certificate provider, entrypoint, router, service, middleware 같은 용어는 Traefik 문서에서 빠르게 확인할 수 있음
설정 후 동작과 디버깅
- 설정이 맞지 않을 때 Traefik은 경고를 표시함
- 기본 로그는 많지 않은 편이지만, 요청이 어떤 경로를 타는지 이해하기 쉬움
- 초기 구성은 빠르게 끝났고 임의의 문제도 겪지 않았다는 사용 경험이 있음
TLS Passthrough와 PROXY protocol
- Traefik은 TLS Passthrough를 지원함
- 프록시에서 TLS를 종료하지 않고, 자체 TLS 인증서를 제공하는 웹 서비스로 트래픽을 전달할 수 있음
- 서비스가 Traefik을 통과해 Let’s Encrypt 인증서를 직접 요청하는 구성도 가능함
- 프록시는 전달되는 내용을 볼 수 없음
- 일반적인 가상 호스트 선택은 HTTP
Host헤더로 이뤄지지만, TLS Passthrough에서는 해당 헤더가 암호화된 본문 안에 있어 사용할 수 없음 - TLS의 SNI(Server Name Indication) 로 대상 호스트를 선택하며, Traefik과 여러 웹 서버·프록시가 이 방식을 사용함
- HAProxy의 PROXY protocol도 입출력을 지원함
- 사용자가 먼저 프록시에 도달하면서 사라지는 정보를 대상 서비스에 전달하는 방식임
- 기존
X-Forwarded-...헤더보다 보안적으로 다루기 쉽다고 평가됨 - 대상 서비스도 PROXY protocol을 지원해야 함
- apache2와 nginx는 지원하며, 지원 서비스 목록도 늘고 있음
인증 통합에서 남는 아쉬움
- nginx에서는 Vouch Proxy를 사용해 일부 서비스를 Azure AD, 현재 Microsoft Entra 인증으로 보호하는 구성이 가능함
- Traefik은 nginx의 인증 방식과 비슷한 ForwardAuth를 지원함
- Vouch Proxy는 아직 Traefik에서 동작하지 않으며 관련 이슈가 열려 있음
- Keycloak 인스턴스를 직접 운영하고 AAD와 통합해 ForwardAuth에 사용할 수 있지만, 초기 설정과 보안 유지·업데이트 부담이 큼
- traefik-forward-auth는 자주 추천되지만, 마지막 업데이트가 2020년 6월이고 의존성 업데이트가 필요해 사용하기 어렵다고 판단함
- oauth2-proxy는 과거 경험이 좋지 않았고, 프록시 뒤에 또 프록시를 두면 HTTP/2·HTTP/3, 타임아웃, 본문 크기, WebSocket 설정을 중간 프록시마다 맞춰야 해 오류 가능성이 커짐
- 2024-05-06 업데이트에 따르면 oauth2-proxy는 HTTP API로도 통합 가능함
- nginx의 auth_request를 지원함
- Traefik의 ForwardAuth를 지원함
- 이 방식은 원하는 구성에 가까운 선택지로 보임
사용자 에이전트와 IP 차단
- 내부 서비스가 archive.org에 아카이브되는 것을 원하지 않는 상황이 있음
- robots.txt와 유사 헤더는 Archive.org 차단에 효과가 없으며, crawler 차단 방법은
archive.org_bot사용자 에이전트 차단 또는 IP 범위 차단임 - Traefik에서 사용자 에이전트나 IP 주소를 차단하려면 기본 기능이 아니라 서드파티 플러그인이 필요함
- 사용자 에이전트 차단 플러그인
- deny IP 플러그인
- 서드파티 플러그인은 업데이트 때 신경 써야 하고 보안 취약점을 만들 수 있어 선호하지 않음
- IPAllowList 미들웨어로 차단하려는 IP를 제외한 나머지를 허용하는 방식은 가능함
- IP 범위 계산도 가능함
- 직접 차단보다 나쁘지는 않지만, 남은 서브넷만 보고 어떤 범위가 차단됐는지 알기 어려워 우아하지 않음
설정 예시 구성
- 예시는
/etc/traefik/traefik.yml과/etc/traefik/dynamic.yml로 나뉨 - 정적 설정은 다음을 구성함
:80과:443엔트리포인트- HTTP 엔드포인트를 예외 없이 HTTPS로 리다이렉트
- TLS challenge를 사용하는 Let’s Encrypt 인증서 발급
- 동적 설정 파일
/etc/traefik/dynamic.yml감시
- 동적 설정은 다음 구성을 포함함
cloud.xx.xyz에 대한 TLS Passthrough TCP 라우팅- 다른 호스트의
10.33.1.2:4433서비스로 전달 - PROXY protocol version 2 활성화
git.xx.xyz에 대해 로컬http://127.0.0.1:3000으로 TLS 종료 후 프록시https://xx.xyz/redirmepls를https://google.com으로 리다이렉트하는 미들웨어X-Robots-Tag: noindex, nofollow, nosnippet, noarchive헤더를 추가하는 미들웨어