tl; ดร;
การกำหนดค่าด้วย Stunnel บนไคลเอนต์ที่เชื่อมต่อกับ Squid Proxy ด้วยการตรวจสอบสิทธิ์ใบรับรอง x509 ใช้งานได้เพียงหนึ่งคำขอต่อ 5 นาที สถานการณ์:
ปลาหมึก
และ ตะลึง
กำหนดค่าและเริ่มต้น
ว้าว
กำหนดค่าเพื่อใช้ โลคัลโฮสต์
เป็นผู้รับมอบฉันทะ (ตะลึง
)
- 1 คำขอเท่านั้น (เช่น
wget https://github.com
) ต่อ 5 นาที (หรือ ตะลึง
เริ่มต้นใหม่) พักงานได้ การเชื่อมต่อถูกรีเซ็ตโดยเพียร์
- ใช้การเชื่อมต่อดิบเช่น
openssl s_client -key -cert -เชื่อมต่อ
การใช้การสื่อสารโดยตรงกับปลาหมึกทำงานได้อย่างถูกต้อง
คำอธิบาย
ฉันกำลังตั้งค่าสถาปัตยกรรมของ ตะลึง
ติดตั้งบนไคลเอนต์ซึ่งนำไปสู่ ปลาหมึก
มอบฉันทะด้วย x509 ใบรับรอง
การรับรองความถูกต้อง
การตั้งค่าไคลเอนต์ ตะลึง
พร้อมใบรับรองของเขาซึ่งเชื่อมต่อกับ ปลาหมึก
จากนั้นตั้งค่า HTTP_PROXY
เพื่อมุ่งสู่จุดสิ้นสุดของอุโมงค์ที่ โลคัลโฮสต์
.
เส้นทางความน่าเชื่อถือได้รับการกำหนดค่าอย่างถูกต้องในแต่ละด้าน ดังนั้นทั้งใบรับรองความน่าเชื่อถือของ Squid จากไคลเอ็นต์ และใบรับรองของ Squid ของไคลเอ็นต์ที่เชื่อถือในแต่ละระดับ - Root CA และ CA ระดับกลาง
การกำหนดค่าของ stunnel:
sslVersion=TLSv1.2
output=/var/log/stunnel4/stunnel.log
[squid-gcp]
ใบรับรอง = /etc/letsencrypt/live/test.internal/fullchain.pem
คีย์ = /etc/letsencrypt/live/test.internal/privkey.pem
CAFile = /usr/local/share/ca-certificates/root.crt
ลูกค้า = ใช่
แก้ปัญหา=7
ยอมรับ = 127.0.0.1:3128
เชื่อมต่อ = squid.internal:3128
การกำหนดค่าปลาหมึก
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 เครือข่าย "นี้" (LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 เครือข่ายส่วนตัวภายใน (LAN)
acl localnet src 100.64.0.0/10 # RFC 6598 พื้นที่ที่อยู่ที่ใช้ร่วมกัน (CGN)
acl localnet src 169.254.0.0/16 # เครื่อง RFC 3927 link-local (เสียบโดยตรง)
acl localnet src 172.16.0.0/12 # RFC 1918 เครือข่ายส่วนตัวภายใน (LAN)
acl localnet src 192.168.0.0/16 # RFC 1918 เครือข่ายส่วนตัวในพื้นที่ (LAN)
acl localnet src fc00::/7 # RFC 4193 ช่วงเครือข่ายส่วนตัวในพื้นที่
เครื่อง acl localnet src fe80::/10 # RFC 4291 link-local (เสียบโดยตรง)
acl SSL_ports พอร์ต 443
acl Safe_ports พอร์ต 80 # http
acl Safe_ports พอร์ต 21 # ftp
acl Safe_ports พอร์ต 443 # https
acl Safe_ports พอร์ต 70 # โกเฟอร์
acl Safe_ports พอร์ต 210 # wais
acl Safe_ports พอร์ต 1025-65535 # พอร์ตที่ไม่ได้ลงทะเบียน
acl Safe_ports พอร์ต 280 # http-mgmt
acl Safe_ports พอร์ต 488 # gss-http
acl Safe_ports พอร์ต 591 # filemaker
acl Safe_ports พอร์ต 777 # มัลติลิง http
วิธีเชื่อมต่อ acl CONNECT
acl ใบรับรอง user_cert CN ทดสอบภายใน
http_access อนุญาตให้ผู้จัดการ localhost
http_access ปฏิเสธผู้จัดการ
http_access ปฏิเสธ to_localhost
http_access อนุญาตใบรับรอง
http_access อนุญาต localhost
http_access อนุญาตให้ servicedesk
http_access ปฏิเสธทั้งหมด
https_port 3128 tls-cert=/etc/letsencrypt/live/squid.internal/cert.pem tls-key=/etc/letsencrypt/live/squid.internal/privkey.pem options=NO_SSLv3:NO_TLSv1:NO_TLSv1_1:NO_TLSv1_3:NO_TICKET ไคลเอนต์ =/usr/local/share/ca-certificates/root.crt cafile=/usr/local/share/ca-certificates/root.crt tls-default-ca=off
client_idle_pconn_timeout 5 นาที
เปิด client_persistent_connections
pconn_lifetime 0
logformat squidtls %tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt "%ssl::>cert_subject"
access_log daemon:/var/log/squid/access-tls.log Squidtls
แคชปฏิเสธทั้งหมด
cache_dir เป็นโมฆะ /tmp
shutdown_lifetime 1 วินาที
coredump_dir /var/cache/squid
ตอนนี้จะเกิดอะไรขึ้นกับไคลเอนต์ เมื่อกำหนดค่า HTTPS_PROXY=localhost:3128 อย่างถูกต้อง คำขอแรกผ่าน Squid ได้รับการยอมรับ และคำขอถัดไปจะถูกปฏิเสธด้วย การเชื่อมต่อถูกรีเซ็ตโดยเพียร์
. หลังจาก 5 นาทีหรือรีสตาร์ท Stunnel คำขอถัดไปจะได้รับการจัดการอย่างถูกต้อง
บันทึกจาก Stunnel เมื่อสิ่งนี้เกิดขึ้น คำขอแรกตกลง รายการที่สองถูกปฏิเสธ:
2021.07.07 14:27:59 LOG7[0]: เริ่มบริการ [squid-gcp] แล้ว
2021.07.07 14:27:59 LOG7[0]: การตั้งค่าตัวเลือกซ็อกเก็ตในเครื่อง (FD=3)
2021.07.07 14:27:59 LOG7[0]: ตัวเลือก TCP_NODELAY ตั้งค่าบนซ็อกเก็ตในเครื่อง
2021.07.07 14:27:59 LOG5[0]: บริการ [squid-gcp] ยอมรับการเชื่อมต่อจาก 127.0.0.1:50142
2021.07.07 14:27:59 LOG6[0]: s_connect: กำลังเชื่อมต่อ 100.112.0.62:3128
2021.07.07 14:27:59 LOG7[0]: s_connect: s_poll_wait 100.112.0.62:3128: รอ 10 วินาที
2021.07.07 14:27:59 LOG7[0]: FD=6 เหตุการณ์=0x2001 เหตุการณ์=0x0
2021.07.07 14:27:59 LOG7[0]: FD=11 เหตุการณ์=0x2005 เหตุการณ์=0x0
2021.07.07 14:27:59 LOG5[0]: s_connect: เชื่อมต่อ 100.112.0.62:3128
2021.07.07 14:27:59 LOG5[0]: บริการ [squid-gcp] เชื่อมต่อเซิร์ฟเวอร์ระยะไกลจาก 100.112.0.63:50392
2021.07.07 14:27:59 LOG7[0]: การตั้งค่าตัวเลือกซ็อกเก็ตระยะไกล (FD=11)
2021.07.07 14:27:59 LOG7[0]: ตัวเลือก TCP_NODELAY ตั้งค่าบนซ็อกเก็ตระยะไกล
2021.07.07 14:27:59 LOG7[0]: ตัวอธิบายระยะไกล (FD=11) เริ่มต้น
2021.07.07 14:27:59 LOG6[0]: SNI: กำลังส่งชื่อเซิร์ฟเวอร์: squid.internal
2021.07.07 14:27:59 LOG6[0]: ไม่จำเป็นต้องใช้ใบรับรองเพียร์
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): ก่อนการเริ่มต้น SSL
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนไคลเอ็นต์ สวัสดี
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนไคลเอ็นต์ สวัสดี
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): เซิร์ฟเวอร์อ่าน SSLv3/TLS สวัสดี
2021.07.07 14:27:59 LOG6[0]: การตรวจสอบใบรับรองถูกปิดใช้งาน
2021.07.07 14:27:59 LOG6[0]: การตรวจสอบใบรับรองถูกปิดใช้งาน
2021.07.07 14:27:59 LOG6[0]: การตรวจสอบใบรับรองถูกปิดใช้งาน
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS อ่านใบรับรองเซิร์ฟเวอร์
2021.07.07 14:27:59 LOG6[0]: Client CA: O=GCP Internal CA, CN=GCP Internal CA Root CA
2021.07.07 14:27:59 LOG6[0]: Client CA: O=GCP Internal CA, CN=GCP Internal CA CA ระดับกลาง
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS อ่านคำขอใบรับรองเซิร์ฟเวอร์
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): เซิร์ฟเวอร์อ่าน SSLv3/TLS เสร็จแล้ว
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนใบรับรองไคลเอ็นต์
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนการแลกเปลี่ยนคีย์ไคลเอ็นต์
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): ตรวจสอบใบรับรองการเขียน SSLv3/TLS
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนเปลี่ยนข้อมูลจำเพาะการเข้ารหัส
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): เขียน SSLv3/TLS เสร็จแล้ว
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): เขียน SSLv3/TLS เสร็จแล้ว
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS อ่านข้อมูลจำเพาะการเข้ารหัสการเปลี่ยนแปลง
2021.07.07 14:27:59 LOG7[0]: สถานะ TLS (เชื่อมต่อ): อ่าน SSLv3/TLS เสร็จแล้ว
2021.07.07 14:27:59 LOG7[0]: การโทรกลับเซสชันใหม่
2021.07.07 14:27:59 LOG7[0]: ใบรับรองเพียร์ถูกแคช (2601 ไบต์)
2021.07.07 14:27:59 LOG6[0]: รหัสเซสชัน: 383CDD4E8AA87AC2ED148172C025D1A5ECE0A1FF114362503BCDED36B9BB44B0
2021.07.07 14:27:59 LOG7[0]: 1 ไคลเอ็นต์ที่ร้องขอการเชื่อมต่อ
2021.07.07 14:27:59 LOG7[0]: 1 ไคลเอ็นต์เชื่อมต่อสำเร็จ
2021.07.07 14:27:59 LOG7[0]: 0 ไคลเอ็นต์ร้องขอการเจรจาใหม่
2021.07.07 14:27:59 LOG7[0]: ใช้ซ้ำ 0 เซสชัน
2021.07.07 14:27:59 LOG6[0]: เชื่อมต่อ TLS: เซสชันใหม่มีการเจรจา
2021.07.07 14:27:59 LOG6[0]: TLSv1.2 ciphersuite: AES256-GCM-SHA384 (การเข้ารหัส 256 บิต)
2021.07.07 14:27:59 LOG7[0]: การบีบอัด: null, การขยาย: null
2021.07.07 14:27:59 LOG6[0]: อ่านซ็อกเก็ตปิด (readsocket)
2021.07.07 14:27:59 LOG7[0]: กำลังส่งการแจ้งเตือน close_notify
2021.07.07 14:27:59 LOG7[0]: การแจ้งเตือน TLS (เขียน): คำเตือน: ปิดการแจ้งเตือน
2021.07.07 14:27:59 LOG6[0]: SSL_shutdown ส่งการแจ้งเตือน close_notify เรียบร้อยแล้ว
2021.07.07 14:27:59 LOG7[0]: การแจ้งเตือน TLS (อ่าน): คำเตือน: ปิดการแจ้งเตือน
2021.07.07 14:27:59 LOG6[0]: ปิด TLS (SSL_read)
2021.07.07 14:27:59 LOG7[0]: ปิดการเขียนซ็อกเก็ตที่ส่ง
2021.07.07 14:27:59 LOG5[0]: การเชื่อมต่อปิด: 737 ไบต์ที่ส่งไปยัง TLS, 234207 ไบต์ที่ส่งไปยังซ็อกเก็ต
2021.07.07 14:27:59 LOG7[0]: ตัวอธิบายระยะไกล (FD=11) ปิด
2021.07.07 14:27:59 LOG7[0]: ตัวอธิบายท้องถิ่น (FD=3) ปิด
2021.07.07 14:27:59 LOG7[0]: บริการ [squid-gcp] เสร็จสิ้น (เหลือ 0)
2021.07.07 14:28:01 LOG7[1]: เริ่มบริการ [squid-gcp] แล้ว
2021.07.07 14:28:01 LOG7[1]: การตั้งค่าตัวเลือกซ็อกเก็ตในเครื่อง (FD=3)
2021.07.07 14:28:01 LOG7[1]: ตัวเลือก TCP_NODELAY ตั้งค่าบนซ็อกเก็ตในเครื่อง
2021.07.07 14:28:01 LOG5[1]: บริการ [squid-gcp] ยอมรับการเชื่อมต่อจาก 127.0.0.1:50146
2021.07.07 14:28:01 LOG6[1]: s_connect: กำลังเชื่อมต่อ 100.112.0.62:3128
2021.07.07 14:28:01 LOG7[1]: s_connect: s_poll_wait 100.112.0.62:3128: รอ 10 วินาที
2021.07.07 14:28:01 LOG7[1]: FD=6 เหตุการณ์=0x2001 เหตุการณ์=0x0
2021.07.07 14:28:01 LOG7[1]: FD=11 เหตุการณ์=0x2005 เหตุการณ์=0x0
2021.07.07 14:28:01 LOG5[1]: s_connect: เชื่อมต่อแล้ว 100.112.0.62:3128
2021.07.07 14:28:01 LOG5[1]: บริการ [squid-gcp] เชื่อมต่อเซิร์ฟเวอร์ระยะไกลจาก 100.112.0.63:50396
2021.07.07 14:28:01 LOG7[1]: การตั้งค่าตัวเลือกซ็อกเก็ตระยะไกล (FD=11)
2021.07.07 14:28:01 LOG7[1]: ตัวเลือก TCP_NODELAY ตั้งค่าบนซ็อกเก็ตระยะไกล
2021.07.07 14:28:01 LOG7[1]: ตัวอธิบายระยะไกล (FD=11) เริ่มต้น
2021.07.07 14:28:01 LOG6[1]: SNI: กำลังส่งชื่อเซิร์ฟเวอร์: squid.internal
2021.07.07 14:28:01 LOG6[1]: ไม่จำเป็นต้องใช้ใบรับรองเพียร์
2021.07.07 14:28:01 LOG7[1]: สถานะ TLS (เชื่อมต่อ): ก่อนการเริ่มต้น SSL
2021.07.07 14:28:01 LOG7[1]: สถานะ TLS (เชื่อมต่อ): SSLv3/TLS เขียนไคลเอ็นต์ สวัสดี
2021.07.07 14:28:01 LOG3[1]: SSL_connect: Peer ตัดการเชื่อมต่อกะทันหัน
2021.07.07 14:28:01 LOG5[1]: รีเซ็ตการเชื่อมต่อ: 0 ไบต์ที่ส่งไปยัง TLS, 0 ไบต์ที่ส่งไปยังซ็อกเก็ต
2021.07.07 14:28:01 LOG7[1]: ตัวอธิบายระยะไกล (FD=11) ปิด
2021.07.07 14:28:01 LOG7[1]: ตัวอธิบายโลคัล (FD=3) ปิด
2021.07.07 14:28:01 LOG7[1]: บริการ [squid-gcp] เสร็จสิ้น (เหลือ 0)
ดูเหมือนว่าการเจรจา TLS คำขอแรกจะสำเร็จในขณะที่คำขอที่สองยังไม่ได้เริ่มต้นด้วยซ้ำ
บันทึกจากบันทึกการเข้าถึงปลาหมึก:
07/Jul/2021:14:27:59 +0000 1625668079.646 496 100.112.0.63 TCP_TUNNEL/200 234207 CONNECT github.com:443 - HIER_DIRECT/140.82.121.4 - "/CN=test.internal"
07/Jul/2021:14:28:01 +0000 1625668081.958 0 100.112.0.63 ไม่มี/000 0 ไม่มี ข้อผิดพลาด:ธุรกรรมสิ้นสุดก่อนส่วนหัว - HIER_NONE/- - "-"
บันทึกจากแคช:
2021/07/07 14:28:01 เด็ก1| เกิดข้อผิดพลาดในการเจรจาการเชื่อมต่อ SSL บน FD 11: error:00000001:lib(0):func(0):reason(1) (1/-1)
โบนัส
เมื่อฉันลองใช้ openssl s_client
แล้ว รับ https://github.com
แบบนี้:
openssl s_client -cert /etc/letsencrypt/live/test.internal/cert.pem -key /etc/letsencrypt/live/test.internal/privkey.pem -connect squid.internal:3128
แต่ละคำขอสำเร็จ:
บันทึกจากปลาหมึก:
07/Jul/2021:14:33:24 +0000 1625668404.188 369 100.112.0.63 TCP_MISS/200 227308 GET https://github.com/ - HIER_DIRECT/140.82.121.4 text/html "/CN=test.internal"
07/Jul/2021:14:33:50 +0000 1625668430.041 25 100.112.0.63 TCP_MISS/200 227578 GET https://github.com/ - HIER_DIRECT/140.82.121.4 text/html "/CN=test.internal"
07/Jul/2021:14:33:55 +0000 1625668435.218 39 100.112.0.63 TCP_MISS/200 227580 GET https://github.com/ - HIER_DIRECT/140.82.121.4 text/html "/CN=test.internal"
ฉันสูญเสียความคิดของฉันกับปัญหานี้ ฉันขอขอบคุณสำหรับความช่วยเหลือเกี่ยวกับเรื่องนี้