กำหนดค่า Squid ให้เป็น HTTPS forward proxy หรือไม่?


9

ต่อไปนี้เป็นข้อมูลพื้นฐานเกี่ยวกับปัญหาของฉัน:

  • ฉันมีบริการเว็บที่ทำงานบน Heroku ด้วยที่อยู่ IP แบบไดนามิก IP แบบคงที่ใน Heroku ไม่ใช่ตัวเลือก
  • ฉันต้องเชื่อมต่อกับบริการเว็บภายนอกซึ่งอยู่หลังไฟร์วอลล์ บุคคลที่ดำเนินการบริการเว็บภายนอกจะเปิดไฟร์วอลล์ของพวกเขาไปยัง IP แบบคงที่เฉพาะเท่านั้น

โซลูชันที่ฉันพยายามทำคือใช้ Squid บนเซิร์ฟเวอร์แยกต่างหากที่มี IP คงที่เพื่อส่งต่อคำขอพรอกซีจาก Heroku ไปยังบริการภายนอก ด้วยวิธีนี้บริการภายนอกจะเห็น IP แบบคงที่ของพร็อกซีเซิร์ฟเวอร์เสมอแทนที่จะเป็น IP แบบไดนามิกของบริการ Heroku

เนื่องจากพร็อกซีเซิร์ฟเวอร์ของฉันไม่สามารถใช้ที่อยู่ IP สำหรับการตรวจสอบความถูกต้อง (นั่นเป็นปัญหาที่ต้องเริ่มต้นด้วย!) จึงต้องใช้ชื่อผู้ใช้และรหัสผ่าน นอกจากนี้ชื่อผู้ใช้และรหัสผ่านไม่สามารถส่งเป็นข้อความที่ชัดเจนได้เพราะหากผู้โจมตีต้องสกัดกั้นข้อความที่ชัดเจนพวกเขาสามารถเชื่อมต่อกับพร็อกซีของฉันที่แสร้งทำเป็นฉัน ไฟร์วอลล์ของบริการเว็บ

ดังนั้น Squid proxy ต้องยอมรับการเชื่อมต่อผ่าน HTTPS ไม่ใช่ HTTP (การเชื่อมต่อกับบริการเว็บภายนอกอาจเป็น HTTP หรือ HTTPS)

ฉันกำลังใช้งาน Squid 3.1.10 บน CentOS 6.5.x และนี่คือของฉันsquid.confจนถึงตอนนี้ สำหรับวัตถุประสงค์ในการแก้ไขปัญหาเท่านั้นฉันได้เปิดใช้งานพร็อกซี่ HTTP และ HTTPS ชั่วคราวชั่วคราว แต่ฉันต้องการใช้ HTTPS เท่านั้น

#
# Recommended minimum configuration:
#
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7       # RFC 4193 local private network range
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80      # http
acl Safe_ports port 21      # ftp
acl Safe_ports port 443     # https
acl Safe_ports port 70      # gopher
acl Safe_ports port 210     # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280     # http-mgmt
acl Safe_ports port 488     # gss-http
acl Safe_ports port 591     # filemaker
acl Safe_ports port 777     # multiling http
acl CONNECT method CONNECT

# Authorization

auth_param digest program /usr/lib64/squid/digest_pw_auth -c /etc/squid/squid_passwd
auth_param digest children 20 startup=0 idle=1
auth_param digest realm squid
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50

acl authenticated proxy_auth REQUIRED

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
#http_access allow localhost
http_access allow authenticated

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3128

https_port 3129 cert=/etc/squid/ssl/cert.pem key=/etc/squid/ssl/key.pem

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Disable all caching
cache deny all

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp:       1440    20% 10080
refresh_pattern ^gopher:    1440    0%  1440
refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
refresh_pattern .       0   20% 4320

เมื่อใช้การตั้งค่านี้การส่ง HTTP HTTP จะทำงานได้ดี แต่ HTTPS proxying ไม่ทำงาน

นี่คือคำขอพร็อกซี HTTP จากกล่องภายในเครื่อง:

$ curl --proxy http://my-proxy-server.example:3128 \
  --proxy-anyauth --proxy-user redacted:redacted -w '\n' \
  http://urlecho.appspot.com/echo?body=OK
OK

ดีนั่นคือสิ่งที่ฉันคาดไว้ ผลลัพธ์ในบรรทัดใน/var/log/squid/access.log:

1390250715.137     41 my.IP.address.redacted TCP_MISS/200 383 GET http://urlecho.appspot.com/echo? redacted DIRECT/74.125.142.141 text/html

นี่คือคำขออื่นคราวนี้ใช้ HTTPS:

$ curl --proxy https://my-proxy-server.example:3129 \
  --proxy-anyauth --proxy-user redacted:redacted -w '\n' \
  http://urlecho.appspot.com/echo?body=OK

curl: (56) Recv failure: Connection reset by peer

ไม่มีอะไรaccess.logหลังจากนี้ แต่ในcache.log:

2014/01/20 20:46:15| clientNegotiateSSL: Error negotiating SSL connection on FD 10: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request (1/-1)

นี่คือข้างต้นอีกครั้ง verbosely เพิ่มเติม:

$ curl -v --proxy https://my-proxy-server.example:3129 \
  --proxy-anyauth --proxy-user redacted:redacted -w '\n' \
  http://urlecho.appspot.com/echo?body=OK
* Adding handle: conn: 0x7f9a30804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f9a30804000) send_pipe: 1, recv_pipe: 0
* About to connect() to proxy my-proxy-server.example port 3129 (#0)
*   Trying proxy.server.IP.redacted...
* Connected to my-proxy-server.example (proxy.server.IP.redacted) port 3129 (#0)
> GET http://urlecho.appspot.com/echo?body=OK HTTP/1.1
> User-Agent: curl/7.30.0
> Host: urlecho.appspot.com
> Accept: */*
> Proxy-Connection: Keep-Alive
> 
* Recv failure: Connection reset by peer
* Closing connection 0

curl: (56) Recv failure: Connection reset by peer

ดูเหมือนว่าข้อผิดพลาด SSL อย่างไรก็ตามฉันใช้ใบรับรอง SSL โดเมนย่อย - ไวด์การ์ดอีกครั้งซึ่งแสดงในการกำหนดค่าด้านบนเป็นcert.pemและkey.pemฉันได้ติดตั้งบนเว็บเซิร์ฟเวอร์อื่นเรียบร้อยแล้ว นอกจากนี้การเข้าถึงพร็อกซีเซิร์ฟเวอร์โดยตรงด้วย curl works หรืออย่างน้อยก็สร้างการเชื่อมต่อผ่านขั้นตอน SSL:

$ curl https://my-proxy-server.example:3129
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ERROR: The requested URL could not be retrieved</title>

[--SNIP--]

<div id="content">
<p>The following error was encountered while trying to retrieve the URL: <a href="https://serverfault.com/">/</a></p>

<blockquote id="error">
<p><b>Invalid URL</b></p>
</blockquote>

<p>Some aspect of the requested URL is incorrect.</p>

<p>Some possible problems are:</p>
<ul>
<li><p>Missing or incorrect access protocol (should be <q>http://</q> or similar)</p></li>
<li><p>Missing hostname</p></li>
<li><p>Illegal double-escape in the URL-Path</p></li>
<li><p>Illegal character in hostname; underscores are not allowed.</p></li>
</ul>

[--SNIP--]

ความคิดใดที่ฉันทำผิด สิ่งที่ฉันพยายามเป็นไปได้หรือไม่ ขอบคุณล่วงหน้า.


2
ฉันไม่คิดว่านั่นเป็นวิธีที่ Squid ควรจะทำงาน ฉันควรจะทำการร้องขอ HTTP หรือ HTTPS อย่างใดอย่างหนึ่งผ่านการเชื่อมต่อ HTTPS ฉันไม่เห็นสิ่งใดในเอกสารเพื่อแนะนำเป็นอย่างอื่น ฉันลองทำตามที่คุณแนะนำแล้วและมันก็ไม่ได้ผล (เหมือนผลด้านบน)
David

ความคิดเห็นก่อนหน้าของฉันคือตอบความคิดเห็นจากผู้ใช้รายอื่นที่ดูเหมือนจะถูกลบไปแล้ว เพิ่งทราบว่าฉันข้ามคำถามนี้ไปยังรายชื่อผู้รับจดหมาย Squid: mail-archive.com/squid-users@squid-cache.org/msg93592.html
David

ในฐานะคนที่มีสถานการณ์คล้ายกันเราลองใช้วิธีพร็อกซี่สำเร็จแล้วและชอบที่จะย้ายแอปพลิเคชันออกจาก Heroku ไปยังผู้ให้บริการเช่น Virtual / Dedicated machine ด้วย IP แบบคงที่ มีค่าใช้จ่ายเพิ่มเติมในการบำรุงรักษาพร็อกซีเซิร์ฟเวอร์ไปข้างหน้าเพียงเพื่อจุดประสงค์นี้
Shyam Sundar CS

คำตอบ:


1

@ David ตามเธรดของคุณใน Squid ML - ฉันขอแนะนำให้ไปกับวิธีแก้ปัญหา Stunnel การรับรองความถูกต้องของคุณจะเป็น SSL certs ที่ปลายทั้งสองของอุโมงค์ส่วนที่เหลือจะเป็น "ข้อความที่ชัดเจน" ภายในอุโมงค์นั้นหรือคุณสามารถทำ Digest ได้ตามที่คุณต้องการ

ฉันใช้โซลูชันที่คล้ายกันเพื่อ "รับรองความถูกต้อง" จุดสิ้นสุด NFS ด้วยความสำเร็จที่ยิ่งใหญ่

ตัวอย่างการใช้งานการตรวจสอบความถูกต้องสามารถดูได้ในการสื่อสารที่ปลอดภัยของ LinuxGazette กับ stunnel


1

คุณสามารถดูวิธีการก็ทำในภาพหางเล็ก ๆ นี้: yegor256 / ปลาหมึกพร็อกซี่ ปัญหาเกี่ยวกับรหัสของคุณคือการกำหนดค่าไปหลังจากaclคำแนะนำ เพียงสลับพวกมันและทุกอย่างก็จะเริ่มทำงาน

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