टीएलएस कॉन्फ़िगरेशन के साथ ट्रैफिक टीसीपी सेवाओं से कैसे जुड़ा जाए?


13

मैं ट्राफिक को कॉन्फ़िगर करने का प्रयास कर रहा हूं ताकि मुझे डोमेन नाम के माध्यम से सेवाओं तक पहुंच हो, और मुझे अलग-अलग पोर्ट सेट नहीं करने पड़ेंगे । उदाहरण के लिए, दो MongoDB सेवाएं, दोनों डिफ़ॉल्ट पोर्ट पर, लेकिन विभिन्न डोमेन में, example.localhostऔर example2.localhost। केवल यह उदाहरण काम करता है। मेरा मतलब है, अन्य मामले शायद काम करते हैं, लेकिन मैं उनसे कनेक्ट नहीं कर सकता, और मुझे समझ नहीं आ रहा है कि समस्या क्या है। यह शायद ट्राईफिक की समस्या भी नहीं है।

मैंने एक उदाहरण के साथ एक रिपॉजिटरी तैयार की है जो काम करता है। आपको केवल mccert के साथ अपना स्वयं का प्रमाण पत्र तैयार करना होगा । पृष्ठ त्रुटि example.localhostदेता है, 403 Forbiddenलेकिन आपको इसके बारे में चिंता नहीं करनी चाहिए, क्योंकि इस कॉन्फ़िगरेशन का उद्देश्य यह दिखाना है कि एसएसएल काम कर रहा है (पैडलॉक, ग्रीन स्टेटस)। तो ध्यान केंद्रित नहीं है 403

सेवा से केवल SSL कनेक्शन mongoकाम करता है। मैंने इसे रोबो 3 टी प्रोग्राम के साथ परीक्षण किया । एसएसएल कनेक्शन का चयन करने के बाद, होस्ट प्रदान करने example.localhostऔर स्व-हस्ताक्षरित (या स्वयं) कनेक्शन कार्यों के लिए प्रमाण पत्र का चयन करने के लिए। और यही एकमात्र तरीका है जो उस तरह से काम करता है। के लिए कनेक्शन redis( Redis डेस्कटॉप प्रबंधक ) और करने के लिए pgsql( PhpStorm , DBeaver , DbVisualizer ) क्या मैं प्रमाण पत्र नहीं प्रदान करते हैं या की परवाह किए बिना काम नहीं करते हैं,। मैं एसएसएल को सेवाओं के लिए अग्रेषित नहीं करता, मैं केवल ट्राफिक से जुड़ता हूं। मैंने उस पर लंबे घंटे बिताए। मैंने इंटरनेट पर सर्च किया। मुझे अभी तक उत्तर नहीं मिला है। क्या किसी ने इसका हल निकाला है?

पुनश्च। मैं लिनक्स मिंट पर काम करता हूं, इसलिए मेरे कॉन्फ़िगरेशन को इस वातावरण में बिना किसी समस्या के काम करना चाहिए। मैं लिनक्स के लिए समाधान के लिए पूछना होगा।


यदि आप भंडार को ब्राउज़ नहीं करना चाहते हैं , तो मैं सबसे महत्वपूर्ण फाइलें संलग्न करता हूं:

डोकर-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"

बनाएँ और चलाएँ

mkcert example.localhost # in ./certs/
docker-compose up -d

स्टेप बाई स्टेप तैयार करें

  1. Mkcert स्थापित करें ( mkcert -installCA के लिए भी चलाएँ )
  2. मेरा कोड क्लोन किया
  3. में certsफ़ोल्डर रनmkcert example.localhost
  4. द्वारा कंटेनर प्रारंभ करें docker-compose up -d
  5. पृष्ठ खोलें https: //example.localhost/ और जांचें कि क्या यह सुरक्षित कनेक्शन है
  6. तो पता http: //example.localhost/ पहुंच योग्य नहीं है, जोड़ने 127.0.0.1 example.localhostके लिए/etc/hosts

प्रमाणपत्र:

  • जनता: ./certs/example.localhost.pem
  • निजी: ./certs/example.localhost-key.pem
  • सीए: ~/.local/share/mkcert/rootCA.pem

परीक्षण MongoDB

  1. रोबो 3 टी स्थापित करें
  2. नया कनेक्शन बनाएँ:
    • पता: example.localhost
    • एसएसएल प्रोटोकॉल का उपयोग करें
    • CA प्रमाणपत्र: rootCA.pem(या स्व-हस्ताक्षरित प्रमाणपत्र)
  3. परीक्षण उपकरण:

परीक्षा

टेस्ट रेडिस

  1. RedisDesktopManager स्थापित करें
  2. नया कनेक्शन बनाएँ:
    • पता: example.localhost
    • एसएसएल
    • सार्वजनिक कुंजी: example.localhost.pem
    • निजी चाबी: example.localhost-key.pem
    • प्राधिकरण: rootCA.pem
  3. परीक्षण उपकरण:

परीक्षा


अब तक:

  1. आईपी ​​के माध्यम से पोस्टग्रैज से कनेक्ट कर सकते हैं (ट्राफिक से जानकारी)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable

यहां छवि विवरण दर्ज करें

jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory

यहां छवि विवरण दर्ज करें


टेलेट की कोशिश करें (आईपी हर डॉकटर को फिर से शुरू करता है):

> 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.

यदि मैं सीधे पोस्टग्रेज से कनेक्ट करता हूं, तो डेटा अच्छा है। यदि मैं ट्रैफिक से जुड़ता हूं तो कनेक्शन बंद करते समय मेरा खराब अनुरोध है। मुझे नहीं पता कि इसका क्या मतलब है और क्या इसका मतलब कुछ होना चाहिए।


I can't connect to them-> आपने इसका परीक्षण कैसे किया और त्रुटि क्या थी?
Jan Garaj

@JanGaraj मैं एक कदम-दर-कदम अनुदेश जोड़ा
Gander

Connections to redis (Redis Desktop Manager) ... do not work, लेकिन स्क्रीनशॉट से पता चलता है Successful connection- आप निम्न स्तर पर परीक्षण क्यों नहीं कर रहे हैं curl, openssl, telnet, ...? netstatयदि आप उन ऐप पोर्ट को वास्तव में 127.0.0.1इंटरफ़ेस पर ट्रैफ़िक के लिए बाँध रहे हैं, तो आप उनका परीक्षण क्यों नहीं कर रहे हैं ?
जन गरज

ट्रैफ़िक और डेटाबेस वाले कंटेनर एक ही होस्ट पर चलते हैं?
रियाबचेंको अलेक्जेंडर

@RyabchenkoAlexander हाँ, डॉकटर कंटेनरों में
Gander

जवाबों:


2

कम से कम PostgreSQL इश्यू के लिए, ऐसा लगता है कि कनेक्शन क्लीयरटेक्स्ट में शुरू किया गया है और फिर TLS में अपग्रेड किया गया है:

तो यह मूल रूप से एक प्रॉक्सी के साथ टीएलएस समाप्ति का उपयोग करने के लिए असंभव है अगर कहा जाता है कि प्रॉक्सी इस क्लीयरटेक्स हैंडशेक + को प्रोटोकॉल के टीएलएस फ़ंक्शन में अपग्रेड करने का समर्थन नहीं करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.