- O Traefik é famoso em ambientes de contêineres, mas pode ser implantado como um único executável em Go, permitindo operá-lo como proxy reverso mesmo sem um mecanismo de contêineres
- Em vez de seguir a linha de nginx/caddy/apache2 voltada a servir arquivos, ele é um proxy mais próximo do HAProxy, com foco em encaminhar requisições, devolver respostas e ajustar cabeçalhos
- Mesmo sem usar labels do Docker, ele pode ser configurado com o provider de arquivo, separando configuração estática e dinâmica para gerenciar roteadores, serviços e middlewares
- Suporta TLS Passthrough e entrada/saída do PROXY protocol do HAProxy, mas o PROXY protocol também precisa ser suportado pelo serviço de destino; apache2 e nginx oferecem esse suporte
- Para integração de autenticação e bloqueio por user-agent ou IP, os recursos nativos podem não bastar; é preciso avaliar também a carga de gestão de ForwardAuth, oauth2-proxy e plugins de terceiros
Traefik também pode ser usado fora de contêineres
- Nos últimos anos, o Traefik ganhou popularidade no universo de vídeos de home lab no YouTube e costuma ser apresentado junto com infraestrutura de contêineres como Docker ou Kubernetes
- Em termos de funcionalidade, ele é mais próximo do HAProxy do que de nginx/caddy/apache2
- Encaminha requisições para serviços e devolve as respostas
- Pode modificar cabeçalhos e partes da requisição e da resposta
- Não oferece suporte a servir arquivos
- Em ambientes de contêineres, o próprio Traefik também pode rodar em contêiner e montar o socket do Docker para detectar automaticamente outros contêineres
- O comportamento do proxy pode ser configurado por meio de labels do Docker nos contêineres
- Ao detectar um novo contêiner, ele pode solicitar automaticamente certificados TLS do Let’s Encrypt e expor o serviço
Binário único e implantação com systemd
- O Traefik é escrito em Go e compilado como um arquivo executável único
- A distribuição binária pode ser obtida na documentação de instalação do Traefik
- É possível executar tanto o próprio Traefik quanto os serviços de destino sem nenhum mecanismo de contêineres
- Há um exemplo de unit de serviço systemd no repositório do Traefik
- Em operação real, além do arquivo de configuração, também é necessário criar um usuário dedicado e ajustar as permissões do arquivo de configuração
Configuração baseada em arquivo
- Sem contêineres, não é possível usar labels do Docker, mas o Traefik pode ser configurado com o provider de arquivo
- A configuração se divide em duas grandes partes
- Configuração estática: define provedores de certificado como Let’s Encrypt e os entrypoints, isto é, as portas em que o Traefik escuta
- Configuração dinâmica: define roteadores, serviços e middlewares
- O Traefik consegue detectar eventos no sistema de arquivos e fazer hot reload da configuração dinâmica
- A documentação fornece os conceitos principais e exemplos de configuração para cada forma de uso
- Termos como certificate provider, entrypoint, router, service e middleware podem ser consultados rapidamente na documentação do Traefik
Comportamento após a configuração e depuração
- Quando a configuração está incorreta, o Traefik exibe avisos
- O log padrão não é muito verboso, mas facilita entender por qual caminho cada requisição passou
- Há relato de uso dizendo que a configuração inicial foi concluída rapidamente e que não houve problemas inesperados
TLS Passthrough e PROXY protocol
- O Traefik oferece suporte a TLS Passthrough
- O proxy pode encaminhar o tráfego para um serviço web que fornece seu próprio certificado TLS, sem encerrar o TLS no próprio proxy
- Também é possível montar uma configuração em que o serviço solicita diretamente um certificado do Let’s Encrypt mesmo passando pelo Traefik
- O proxy não consegue ver o conteúdo que está sendo encaminhado
- Em hospedagem virtual comum, a escolha do host é feita pelo cabeçalho HTTP
Host, mas no TLS Passthrough esse cabeçalho fica dentro do conteúdo criptografado e não pode ser usado - O host de destino é escolhido pelo SNI (Server Name Indication) do TLS, abordagem usada pelo Traefik e por vários servidores web e proxies
- Também há suporte a entrada e saída do PROXY protocol do HAProxy
- É uma forma de repassar ao serviço de destino informações que se perdem quando o usuário chega primeiro ao proxy
- É considerado mais fácil de tratar com segurança do que os cabeçalhos
X-Forwarded-...tradicionais - O serviço de destino também precisa suportar PROXY protocol
- apache2 e nginx suportam esse recurso, e a lista de serviços compatíveis vem crescendo
Limitações que ainda incomodam na integração de autenticação
- No nginx, é possível usar o Vouch Proxy para proteger alguns serviços com Azure AD, hoje chamado de autenticação Microsoft Entra
- O Traefik suporta ForwardAuth, semelhante ao mecanismo de autenticação do nginx
- O Vouch Proxy ainda não funciona com o Traefik, e há uma issue aberta sobre isso
- É possível operar uma instância própria do Keycloak e integrá-la ao AAD para uso com ForwardAuth, mas a configuração inicial e a carga de manter segurança e atualizações são altas
- O traefik-forward-auth é frequentemente recomendado, mas a última atualização foi em junho de 2020 e seriam necessárias atualizações de dependências, o que levou à conclusão de que ele é difícil de adotar
- O oauth2-proxy deixou uma impressão ruim em experiências anteriores, e colocar mais um proxy atrás de outro aumenta a chance de erros, porque HTTP/2·HTTP/3, timeout, tamanho de corpo e configuração de WebSocket precisam ser ajustados em cada proxy intermediário
- Segundo a atualização de 2024-05-06, o oauth2-proxy também pode ser integrado por HTTP API
- Suporta auth_request do nginx
- Suporta ForwardAuth do Traefik
- Essa abordagem parece mais próxima da configuração desejada
Bloqueio por user-agent e IP
- Há casos em que não se deseja que serviços internos sejam arquivados pelo archive.org
- robots.txt e cabeçalhos semelhantes não funcionam para bloquear o Archive.org; as formas de bloquear crawlers são barrar o user-agent
archive.org_botou bloquear faixas de IP - Para bloquear user-agent ou endereço IP no Traefik, é necessário usar plugins de terceiros, não recursos nativos
- Plugin para bloquear user-agent
- Plugin deny IP
- Plugins de terceiros exigem atenção a cada atualização e podem introduzir vulnerabilidades de segurança, por isso não são preferidos
- Também é possível usar o middleware IPAllowList para permitir tudo, exceto os IPs que se deseja bloquear
- Também é possível calcular faixas de IP
- Não é pior do que bloquear diretamente, mas não é elegante, porque ao olhar apenas para as sub-redes restantes fica difícil entender quais faixas foram bloqueadas
Exemplo de organização da configuração
- O exemplo divide a configuração entre
/etc/traefik/traefik.ymle/etc/traefik/dynamic.yml - A configuração estática define o seguinte
- entrypoints
:80e:443 - Redirecionamento de todo endpoint HTTP para HTTPS sem exceções
- Emissão de certificados Let’s Encrypt usando TLS challenge
- Monitoramento do arquivo de configuração dinâmica
/etc/traefik/dynamic.yml
- entrypoints
- A configuração dinâmica inclui o seguinte
- Roteamento TCP com TLS Passthrough para
cloud.xx.xyz - Encaminhamento para o serviço
10.33.1.2:4433em outro host - Ativação do PROXY protocol version 2
- Para
git.xx.xyz, encerramento de TLS e proxy parahttp://127.0.0.1:3000 - Middleware que redireciona
https://xx.xyz/redirmeplsparahttps://google.com - Middleware que adiciona o cabeçalho
X-Robots-Tag: noindex, nofollow, nosnippet, noarchive
- Roteamento TCP com TLS Passthrough para
1 comentários
Comentários do Hacker News
O Traefik é bem bom, mas sofre de um problema terrível parecido com o do Ansible. Tem muita documentação e muitos textos, mas você não consegue encontrar o que precisa
Eu uso desde a v1 e, mesmo assim, frequentemente me perco na documentação e fico bem frustrado. Para projetos pequenos, acabo usando o Caddy, porque a documentação não é tão ruim quanto a do Traefik
Falando com redatores de documentação técnica: documentação centrada em exemplos só é boa para iniciantes que estão dando uma olhada. Para quem já conhece o produto, o que se precisa é de documentação de referência e listas completas, não descrições de campos espalhadas por 10 páginas de tutorial. Não foquem só no processo de onboarding; é preciso pensar em quem usa o produto todos os dias
Essa é a parte que mais me incomoda, o motivo de eu ter passado a detestar tanto o Ansible, e o Traefik é parecido, embora em menor grau
Parte-se da suposição de que você só vai fazer tarefas muito simples em estruturas de dados bem planas, mas a maior parte da realidade não é assim. Para usar esse tipo de linguagem direito, você precisa entender todo um conjunto de regras implícitas sobre como escrever YAML, mas a documentação quase nunca toca nisso
Existe documentação da configuração específica de cada módulo, mas quase nunca fica claro como usar a configuração padrão, como lidar com os dados retornados ou combiná-los com algo minimamente mais complexo. A sensação é de jogarem uma dúzia de exemplos de um parágrafo para cada item como um monte de ingredientes e mandarem você assar um bolo
Tive praticamente a mesma experiência em vários sistemas de interpretador de YAML que usei; só consegui fazer as coisas depois de passar por centenas de milhares de linhas de YAML, mas a documentação tinha pouco valor além de uma lista de configurações
Ainda assim, encontrei um fluxo de trabalho bem razoável usando
ansible-doc, e meus aliases mais usados sãoalias adl='ansible-doc --list',alias adls='ansible-doc --list | less -S',alias ad='ansible-doc'Primeiro faço uma busca rápida por comandos relacionados com
adls, depois consulto a documentação comade quase sempre pulo direto para o fim (G) para ver os exemplos. Normalmente a resposta de que preciso está aliEscrever scripts de Ansible depende muito da documentação, então acho que, no estado padrão, ele deveria dar mais suporte a esse processo de consulta e oferecer uma interface em que fosse rápido encontrar as coisas sem precisar criar um monte de aliases
Claro, o projeto é deles, mas ter que vasculhar páginas longas de prosa toda vez que se quer encontrar um método de um objeto é complicado. Às vezes, é mais fácil simplesmente ler o código-fonte
Usei o Traefik em produção por 2 anos. Antes usava NGINX, mas decidi migrar para o Traefik por causa da integração automática com Let's Encrypt e me arrependo dessa decisão
A documentação do Traefik não faz muito sentido para mim e para a minha equipe. É complicada e se comporta de forma estranha, sem logs decentes
Por exemplo, quando tenta recriar certificados, falha de forma intermitente e a produção cai sem que se saiba quando vai se recuperar. Estou voltando para o NGINX
configuration.nix, e por baixo ele usalego(1)e letsencryptsecurity.acme = { acceptTerms = true; defaults.email = "admin-email@provider.net"; certs."mydomain.example.com" = { domain = "*.mydomain.example.com"; dnsProvider = "cloudflare"; environmentFile = "/path/to/cloudflare/password"; }; };services.caddy.enable = true;services.caddy.virtualHosts."subdomain1.mydomain.example.com" = { extraConfig = '' reverse_proxy 127.0.0.1:1234 ''; useACMEHost = "mydomain.example.com"; };Configurar com nginx provavelmente seria bem parecido. https://github.com/go-acme/lego
Era o mesmo registrador de domínio, a mesma API, a mesma configuração de Docker, e eu também ativei todos os logs, mas não havia nenhuma informação sobre por que o certificado não estava sendo criado. Simplesmente voltava para o certificado padrão gerado, como se nem tivesse tentado
Depois de duas sessões de troubleshooting e várias horas de busca, desisti e não tive opção além de usar um arquivo de certificado autoassinado. É muito frustrante não ter informação nenhuma sobre o motivo, falhar em silêncio e depois partir para um comportamento alternativo
No geral, esse foi o maior problema do Traefik. Quando funciona, é excelente, mas quando não funciona, sempre foi difícil resolver o problema ou encontrar na documentação a informação necessária. A empresa deve começar a usar Traefik em produção no fim do ano, então espero me familiarizar mais com o Traefik antes disso
O melhor é que não existe linguagem de configuração. É só usar Go
Depois descobri que, se o DNS não estiver configurado corretamente, após N tentativas de validação fracassadas o Let's Encrypt passa a recusar novamente a validação TLS-01 por um tempo, e o problema que você enfrentou parece ser desse tipo
Depois que migrei para a validação DNS-01, a experiência melhorou de repente e muito. Também dá para gerar certificados para serviços não expostos publicamente, e a orquestração necessária é bem menor do que com TLS-01
Se o provedor de DNS for decente, mesmo quando há problema é mais provável receber um erro de API antes que o Let's Encrypt tente validar o registro, e o estado de falha acontece muito antes do recuo por falha de verificação do Let's Encrypt. Agora estou praticamente decidido a usar só validação baseada em DNS-01 com Let's Encrypt, seja com Traefik, Caddy, Nginx ou outro proxy reverso, e se eu tiver de usar TLS-01, vou sempre conferir desde o início com a API de Staging se está tudo ajustado corretamente
Como observação, quando o Traefik cria um certificado de Staging do Let's Encrypt, não há uma boa forma de invalidar esse certificado. É preciso mexer no ACME JSON para remover o certificado e reiniciar o Traefik para refletir a mudança. Talvez dê com
SIGHUP, mas nunca tenteiNo geral há muitas falhas silenciosas e comportamentos estranhos, mas a maior dor é tornar opacos os erros dos serviços dos quais ele depende
Em vez de Traefik, uso Caddy. Para mim, é muito mais fácil gerenciar um Caddyfile do que a configuração em YAML do Traefik, e mantenho Caddyfiles separados para deploy local, produção e on-premises
Também há muitos plugins excelentes, e usamos o plugin WAF coraza para Caddy, que funciona bem
Tem tudo de que eu precisava e é muito mais simples
https://github.com/lucaslorentz/caddy-docker-proxy
Coisas como como lidar com armazenamento local ao usar armazenamento externo. Dizem que pode ser tratado como stateless, mas talvez não seja
No fim, você só pode torcer para que a pessoa que criou o módulo necessário saiba realmente o que está fazendo. Também não existe padrão de documentação por lá. Os mantenedores precisam impor limites a módulos aleatórios que oferecem funcionalidade central sem documentação nenhuma, como um backend de armazenamento S3
Se a necessidade for modesta, como alguns hosts Docker e algumas dezenas de contêineres, fico me perguntando qual seria o motivo para usar Traefik em vez de nginx. Eu uso https://github.com/NginxProxyManager/nginx-proxy-manager; será que o Traefik traz alguma vantagem nessa escala pequena?
Também tem o fato de que eu não gosto da sintaxe do nginx e o Traefik me pareceu mais atraente. Entrei por causa da renovação do Let's Encrypt e dos contêineres, e continuei usando por causa da forma de configurar
Acho que eu só consideraria migrar no momento em que passasse a precisar de algum recurso que o Traefik oferece e o Nginx não
Também acho meio estranho que Let's Encrypt automático seja tratado como ponto de venda, já que o Certbot está em todo lugar e cobre mais cenários. Para mim, os pontos de venda do Traefik e do Caddy não convencem muito, porque eles não tornam isso mais fácil do que alternativas já amplamente suportadas
Há algumas semanas eu estava escolhendo um proxy reverso e acabei optando pelo Caddy por causa da simplicidade. Ainda assim, a descoberta automática de contêineres e a referência a labels do Traefik são bem legais, e o Caddy também tem um plugin que faz a mesma coisa
Li o artigo, mas ainda não estou convencido de que o Traefik seja melhor para mim do que o Caddy. Pode ser que seja para outras pessoas, então gostaria de ouvir opiniões
Também vale destacar que o Traefik vem configurado por padrão no K3s. Graças a isso, o K3s virou a forma mais rápida de subir um cluster K8s para testes, e também permite tratar o cluster como gado
Basta adicionar o deployment e os serviços relacionados como NodePort, e você consegue acessar o app sem se preocupar com o controlador de ingress
Eu subo clusters K3s com um script de shell e testo, quando preciso, o app indicado como argumento posicional. Nisso eu aproveito o registro temporário de contêineres do ttl.sh. Quando o mesmo script termina, o cluster também é removido
Estou pensando em migrar meu proxy reverso de self-hosting para o Traefik. Diferente do autor, eu rodo workloads conteinerizados com Docker Compose e hoje uso Caddy junto com o excelente plugin caddy-docker-proxy
O que tenho hoje é um proxy reverso configurado por labels do Docker, detecção automática de novos workloads, certificados TLS e configuração automática de DNS por meio do plugin caddy-dynamicdns. Mesmo que o provedor me dê outro IP, não preciso me preocupar muito em perder acesso
Só que, toda vez que um novo workload é adicionado ou reiniciado, o Caddy inteiro reinicia e o acesso cai temporariamente. O Caddy não consegue transferir as conexões existentes para a nova instância
Além disso, usar certificados wildcard ainda não é simples o bastante. Eu uso wildcard porque não quero que todos os workloads fiquem expostos ao mundo pelos logs de transparência de certificados, mas aí não dá para usar a sintaxe simples do Caddyfile com um certificado por hostname. Sei que isso está sendo trabalhado no Caddy, mas por enquanto ainda é assim
De qualquer forma, já usei Traefik em ambiente k8s e achei bem bom, então estou pensando em experimentar também no uso pessoal. Só não queria que isso desencorajasse alguém de testar o Caddy. O Caddy também é realmente muito bom
localtest.mejunto com hostnamesVale a pena testar. Os dois são excelentes, cada um em uma área diferente
Na verdade, nem preciso de plugin. Tenho um playbook Ansible que configura tudo isso na VM e até cria os templates dos arquivos compose, e outro playbook que remove tudo do servidor, exceto os dados e os mounts. Para backup, uso scripts personalizados e restic para salvar arquivos, vários bancos de dados etc. em vários lugares
Eu costumava implantar k3s, mas percebi que para self-hosting ele é exagerado e complexo demais. Eu só preciso implantar rápido e não lidar manualmente com certificados
Acabei de verificar localmente e está funcionando bem
Usei bastante Traefik, mas cansei de lidar com labels do docker-compose, camadas e um monte de linhas só para ter um único proxy reverso. Aí descobri o Caddy e nunca mais olhei para trás
Acho que talvez eu não fosse o público-alvo do Traefik. Tudo o que preciso é de um proxy reverso com HTTPS ativado ou talvez uma camada de autenticação básica. No Caddy, os dois cabem em uma linha, ficam super concisos e não existem camadas que eu ainda não entendo
Há anos uso o Traefik para tudo no meu self-hosting
Mas abandonei a descoberta dinâmica e os recursos de labels do Docker porque eram complicados demais e um saco de depurar
Em vez disso, gero arquivos de configuração estáticos com um mecanismo de templates. Quase todos os serviços seguem uma combinação de host/target/port, então é muito fácil criar as seções relacionadas, e fora o tratamento de TLS também não há middleware complexo. O autor do texto linkado parece ter seguido o mesmo caminho
A configuração é gerada com scripts do Ansible, depois copiada para a máquina onde o Traefik roda, e o Traefik monitora o diretório onde esses arquivos ficam e recarrega automaticamente quando há mudanças. Tem funcionado muito bem
Uso o Traefik em produção junto com contêineres, e o que eu mais gosto é que a configuração vai nas labels dos contêineres. Então quase nunca preciso mexer na configuração do próprio Traefik
A maior desvantagem é descobrir como diabos pronunciar o nome. Parece que se lê como o traffic normal, mas eu fico querendo chamar de algo como “trey-feek”
Vejo a combinação de Traefik com Docker Compose como um ótimo ponto para self-hosting de pequeno porte antes de crescer o bastante para ir para k8s, especialmente quando você tem menos servidores do que a quantidade que um control plane de alta disponibilidade do k8s costuma usar
A quantidade de caretas e risadas que recebi dos colegas foi enorme, e isso atrapalhou a adoção e o uso do produto
Nós chamávamos de “tray-feek”, o que ainda era aceitável, mas quando ligamos para o suporte oficial disseram que a pronúncia é exatamente igual à de “traffic” normal. Aí toda vez que você fala desse proxy saem frases do tipo “o traffic entra pelo load balancer público, e o balanceamento nativo do traffic manda o traffic para os pods do traffic”. Soa idiota, porque é idiota mesmo
Se não fosse assim, seria mais fácil fazer coisas legais como página de manutenção ou subir o contêiner no primeiro request depois de ficar inativo
Por isso estou pensando em criar um plugin que saiba onde os arquivos do compose ficam salvos e consiga ler direto dali
aeé o mais próximo deyouhi. Então meu palpite é Tryfik, ou então Trayfik. Se ofikfor europeu, talvez seja feek também