Reverse Proxy สามารถใช้ SNI กับ SSL pass through ได้หรือไม่


18

ฉันต้องให้บริการแอปพลิเคชันหลายรายการผ่าน https โดยใช้ที่อยู่ IP เดียว

ใบรับรอง ssl ไม่ควรถูกจัดการบน reverse proxy มีการติดตั้งไว้ในแอพพลิเคชันเซิร์ฟเวอร์

reverse proxy สามารถกำหนดค่าให้ใช้ SNI และส่งผ่าน ssl ผ่านเพื่อยุติที่จุดปลายได้หรือไม่

เป็นไปได้โดยใช้บางอย่างเช่น Nginx หรือ Apache? การกำหนดค่ามีลักษณะอย่างไร

คำตอบ:


14

สิ่งนี้เป็นไปได้ด้วย Haproxy คุณสามารถตั้งค่าพร็อกซี TCP และแยก SNI และทำการกำหนดเส้นทางตาม SNI นี่คือตัวอย่าง:

backend be.app1
    mode tcp
    no option checkcache
    no option httpclose
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    tcp-request content reject
    use-server server1 if { req.ssl_sni -m beg app1. }
    server server1 server1:8443 check id 1 weight 0

จำเป็นต้องชะลอการร้องขอจนกว่าคุณจะได้รับ SSL hello มิฉะนั้น haproxy จะพยายามทำการเชื่อมต่อก่อนที่จะรับส่วนหัว SNI

ฉันกำลังใช้เซิร์ฟเวอร์ที่มีน้ำหนัก 0 เพราะในการกำหนดค่าปัจจุบันของฉันฉันมีเซิร์ฟเวอร์เดียวที่ทำงานสำหรับแต่ละ SNI และฉันไม่ต้องการให้พวกเขาได้รับคำขอแบบสุ่ม คุณอาจหาวิธีที่ดีกว่าในการเล่นกับสิ่งนี้

ฉันหวังว่านี่จะช่วยได้.


คุณช่วยชี้ให้ฉันดูเอกสารใด ๆ ของตัวอย่างนี้หรือตัวอย่างข้อมูลการกำหนดค่าเพื่อที่ฉันจะสามารถยอมรับคำตอบได้หรือไม่?
user319862

3
@ user319862 ฉันพบกวดวิชาที่ดีซึ่งน่าจะเป็นสิ่งที่กล่าวถึง
Michael Hampton

1
จริงๆ? ทำไมบางคนถึงลงคะแนนคำตอบนี้
Florin Asăvoaie

ปัญหานี้คือที่อยู่ IP ของลูกค้าไม่ได้รับการส่งต่อดังนั้นเซิร์ฟเวอร์จะเห็นเฉพาะการรับส่งข้อมูลที่มาจากพร็อกซี
Kyle

@ Kyle แน่นอน เป็น TCP proxy สิ่งเดียวที่คุณสามารถทำได้คือถ้าคุณกำหนดค่าและตั้งค่า haproxy เป็นเราเตอร์สำหรับเซิร์ฟเวอร์และใช้ tproxy
Florin Asăvoaie

5

คุณสามารถใช้ sniproxy: https://github.com/dlundquist/sniproxy

ตัวอย่างการกำหนดค่า:

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

ขอขอบคุณที่โพสต์เกี่ยวกับโครงการนั้น ฉันไม่ทราบ
user319862

@mick สวัสดีมิกเมื่อเรียกใช้ SNI เป็นพร็อกซีโปร่งใสมันทำลายบางเว็บไซต์ที่มีข้อผิดพลาด SSL จะแก้ไขได้อย่างไร?
ริ

1

สิ่งนี้เป็นไปได้อย่างแน่นอนแม้ในปี 2019 ด้วย TLS 1.3 ที่กำลังจะมาถึง! เว็บเซิร์ฟเวอร์หรือพร็อกซี่ย้อนกลับแบบพิเศษจำนวนมากมอบฟังก์ชันการทำงานนี้นอกกรอบ:

  • Nginx ≥ 1.11.5 (เดเบียน≥บัสเตอร์หรือแบ็กพอร์ตสปอร์ต)
  • HAProxy ≥ 1.5 (Debian ≥ jessie)
  • Sniproxy (Debian ≥บัสเตอร์)
  • เป็นต้น

นี่เป็นตัวอย่างการกำหนดค่าสำหรับ Nginx ซึ่งเป็นตัวเลือกยอดนิยมสำหรับการตั้งค่าที่ต้องใช้ reverse proxy:

stream {
  map $ssl_preread_server_name $selected_upstream {
    example.org upstream_1;
    example.net upstream_2;
    example.com upstream_3;
    default upstream_4;
  }
  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }
  upstream upstream_3 { server 10.0.0.3:443; }
  upstream upstream_4 { server 10.0.0.4:443; }
  server {
    listen 10.0.0.5:443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

โมดูล Nginx ที่เกี่ยวข้องและstream_core stream_ssl_prereadคู่มือการใช้งาน:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.