Traefik ile Docker Konteynerleri için Debian 9 Üzerinde Ters Proxy Kurulumu
Giriş
Günümüzün modern uygulama mimarilerinde, özellikle mikroservis tabanlı sistemlerde, servislerin yönetimi ve dış dünyaya güvenli bir şekilde sunulması kritik öneme sahiptir. Docker konteynerleri, uygulamaları izole ve taşınabilir birimler halinde paketleyerek bu süreci kolaylaştırırken, Traefik gibi bir ters proxy, bu konteynerlere gelen istekleri yönlendirme, yük dengeleme ve SSL/TLS sertifikalarını otomatik olarak yönetme gibi görevleri üstlenir. Bu makalede, Debian 9 işletim sistemi üzerinde Docker konteynerleri için Traefik’i nasıl bir ters proxy olarak kuracağımızı ve yapılandıracağımızı adım adım inceleyeceğiz.
Traefik, dinamik bir ters proxy ve yük dengeleyicidir. Konteynerleştirilmiş uygulamalarla (Docker, Kubernetes, Swarm, Mesos vb.) sorunsuz bir şekilde entegre olabilir ve yapılandırmalarını otomatik olarak keşfedebilir. Bu özelliği sayesinde, her yeni konteyner başlattığınızda veya durdurduğunuzda manuel yapılandırma yapmanıza gerek kalmaz. Ayrıca, Let’s Encrypt ile otomatik SSL sertifikası temini ve yenileme yeteneği, güvenlik yönetimini önemli ölçüde basitleştirir. Debian 9, kararlılığı ve yaygın kullanımı nedeniyle bu tür sunucu uygulamaları için ideal bir platform sunar.
Ön Gereksinimler
Bu rehbere başlamadan önce, aşağıdaki ön gereksinimlerin karşılandığından emin olmanız gerekmektedir:
Debian 9 Sunucu
SSH erişimi olan ve sudo yetkilerine sahip bir kullanıcı hesabı bulunan bir Debian 9 (Stretch) sunucuya ihtiyacınız olacaktır. Sunucunuzun güncel olduğundan emin olmak için aşağıdaki komutları çalıştırın:
sudo apt update
sudo apt upgrade -y
Docker ve Docker Compose Kurulumu
Traefik ve diğer uygulamalarımızı Docker konteynerleri olarak çalıştıracağımız için Docker Engine ve Docker Compose’un kurulu olması gerekmektedir. Eğer kurulu değilse, aşağıdaki adımları izleyerek kurabilirsiniz:
Docker Engine Kurulumu:
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
sudo usermod -aG docker $USER # Kullanıcınızı docker grubuna ekleyin
newgrp docker # Grubun hemen etkinleşmesi için
Kurulumun başarılı olup olmadığını kontrol etmek için:
docker run hello-world
Docker Compose Kurulumu:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Kurulumun başarılı olup olmadığını kontrol etmek için:
docker-compose --version
Alan Adı (Domain Name) ve DNS Yapılandırması
Traefik’in otomatik SSL sertifikalarını alabilmesi ve gelen istekleri doğru bir şekilde yönlendirebilmesi için bir alan adına ihtiyacınız olacak. Alan adınızın A kaydını, Debian 9 sunucunuzun genel IP adresine yönlendirdiğinizden emin olun. Örneğin, example.com ve www.example.com için.
Güvenlik Duvarı (Firewall) Ayarları (UFW)
Sunucunuzun güvenliği için bir güvenlik duvarı kullanmak önemlidir. UFW (Uncomplicated Firewall) Debian üzerinde yaygın olarak kullanılan bir araçtır. Traefik’in düzgün çalışabilmesi için 80 (HTTP) ve 443 (HTTPS) portlarının dışarıdan erişilebilir olması gerekmektedir. Ayrıca, Traefik Dashboard’a erişmek isterseniz 8080 portunu da açmanız gerekebilir, ancak bu portu sadece belirli IP’lerden erişime açmanız güvenlik açısından daha iyidir.
sudo apt install ufw -y
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
İsteğe bağlı olarak Traefik Dashboard için:
sudo ufw allow 8080/tcp # Traefik Dashboard (Sadece belirli IP'lerden erişime açılması önerilir)
sudo ufw enable
sudo ufw status
Traefik Nedir ve Neden Kullanmalıyız?
Traefik, modern bir ters proxy ve yük dengeleyicidir. Geleneksel ters proxylerden farklı olarak, Traefik dinamik bir yapıya sahiptir ve konteyner orkestrasyon platformları (Docker, Kubernetes vb.) ile doğrudan entegre olabilir. Bu entegrasyon, Traefik’in yeni servisleri otomatik olarak keşfetmesini ve yapılandırmasını sağlamakla kalmaz, aynı zamanda servisler kaldırıldığında veya güncellendiğinde de yapılandırmasını anında uyarlamasına olanak tanır.
Dinamik Yapılandırma
Traefik’in en güçlü özelliklerinden biri dinamik yapılandırma yeteneğidir. Bir Docker konteynerini başlattığınızda veya durdurduğunuzda, Traefik bunu otomatik olarak algılar ve yapılandırmasını günceller. Bu, özellikle mikroservis mimarilerinde veya sürekli dağıtım (CI/CD) süreçlerinde büyük bir zaman ve emek tasarrufu sağlar. Manuel olarak yapılandırma dosyalarını düzenleme veya proxy’yi yeniden başlatma ihtiyacını ortadan kaldırır.
Otomatik SSL (Let’s Encrypt)
Web siteleri ve uygulamalar için SSL/TLS sertifikaları artık bir standarttır. Traefik, Let’s Encrypt ile sorunsuz bir entegrasyon sunar. Belirttiğiniz alan adları için otomatik olarak sertifikaları alır, kurar ve süresi dolduğunda yeniler. Bu özellik, sertifika yönetimiyle ilgili karmaşıklığı ortadan kaldırır ve web uygulamalarınızın her zaman güvenli bir HTTPS bağlantısı üzerinden sunulmasını sağlar.
Basit Entegrasyon
Traefik, Docker konteynerleriyle entegrasyonu son derece kolaydır. Docker Compose dosyalarınıza ekleyeceğiniz birkaç etiket (labels) ile Traefik’in bir konteyneri nasıl yönlendireceğini, hangi alan adını kullanacağını ve hangi porttan hizmet vereceğini belirleyebilirsiniz. Bu, geliştiricilerin ve DevOps ekiplerinin Traefik’i projelerine hızlıca dahil etmelerini sağlar.
Yük Dengeleme
Birden fazla aynı uygulamanın çalıştığı durumlarda, Traefik gelen istekleri bu uygulamalar arasında dengeleyebilir. Bu, uygulamanızın daha yüksek trafik hacimlerini kaldırabilmesine ve yüksek erişilebilirlik sağlamasına yardımcı olur. Traefik, farklı yük dengeleme stratejilerini destekleyebilir.
Mikroservis Mimarileri için İdeal
Yukarıda bahsedilen tüm özellikler, Traefik’i mikroservis tabanlı uygulamalar için mükemmel bir seçim haline getirir. Her mikroservis kendi Docker konteynerinde çalışırken, Traefik bu servisler arasında bir köprü görevi görür, dışarıdan gelen istekleri doğru servislere yönlendirir ve güvenli bir iletişim katmanı sağlar.
Traefik Yapılandırmasına Başlangıç
Traefik’i kurmak ve yapılandırmak için bir dizin yapısı oluşturarak başlayacağız. Bu dizin içinde Traefik’in docker-compose.yml dosyası, statik yapılandırma dosyası ve Let’s Encrypt sertifikalarını depolayacağı dosya bulunacak.
Dizin Yapısı Oluşturma
Sunucunuzda Traefik için bir çalışma dizini oluşturalım:
mkdir traefik
cd traefik
docker-compose.yml Oluşturma
Bu dosya, Traefik servisini ve diğer Docker konteynerlerini tanımlayacağımız ana dosyadır.
nano docker-compose.yml
traefik.yml (Statik Yapılandırma) Oluşturma
Traefik’in temel ayarlarını (portlar, sağlayıcılar, Let’s Encrypt ayarları gibi) bu dosyada tanımlayacağız. Bu dosya, Traefik servisi başlatıldığında bir kez okunur.
nano traefik.yml
acme.json Oluşturma
Let’s Encrypt sertifikaları bu dosyada saklanacaktır. Traefik’in bu dosyaya yazma izinlerinin olması gerekmektedir. Güvenlik nedeniyle, bu dosyanın izinlerini kısıtlamamız önemlidir.
touch acme.json
chmod 600 acme.json
Traefik Servisinin Oluşturulması
Şimdi docker-compose.yml dosyamızı Traefik servisini içerecek şekilde düzenleyelim.
# traefik/docker-compose.yml
version: '3.8'
services:
traefik:
image: traefik:v2.9 # Traefik'in kararlı bir sürümünü kullanın
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "80:80" # HTTP istekleri için
- "443:443" # HTTPS istekleri için
# - "8080:8080" # Traefik Dashboard için, sadece geliştirme ortamlarında veya güvenli erişimle kullanın
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro # Traefik'in Docker'ı dinlemesi için
- ./traefik.yml:/etc/traefik/traefik.yml:ro # Statik yapılandırma dosyası
- ./acme.json:/etc/traefik/acme.json # Let's Encrypt sertifikaları için
networks:
- web
labels:
# Traefik Dashboard'ı etkinleştirme (isteğe bağlı)
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.rule=Host(traefik.example.com)" # Kendi alan adınızı kullanın
- "traefik.http.routers.traefik-dashboard.tls=true"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
# Dashboard'a erişimi güvenli hale getirme (önerilir)
- "traefik.http.routers.traefik-dashboard.middlewares=traefik-auth"
# Kullanıcı adı ve şifre ile basic auth middleware
# 'htpasswd -nb user password' komutu ile oluşturulur.
# Örneğin: echo $(htpasswd -nb admin your_strong_password)
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$XQ.W7J.J$$wY72z/pQ/K2d.dF2o3m01" # Kendi hash'inizi kullanın!
# HTTP'den HTTPS'ye yönlendirme (middleware)
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.routers.redirection.rule=HostRegexp({host:.+})"
- "traefik.http.routers.redirection.entrypoints=web"
- "traefik.http.routers.redirection.middlewares=redirect-to-https"
- "traefik.http.routers.redirection.service=noop@internal" # noop@internal, herhangi bir servise yönlendirmeyen özel bir servistir.
networks:
web:
external: true # Traefik ve uygulamaların aynı ağda olması için
docker-compose.yml Açıklamaları:
* image: traefik:v2.9: Traefik’in belirtilen sürümünü kullanır. Her zaman en güncel kararlı sürümü kullanmaya özen gösterin.
* container_name: traefik: Konteynerin adını belirler.
* restart: unless-stopped: Konteynerin bir hata durumunda veya sunucu yeniden başlatıldığında otomatik olarak yeniden başlamasını sağlar.
* ports: 80 ve 443 portlarını host makineye yönlendirir. Bu, HTTP ve HTTPS trafiğinin Traefik’e ulaşmasını sağlar. 8080 portu Traefik Dashboard için isteğe bağlıdır ve genellikle iç ağlardan erişim için kullanılır.
* volumes:
* /var/run/docker.sock:/var/run/docker.sock:ro: Traefik’in Docker API’sine salt okunur erişimini sağlar. Bu, Traefik’in Docker konteynerlerini keşfetmesini ve yapılandırmasını dinamik olarak güncellemesini sağlar.
* ./traefik.yml:/etc/traefik/traefik.yml:ro: Oluşturduğumuz statik yapılandırma dosyasını Traefik konteynerine bağlar. ro (read-only) ile salt okunur olarak bağlanır.
* ./acme.json:/etc/traefik/acme.json: Let’s Encrypt sertifikalarının depolanacağı dosyayı bağlar.
* networks: Traefik’in ve diğer uygulamaların iletişim kurabilmesi için bir Docker ağı tanımlarız. web adında bir ağ oluşturacağız.
* labels: Traefik’in kendisini yapılandırması için kullanılan dinamik yapılandırma etiketleridir.
* traefik.enable=true: Bu konteynerin Traefik tarafından yönetileceğini belirtir.
traefik.http.routers.traefik-dashboard.: Traefik Dashboard için bir yönlendirici (router) tanımlar. Belirttiğiniz alan adı (traefik.example.com) üzerinden HTTPS ile erişilebilir olmasını sağlar ve Let’s Encrypt kullanarak otomatik SSL sertifikası alır.
* traefik.http.routers.traefik-dashboard.middlewares=traefik-auth: Dashboard’a erişimi temel kimlik doğrulama (Basic Auth) ile korumak için bir middleware kullanır.
* traefik.http.middlewares.traefik-auth.basicauth.users: Basic Auth için kullanıcı adı ve şifre hash’ini içerir. Şifre hash’ini htpasswd -nb admin your_strong_password komutu ile oluşturmalısınız. Örneğin, admin kullanıcısı ve your_strong_password şifresi için admin:$apr1$XQ.W7J.J$wY72z/pQ/K2d.dF2o3m01 gibi bir çıktı alırsınız. Bu çıktıyı users değerine yapıştırmalısınız. Kendi güvenli şifrenizi kullanmayı unutmayın!
traefik.http.middlewares.redirect-to-https.: HTTP üzerinden gelen tüm istekleri otomatik olarak HTTPS’ye yönlendiren bir middleware tanımlar. Bu, web sitelerinizin her zaman güvenli bir bağlantı üzerinden erişilmesini sağlar.
Şimdi traefik.yml statik yapılandırma dosyamızı oluşturalım:
# traefik/traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
log:
level: INFO # DEBUG, INFO, WARN, ERROR, FATAL, PANIC
format: common # json, common
filePath: "/var/log/traefik.log" # İsteğe bağlı, logları dosyaya yazar
api:
dashboard: true # Traefik Dashboard'ı etkinleştirir
insecure: true # Dashboard'a HTTP üzerinden erişimi etkinleştirir (Sadece test için, üretimde önerilmez!)
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
domains:
- main: example.com # Ana alan adınız
sans:
- www.example.com # Alt alan adlarınız (varsa)
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false # Sadece 'traefik.enable=true' etiketine sahip konteynerleri işler
network: web # Traefik'in dinleyeceği Docker ağı
swarmMode: false # Docker Swarm kullanmıyorsanız false bırakın
certificatesResolvers:
letsencrypt:
acme:
email: your_email@example.com # Let's Encrypt bildirimleri için e-posta adresiniz
storage: acme.json # Sertifikaların depolanacağı dosya
httpChallenge:
entryPoint: web # HTTP-01 challenge için kullanılacak entrypoint
traefik.yml Açıklamaları:
* global: Traefik’in genel ayarlarını içerir.
* log: Log seviyesini ve formatını ayarlar. Sorun giderme için DEBUG seviyesini kullanabilirsiniz.
* api: Traefik API ve Dashboard ayarlarını içerir. dashboard: true ile Dashboard’ı etkinleştiririz. insecure: true ile Dashboard’a HTTP üzerinden erişimi etkinleştiririz, ancak bu üretim ortamlarında önerilmez. Genellikle insecure: false yapılır ve Dashboard’a sadece HTTPS üzerinden ve Basic Auth ile erişilir (yukarıdaki docker-compose.yml‘deki gibi).
* entryPoints: Traefik’in dinleyeceği portları ve protokolleri tanımlar.
* web: 80 numaralı portu dinler (HTTP). Gelen tüm HTTP isteklerini otomatik olarak websecure (HTTPS) entrypoint’ine yönlendirir.
* websecure: 443 numaralı portu dinler (HTTPS). TLS yapılandırmasını içerir ve Let’s Encrypt sertifika çözümleyiciyi kullanır.
* providers: Traefik’in yapılandırmaları nereden alacağını belirler.
* docker: Docker sağlayıcısını etkinleştirir. endpoint Docker soketini gösterir. exposedByDefault: false ile sadece açıkça Traefik etiketi verilen konteynerleri işler, bu da güvenlik için iyi bir uygulamadır. network: web ile Traefik’in hangi Docker ağını dinlemesi gerektiğini belirtiriz.
* certificatesResolvers: Sertifika çözümleyicilerini tanımlar.
* letsencrypt: Let’s Encrypt çözümleyicisini yapılandırır. email adresinizi ve storage dosyasını belirtirsiniz. httpChallenge.entryPoint: web ile Let’s Encrypt’in HTTP-01 doğrulama yöntemini kullanarak sertifika almasını sağlarız.
acme.json Dosyasının İzinleri:
Daha önce oluşturduğumuz acme.json dosyasının izinlerinin 600 olduğundan emin olun. Bu, sadece dosyanın sahibi olan kullanıcının bu dosyayı okuyup yazabileceği anlamına gelir ve sertifikaların güvenliğini sağlar.
chmod 600 acme.json
Docker Ağı Oluşturma:
docker-compose.yml dosyasında web adında bir ağ tanımladık. Traefik’i başlatmadan önce bu ağı oluşturmamız gerekiyor:
docker network create web
Şimdi Traefik servisini başlatabiliriz:
docker-compose up -d
Traefik konteynerinin çalıştığından emin olmak için:
docker ps
Ve logları kontrol etmek için:
docker logs traefik
Eğer her şey yolundaysa, traefik.example.com adresine HTTPS üzerinden erişmeye çalıştığınızda Traefik Dashboard’ı görmelisiniz (tabii ki kendi alan adınızla). Basic Auth ile giriş yapmanız istenecektir.
Örnek Docker Uygulaması Ekleme
Traefik’in nasıl çalıştığını göstermek için basit bir Nginx web sunucusu konteyneri ekleyelim. Bu Nginx konteyneri, Traefik aracılığıyla dış dünyaya açılacak ve kendi alan adına sahip olacaktır.
traefik dizininizde yeni bir app dizini oluşturalım ve içine bir docker-compose.yml dosyası koyalım:
mkdir app
cd app
nano docker-compose.yml
Aşağıdaki içeriği app/docker-compose.yml dosyasına yapıştırın:
# app/docker-compose.yml
version: '3.8'
services:
nginx-app:
image: nginx:latest
container_name: my-nginx-app
restart: unless-stopped
volumes:
- ./nginx/html:/usr/share/nginx/html:ro # Kendi web içeriğinizi buraya koyun
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.nginx-app.rule=Host(app.example.com)" # Kendi alan adınızı kullanın
- "traefik.http.routers.nginx-app.entrypoints=websecure"
- "traefik.http.routers.nginx-app.tls.certresolver=letsencrypt"
- "traefik.http.services.nginx-app.loadbalancer.server.port=80" # Nginx'in dinlediği port
networks:
web:
external: true
app/docker-compose.yml Açıklamaları:
* nginx-app: Nginx servisini tanımlar.
* image: nginx:latest: En son Nginx imajını kullanır.
* volumes: Nginx’in statik dosyalarını sunması için ./nginx/html dizinini konteyner içindeki /usr/share/nginx/html dizinine bağlarız.
* networks: Bu uygulama konteynerinin de Traefik ile aynı web ağına bağlı olması gerektiğini belirtiriz.
* labels: Traefik’in bu Nginx servisini nasıl yönlendireceğini belirtir.
* traefik.enable=true: Traefik’in bu servisi yönetmesini sağlar.
* traefik.http.routers.nginx-app.rule=Host(app.example.com): Gelen isteklerden app.example.com alan adına sahip olanları bu servise yönlendirir. Kendi alan adınızı kullanmayı unutmayın!
* traefik.http.routers.nginx-app.entrypoints=websecure: Bu servise sadece HTTPS (websecure) üzerinden erişilebileceğini belirtir.
* traefik.http.routers.nginx-app.tls.certresolver=letsencrypt: Bu alan adı için Let’s Encrypt aracılığıyla otomatik SSL sertifikası almasını sağlar.
* traefik.http.services.nginx-app.loadbalancer.server.port=80: Nginx konteynerinin içindeki 80 numaralı porttan hizmet verdiğini Traefik’e bildirir.
Nginx için basit bir HTML sayfası oluşturalım:
mkdir -p nginx/html
nano nginx/html/index.html
İçine aşağıdaki HTML kodunu yapıştırın:
Merhaba Traefik!
Bu sayfa Traefik aracılığıyla güvenli bir şekilde sunulmaktadır.
Şimdi bu Nginx uygulamasını başlatalım:
docker-compose up -d
Uygulama başlatıldıktan kısa bir süre sonra (Let’s Encrypt sertifikasının alınması birkaç dakika sürebilir), app.example.com adresine (kendi alan adınızla) HTTPS üzerinden eriştiğinizde Nginx’in sunduğu “Merhaba Traefik!” sayfasını görmelisiniz.
Traefik Dashboard Kullanımı
Traefik Dashboard, Traefik’in mevcut yapılandırmasını, yönlendiricileri, servisleri, middleware’leri ve sertifikaları görsel olarak izlemenizi sağlar. traefik.example.com (kendi alan adınızla) adresine giderek ve docker-compose.yml dosyasında ayarladığınız kullanıcı adı ve şifre ile giriş yaparak Dashboard’a erişebilirsiniz.
Dashboard’da şunları göreceksiniz:
* Routers: Tanımlanan tüm yönlendiricileri (örneğin traefik-dashboard, nginx-app) ve bunların kurallarını (Host) gösterir.
* Services: Traefik’in yönettiği tüm servisleri (örneğin nginx-app) ve bunların hangi portlarda çalıştığını gösterir.
* Middlewares: Tanımlanan tüm middleware’leri (örneğin traefik-auth, redirect-to-https) gösterir.
* Certificates: Let’s Encrypt tarafından alınan ve yönetilen tüm SSL/TLS sertifikalarını ve bunların durumunu gösterir.
Dashboard, Traefik yapılandırmanızın doğru çalışıp çalışmadığını kontrol etmek ve sorun gidermek için çok değerli bir araçtır.
Güvenlik ve İyileştirmeler
Traefik’i bir ters proxy olarak kullanırken güvenlik her zaman öncelikli olmalıdır. İşte bazı ek güvenlik ve iyileştirme önerileri:
Dashboard İçin Temel Kimlik Doğrulama (Basic Auth)
Yukarıdaki docker-compose.yml örneğinde Traefik Dashboard’ı Basic Auth ile koruduk. Bu, yetkisiz erişimi engellemek için önemli bir adımdır. htpasswd komutunu kullanarak güçlü bir şifre hash’i oluşturduğunuzdan emin olun ve bu şifreyi düzenli olarak değiştirin.
acme.json İzinleri
acme.json dosyası hassas sertifika bilgilerini içerir. Bu dosyanın izinlerinin 600 olduğundan emin olun (chmod 600 acme.json). Bu, sadece Traefik konteynerinin bu dosyayı okuyup yazabilmesini sağlar ve diğer kullanıcıların erişimini engeller.
Rate Limiting (Oran Sınırlama)
DDoS saldırılarını veya kötü niyetli taramaları önlemek için belirli bir IP adresinden gelen istekleri sınırlayabilirsiniz. Traefik, rateLimit middleware’i ile bu özelliği sunar. Örneğin:
# docker-compose.yml içindeki bir servisin etiketlerine ekleyin
- "traefik.http.middlewares.my-ratelimit.ratelimit.average=100" # Saniyede ortalama 100 istek
- "traefik.http.middlewares.my-ratelimit.ratelimit.burst=50" # Patlamada 50 isteğe kadar izin ver
- "traefik.http.routers.nginx-app.middlewares=my-ratelimit"
IP Kısıtlamaları
Belirli servislerinize sadece belirli IP adreslerinden erişilmesini isteyebilirsiniz. Traefik’in ipWhiteList middleware’i ile bunu yapabilirsiniz:
# docker-compose.yml içindeki bir servisin etiketlerine ekleyin
- "traefik.http.middlewares.my-ip-whitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.1"
- "traefik.http.routers.nginx-app.middlewares=my-ip-whitelist"
Bu, sadece belirtilen IP aralıklarından gelen isteklere izin verir.
TLS Ayarları
Traefik’in TLS yapılandırmasını daha güvenli hale getirebilirsiniz. Örneğin, sadece belirli TLS versiyonlarını veya şifreleme algoritmalarını kabul edebilirsiniz:
# traefik.yml içine ekleyin
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
Bu, daha eski ve zayıf TLS versiyonlarının veya şifreleme algoritmalarının kullanılmasını engeller.
HTTP Güvenlik Başlıkları
Traefik, headers middleware’i ile HTTP güvenlik başlıkları eklemenize olanak tanır. Örneğin, HSTS (HTTP Strict Transport Security) başlığı eklemek için:
# docker-compose.yml içindeki bir servisin etiketlerine ekleyin
- "traefik.http.middlewares.my-headers.headers.stsseconds=31536000"
- "traefik.http.middlewares.my-headers.headers.stspreload=true"
- "traefik.http.middlewares.my-headers.headers.stsincludeSubdomains=true"
- "traefik.http.routers.nginx-app.middlewares=my-headers"
Bu başlıklar, tarayıcılara sitenize her zaman HTTPS üzerinden bağlanmalarını emreder ve çeşitli web saldırılarına karşı koruma sağlar.
Sorun Giderme
Traefik kurulumu sırasında veya sonrasında sorunlarla karşılaşabilirsiniz. İşte yaygın sorunlar ve çözüm önerileri:
Logları Kontrol Etme
Herhangi bir sorunla karşılaştığınızda ilk yapmanız gereken Traefik konteynerinin loglarını kontrol etmektir:
docker logs traefik
Loglar, sertifika alma hataları, yapılandırma sorunları veya ağ bağlantısı problemleri hakkında önemli ipuçları verebilir.
Güvenlik Duvarı
80 ve 443 portlarının güvenlik duvarınızda açık olduğundan emin olun. UFW kullanıyorsanız:
sudo ufw status
Gerekirse portları açın ve UFW’yi yeniden yükleyin:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
DNS Ayarları
Alan adınızın A kaydının sunucunuzun doğru IP adresine işaret ettiğinden emin olun. DNS değişikliklerinin yayılması biraz zaman alabilir (genellikle birkaç dakika ila birkaç saat). dig veya nslookup gibi araçlarla kontrol edebilirsiniz:
dig +short app.example.com
Bu komut, alan adınızın hangi IP adresine çözüldüğünü göstermelidir.
Traefik Etiketleri
Uygulama konteynerlerinizdeki Traefik etiketlerinin doğru olduğundan emin olun. Özellikle traefik.enable=true, traefik.http.routers. (Host kısmı doğru alan adını içermeli) ve traefik.http.services. (uygulamanın iç portuyla eşleşmeli) etiketlerini dikkatlice kontrol edin.
acme.json İzinleri ve İçeriği
acme.json dosyasının izinlerinin 600 olduğundan emin olun. Ayrıca, sertifika alma hatası alıyorsanız, bu dosyanın boş olup olmadığını veya hatalı bir format içerip içermediğini kontrol edin. Bazen, dosyanın içeriği bozulursa, Traefik’i durdurup acme.json dosyasını silip yeniden başlatmak sorunu çözebilir (ancak bu, mevcut tüm sertifikaları kaybetmenize neden olur ve Traefik yeniden sertifika almaya çalışır).
Docker Ağı
Traefik ve uygulama konteynerlerinizin aynı Docker ağına (web ağı) bağlı olduğundan emin olun. docker inspect komutu ile bir konteynerin hangi ağlara bağlı olduğunu görebilirsiniz.
Sonuç
Bu makalede, Debian 9 üzerinde Docker konteynerleri için Traefik’i nasıl bir ters proxy olarak kuracağımızı ve yapılandıracağımızı detaylı bir şekilde inceledik. Traefik’in dinamik yapılandırma yeteneği, otomatik Let’s Encrypt entegrasyonu ve Docker ile sorunsuz entegrasyonu sayesinde, modern web uygulamalarınızı güvenli, ölçeklenebilir ve kolay yönetilebilir bir şekilde dış dünyaya sunabilirsiniz.
Adım adım kurulum rehberini takip ederek, Traefik servisini başlattık, statik ve dinamik yapılandırmalarını ayarladık ve örnek bir Nginx uygulamasını Traefik aracılığıyla yayınladık. Ayrıca, Traefik Dashboard’ın kullanımını ve güvenlik iyileştirmelerini ele aldık. Traefik, mikroservis mimarileri ve konteynerleştirilmiş uygulamalar için güçlü ve esnek bir çözüm sunarak DevOps süreçlerinizi önemli ölçüde basitleştirir. Bu rehber, Traefik ile Docker konteynerlerinizi yönetmeye başlamanız için sağlam bir temel oluşturmaktadır.