Score:0

Nginx: ส่งต่อการรับส่งข้อมูล HTTPS ไปยังพร็อกซีเซิร์ฟเวอร์ที่ต้องการการตรวจสอบสิทธิ์

ธง in

ฉันต้องตั้งค่าเซิร์ฟเวอร์ HTTP/HTTPS แบบโปร่งใส (พร็อกซี X) ด้วย NGINX เพื่อพร็อกซีทราฟฟิกด้วยการอนุญาตที่จำเป็นสำหรับปลายทางพร็อกซี (พร็อกซี Y)พร็อกซีเอนด์พอยต์ (B) ต้องการการอนุญาตขั้นพื้นฐานในการรับทราฟฟิก

การเปรียบเทียบจะเป็นดังนี้:

ลูกค้า ขอ URL (เช่น ifconfig.co) -> DNS ที่กำหนดเองแก้ไขคำขอไปยังพร็อกซี เอ็กซ์ -> หนังสือมอบฉันทะ (เอ็กซ์) ยอมรับคำขอและจัดการส่วนหัวเพื่อเพิ่มการรับรองความถูกต้องขั้นพื้นฐาน -> หนังสือมอบฉันทะ เอ็กซ์ ส่งต่อคำขอไปยังปลายทางพร็อกซี วาย

ควรได้ผลลัพธ์ที่แน่นอนตามด้านล่างของขด: ที่นี่ฉันใช้ https://ifconfig.co เพื่อตรวจสอบ IP ปลายทาง

เอชทีทีพี

curl -x http://proxy_endpoint:proxy_port -U 'ชื่อผู้ใช้':'รหัสผ่าน' -k https://ifconfig.co

HTTPS

curl -x http://proxy_endpoint:proxy_port -U 'ชื่อผู้ใช้':'รหัสผ่าน' -k https://ifconfig.co

การทดสอบ:

เพื่อทดสอบการตั้งค่า ฉันเพิ่มบันทึกในของฉัน / etc / โฮสต์ เพื่อแก้ไข ifconfig.co ไปยังเซิร์ฟเวอร์ Proxy X ของฉัน

จากนั้นฉันทำการม้วนผม

#http
ขด http://ifconfig.co

#https
ขด https://ifconfig.co

ผลลัพธ์ที่สำเร็จควรให้ IP ของพร็อกซีปลายทางแก่ฉัน วาย


การรับส่งข้อมูล HTTP:

ฉันค้นหาวิธีแก้ปัญหาทางออนไลน์อย่างกว้างขวางโดยใช้โมดูล NGINX และฉันพบคำตอบที่เป็นประโยชน์มากที่นี่: https://serverfault.com/a/345244/954119

อย่างไรก็ตาม คำตอบนี้ช่วยให้ฉันส่งทราฟฟิก HTTP เท่านั้น ไม่ใช่ HTTPS นี่คือสิ่งที่ฉันกำหนดค่าสำหรับ HTTP บนพอร์ต 80 ใน nginx.conf:

http {
    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                      '$สถานะ $body_bytes_sent "$http_referer"'
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log หลัก;

    ส่งไฟล์บน;
    #tcp_nopush บน;

    keepalive_timeout 300;

    proxy_set_header โฮสต์ $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;

  เซิร์ฟเวอร์ {
    ฟัง *:80;
    access_log /var/log/nginx/nginx.access.log;
    error_log /var/log/nginx/nginx.error.log;

    ที่ตั้ง / {
        proxy_pass http://proxy_endpoint_Y:PORT;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_set_header โฮสต์ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header Proxy-Authorization "Basic base64-encoded-string";
    }
  }


}

ผมจึงตั้งค่า http กำกับด้วย เซิร์ฟเวอร์ ที่ฟังพอร์ต 80 และกำหนดค่า ที่ตั้ง กับ proxy_set_header Proxy-Authorization ด้วยชื่อผู้ใช้/รหัสผ่านที่เข้ารหัส bas64

สิ่งนี้ใช้งานได้ดีจริง ๆ และรับส่งข้อมูลพร็อกซี HTTP (พอร์ต 80) ไปยังปลายทางพร็อกซี อย่างไรก็ตามการรับส่งข้อมูล HTTPS จะไม่ทำงาน


การรับส่งข้อมูล HTTPS

ดังนั้นเมื่อฉันเปลี่ยนไป ฟัง ถึง 443 แทน:

http {
    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                      '$สถานะ $body_bytes_sent "$http_referer"'
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log หลัก;
    ส่งไฟล์บน;

    keepalive_timeout 300;

  เซิร์ฟเวอร์ {
    ฟัง *:443;
    access_log /var/log/nginx/nginx.access.log;
    error_log /var/log/nginx/nginx.error.log;

    ที่ตั้ง / {
        proxy_pass http://proxy_endpoint_Y:PORT;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_set_header โฮสต์ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header Proxy-Authorization "Basic base64-encoded-string";
    }
  }


}

ข้อผิดพลาด cURL ในไคลเอ็นต์ของฉัน :

ขด: (35) ข้อผิดพลาด:1400410B:รูทีน SSL:CONNECT_CR_SRVR_HELLO:หมายเลขเวอร์ชันไม่ถูกต้อง

ในบันทึกการเข้าถึงของฉัน ฉันได้รับบันทึกที่แปลกประหลาดมาก:

xx.xxx.xx.x - - [26/มี.ค./2022:21:43:54 +0000] "\x16\x03\x01\x00\xE1\x01\x00\x00\xDD\x03\x03W\x87> \x1E+1\xDFb\x13\x1E,\xC0\xE9\xEF\x07\xAB[\xEA!\xBE\x17\xC23\x8D\xBD\xA4\xEA\xB5\xD5s\x8AO\x00\x00\ x5C\xC00\xC0,\xC0(\xC0$\xC0\x14\xC0" 400 157 "-" "-"

ฉันแค่ต้องจัดการการรับส่งข้อมูล HTTPS เพื่อเพิ่มส่วนหัวการให้สิทธิ์ เป็นไปได้ไหม? หรือมีแนวทางอื่นอีกไหมครับ?

บันทึก:

ฉันได้ลองใช้ ลำธาร โมดูลที่ฉันใช้ก่อนหน้านี้เพื่อส่งทราฟฟิก HTTPS ไปยังปลายทาง แต่ไม่มีการอนุญาต แต่ฉันไม่เห็นตัวเลือกใด ๆ ใน NGINX ลำธาร เอกสารโมดูลเพื่อจัดการส่วนหัวของคำขอ http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html

สภาพแวดล้อมของระบบ:

รุ่น nginx: nginx/1.21.6 สร้างโดย gcc 9.3.0 (Ubuntu 9.3.0-10ubuntu2) สร้างด้วย OpenSSL 1.1.1f 31 มี.ค. 2020 เปิดใช้งานการสนับสนุน TLS SNI

djdomi avatar
za flag
ไม่ทำงานไม่ใช่คำอธิบายข้อผิดพลาด โปรดระบุการกำหนดค่าทั้งหมดของการแจ้งเตือน 'ไม่ทำงาน' พอร์ตเริ่มต้นนั้นไม่จำเป็นต้องประกาศ
ahmadrg avatar
in flag
@djdomi เพิ่มรายละเอียดและคำชี้แจงเพิ่มเติมในโพสต์ ขอบคุณ.
dave_thompson_085 avatar
jp flag
เพื่อให้ nginx จัดการกับ HTTPS [คุณต้องมี `listen *:443 ssl` plus directive(s) เพื่อตั้งค่าใบรับรอง/เชนและคีย์](https://nginx.org/en/docs/http/ngx_http_ssl_module.html) ด้วยการกำหนดค่าที่คุณมี nginx คาดหวังว่า HTTP-clear บน 443 ดังนั้นเมื่อไคลเอนต์ใช้ HTTPS จริง บันทึก SSL/TLS แรก (การจับมือ ClientHello) จะออกมาในบันทึกของคุณเป็นคำขอ HTTP ขยะ `\x16\x03\x01etcetc `
dave_thompson_085 avatar
jp flag
PS: สตรีมไม่สามารถแยกวิเคราะห์/จดจำหรือแก้ไขส่วนหัว HTTP เนื่องจากไม่ต้องการหรือคาดหวัง HTTP มีเพียงไบต์ และไบต์ไม่มีส่วนหัวหรือแม้แต่บรรทัด
ahmadrg avatar
in flag
@dave_thompson_085 ขอบคุณสำหรับคำชี้แจง ฉันกำลังสำรวจโมดูลอื่นๆ ด้วย NGINX เช่น https://github.com/chobits/ngx_http_proxy_connect_module#example-for-curl มันกล่าวถึงการรับรองความถูกต้องขั้นพื้นฐานในเอกสารประกอบและในการอภิปรายด้วย ฉันจะอัปเดตโพสต์เมื่อฉันมีมุมมองที่ชัดเจนหรือพบวิธีแก้ปัญหา

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา