Saya mencoba mengkonfigurasi Traefik sehingga saya akan memiliki akses ke layanan melalui nama domain, dan bahwa saya tidak perlu mengatur port yang berbeda. Misalnya, dua layanan MongoDB, keduanya pada port default, tetapi dalam domain yang berbeda, example.localhost
dan example2.localhost
. Hanya contoh ini yang berfungsi. Maksudku, kasus lain mungkin berhasil, tetapi saya tidak dapat terhubung ke mereka, dan saya tidak mengerti apa masalahnya. Ini mungkin bahkan bukan masalah dengan Traefik.
Saya sudah menyiapkan repositori dengan contoh yang berfungsi. Anda hanya perlu membuat sertifikat sendiri dengan mkcert . Halaman di example.localhost
mengembalikan 403 Forbidden
kesalahan tetapi Anda tidak perlu khawatir, karena tujuan dari konfigurasi ini adalah untuk menunjukkan bahwa SSL berfungsi (gembok, status hijau). Jadi jangan fokus 403
.
Hanya koneksi SSL ke mongo
layanan yang berfungsi. Saya mengujinya dengan program Robo 3T . Setelah memilih koneksi SSL, menyediakan host pada example.localhost
dan memilih sertifikat untuk koneksi yang ditandatangani sendiri (atau milik sendiri) berfungsi. Dan itulah satu-satunya yang bekerja seperti itu. Koneksi ke redis
( Redis Desktop Manager ) dan ke pgsql
( PhpStorm , DBeaver , DbVisualizer ) tidak berfungsi, terlepas dari apakah saya memberikan sertifikat atau tidak. Saya tidak meneruskan SSL ke layanan, saya hanya terhubung ke Traefik. Saya menghabiskan waktu berjam-jam untuk itu. Saya mencari di internet. Saya belum menemukan jawabannya. Adakah yang memecahkan ini?
PS. Saya bekerja di Linux Mint, jadi konfigurasi saya harus bekerja di lingkungan ini tanpa masalah. Saya akan meminta solusi untuk Linux.
Jika Anda tidak ingin menelusuri repositori , saya lampirkan file yang paling penting:
docker-compose.yml
version: "3.7"
services:
traefik:
image: traefik:v2.0
ports:
- 80:80
- 443:443
- 8080:8080
- 6379:6379
- 5432:5432
- 27017:27017
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config.toml:/etc/traefik/traefik.config.toml:ro
- ./certs:/etc/certs:ro
command:
- --api.insecure
- --accesslog
- --log.level=INFO
- --entrypoints.http.address=:80
- --entrypoints.https.address=:443
- --entrypoints.traefik.address=:8080
- --entrypoints.mongo.address=:27017
- --entrypoints.postgres.address=:5432
- --entrypoints.redis.address=:6379
- --providers.file.filename=/etc/traefik/traefik.config.toml
- --providers.docker
- --providers.docker.exposedByDefault=false
- --providers.docker.useBindPortIP=false
apache:
image: php:7.2-apache
labels:
- traefik.enable=true
- traefik.http.routers.http-dev.entrypoints=http
- traefik.http.routers.http-dev.rule=Host(`example.localhost`)
- traefik.http.routers.https-dev.entrypoints=https
- traefik.http.routers.https-dev.rule=Host(`example.localhost`)
- traefik.http.routers.https-dev.tls=true
- traefik.http.services.dev.loadbalancer.server.port=80
pgsql:
image: postgres:10
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
labels:
- traefik.enable=true
- traefik.tcp.routers.pgsql.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.pgsql.tls=true
- traefik.tcp.routers.pgsql.service=pgsql
- traefik.tcp.routers.pgsql.entrypoints=postgres
- traefik.tcp.services.pgsql.loadbalancer.server.port=5432
mongo:
image: mongo:3
labels:
- traefik.enable=true
- traefik.tcp.routers.mongo.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.mongo.tls=true
- traefik.tcp.routers.mongo.service=mongo
- traefik.tcp.routers.mongo.entrypoints=mongo
- traefik.tcp.services.mongo.loadbalancer.server.port=27017
redis:
image: redis:3
labels:
- traefik.enable=true
- traefik.tcp.routers.redis.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.redis.tls=true
- traefik.tcp.routers.redis.service=redis
- traefik.tcp.routers.redis.entrypoints=redis
- traefik.tcp.services.redis.loadbalancer.server.port=6379
config.toml
[tls]
[[tls.certificates]]
certFile = "/etc/certs/example.localhost.pem"
keyFile = "/etc/certs/example.localhost-key.pem"
Bangun & Jalankan
mkcert example.localhost # in ./certs/
docker-compose up -d
Persiapkan langkah demi langkah
- Instal mkcert (jalankan juga
mkcert -install
untuk CA) - Kloning kode saya
- Di
certs
folder runmkcert example.localhost
- Mulai wadah dengan
docker-compose up -d
- Buka halaman https: //example.localhost/ dan periksa apakah koneksi aman
- Jika alamat http: //example.localhost/ tidak dapat dijangkau, tambahkan
127.0.0.1 example.localhost
ke/etc/hosts
Sertifikat:
- Publik:
./certs/example.localhost.pem
- Pribadi:
./certs/example.localhost-key.pem
- CA:
~/.local/share/mkcert/rootCA.pem
Uji MongoDB
- Instal Robo 3T
- Buat koneksi baru:
- Alamat:
example.localhost
- Gunakan protokol SSL
- Sertifikat CA:
rootCA.pem
(atau Sertifikat yang ditandatangani sendiri)
- Alamat:
- Alat uji:
Tes Redis
- Instal RedisDesktopManager
- Buat koneksi baru:
- Alamat:
example.localhost
- SSL
- Kunci Publik:
example.localhost.pem
- Kunci Pribadi:
example.localhost-key.pem
- Wewenang:
rootCA.pem
- Alamat:
- Alat uji:
Sejauh ini:
- Dapat terhubung ke Postgres via IP (info dari Traefik)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
Coba telet (IP mengubah setiap docker restart):
> telnet 172.27.0.5 5432
Trying 172.27.0.5...
Connected to 172.27.0.5.
Escape character is '^]'.
^]
Connection closed by foreign host.
> telnet example.localhost 5432
Trying ::1...
Connected to example.localhost.
Escape character is '^]'.
^]
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
Connection: close
400 Bad RequestConnection closed by foreign host.
Jika saya terhubung langsung ke postgres, datanya bagus. Jika saya terhubung melalui Traefik maka saya memiliki Permintaan Buruk ketika menutup koneksi. Saya tidak tahu apa artinya ini dan apakah itu harus berarti sesuatu.
I can't connect to them
-> bagaimana Anda mengujinya dan apa kesalahannya?Connections to redis (Redis Desktop Manager) ... do not work
, tetapi tangkapan layar menunjukkanSuccessful connection
-? Mengapa Anda tidak menguji pada level rendah dengancurl, openssl, telnet, ...
? Mengapa Anda tidak menguji dengannetstat
apakah port aplikasi tersebut benar-benar diikat untuk traefik pada127.0.0.1
antarmuka?Jawaban:
Setidaknya untuk masalah PostgreSQL, tampaknya koneksi dimulai dalam teks-bersih dan kemudian ditingkatkan ke TLS:
Jadi pada dasarnya tidak mungkin untuk menggunakan terminasi TLS dengan proxy jika proxy tersebut tidak mendukung + handshake cleartext ini ditingkatkan ke fungsi TLS protokol.
sumber