ค้นหาเว็บไซต์

การกำหนดค่า Squid Proxy Server ด้วยการเข้าถึงแบบจำกัด และการตั้งค่าไคลเอ็นต์ให้ใช้ Proxy - ส่วนที่ 5


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

ขอแนะนำโปรแกรมการรับรอง Linux Foundation

ในส่วนที่ 1 ของซีรีส์นี้ เราได้แสดงวิธีการติดตั้ง squid ซึ่งเป็นเซิร์ฟเวอร์แคชพร็อกซีสำหรับเว็บไคลเอ็นต์ โปรดดูโพสต์นั้น (ลิงก์ด้านล่าง) ก่อนดำเนินการต่อหากคุณยังไม่ได้ติดตั้ง squid ในระบบของคุณ

  1. ส่วนที่ 1 – ติดตั้งบริการเครือข่ายและการกำหนดค่าการเริ่มต้นอัตโนมัติเมื่อบู๊ต

ในบทความนี้ เราจะแสดงวิธีกำหนดค่าพร็อกซีเซิร์ฟเวอร์ Squid เพื่อให้อนุญาตหรือจำกัดการเข้าถึงอินเทอร์เน็ต และวิธีการกำหนดค่าไคลเอ็นต์ http หรือเว็บเบราว์เซอร์ เพื่อใช้พร็อกซีเซิร์ฟเวอร์นั้น

การตั้งค่าสภาพแวดล้อมการทดสอบของฉัน

เซิร์ฟเวอร์ปลาหมึก
Operating System :	Debian Wheezy 7.5
IP Address 	 :	192.168.0.15
Hostname	 :	dev2.gabrielcanepa.com.ar
เครื่องไคลเอนต์ 1
Operating System :	Ubuntu 12.04
IP Address 	 :	192.168.0.104 
Hostname	 :	ubuntuOS.gabrielcanepa.com.ar
เครื่องไคลเอนต์ 2
Operating System :	CentOS-7.0-1406
IP Address 	 :	192.168.0.17 
Hostname	 :	dev1.gabrielcanepa.com.ar

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

คุณอาจสงสัยว่าเหตุใดฉันจึงต้องการเพิ่มซอฟต์แวร์อีกชิ้นลงในโครงสร้างพื้นฐานเครือข่ายของฉัน

นี่คือเหตุผล 3 อันดับแรก:

1. Squid เก็บไฟล์จากคำขอก่อนหน้าเพื่อเร่งการถ่ายโอนในอนาคต ตัวอย่างเช่น สมมติว่า client1 ดาวน์โหลด CentOS-7.0-1406-x86_64-DVD.iso จากอินเทอร์เน็ต เมื่อ ไคลเอนต์ 2 ร้องขอการเข้าถึงไฟล์เดียวกัน squid สามารถถ่ายโอนไฟล์จากแคชแทนที่จะดาวน์โหลดอีกครั้งจากอินเทอร์เน็ต ตามที่คุณสามารถเดาได้ คุณสามารถใช้คุณสมบัตินี้เพื่อเพิ่มความเร็วในการถ่ายโอนข้อมูลในเครือข่ายคอมพิวเตอร์ที่ต้องการการอัพเดตบางประเภทบ่อยครั้ง

2. ACLs (รายการควบคุมการเข้าถึง) ช่วยให้เราสามารถจำกัดการเข้าถึงเว็บไซต์ และ/หรือตรวจสอบการเข้าถึงตามผู้ใช้แต่ละราย คุณสามารถจำกัดการเข้าถึงตามวันในสัปดาห์หรือเวลาของวัน หรือโดเมน เป็นต้น

3. การข้ามตัวกรองเว็บ เกิดขึ้นได้โดยใช้เว็บพรอกซีที่มีการร้องขอและส่งคืนเนื้อหาที่ร้องขอไปยังไคลเอนต์ แทนที่จะให้ลูกค้าร้องขอโดยตรงไปยังอินเทอร์เน็ต

ตัวอย่างเช่น สมมติว่าคุณเข้าสู่ระบบใน client1 และต้องการเข้าถึง www.facebook.com ผ่านเราเตอร์ของบริษัทของคุณ เนื่องจากไซต์อาจถูกบล็อกโดยนโยบายของบริษัท คุณจึงสามารถเชื่อมต่อกับเว็บพร็อกซีเซิร์ฟเวอร์แทนและขอให้เว็บไซต์ขอเข้าถึง www.facebook.com ได้ เนื้อหาระยะไกลจะถูกส่งกลับมาให้คุณผ่านทางเว็บพร็อกซีเซิร์ฟเวอร์อีกครั้ง โดยข้ามนโยบายการบล็อกของเราเตอร์ของบริษัทคุณ

การกำหนดค่า Squid – พื้นฐาน

รูปแบบการควบคุมการเข้าถึงของเว็บพร็อกซีเซิร์ฟเวอร์ Squid ประกอบด้วยสององค์ประกอบที่แตกต่างกัน:

  1. องค์ประกอบ ACL เป็นบรรทัดคำสั่งที่ขึ้นต้นด้วยคำว่า "acl" และแสดงถึงประเภทของการทดสอบที่ดำเนินการกับธุรกรรมคำขอใดๆ
  2. กฎรายการการเข้าถึงประกอบด้วยการดำเนินการ อนุญาต หรือ ปฏิเสธ ตามด้วยองค์ประกอบ ACL จำนวนหนึ่ง และใช้เพื่อระบุการกระทำหรือข้อจำกัดที่มี ที่จะบังคับใช้ตามคำขอที่กำหนด มีการตรวจสอบตามลำดับ และการค้นหารายการจะสิ้นสุดลงทันทีที่กฎข้อใดข้อหนึ่งตรงกัน หากกฎมีองค์ประกอบ ACL หลายรายการ กฎนั้นจะถูกนำไปใช้เป็นการดำเนินการ AND แบบบูลีน (องค์ประกอบ ACL ทั้งหมดของกฎจะต้องตรงกันเพื่อให้กฎตรงกัน)

ไฟล์การกำหนดค่าหลักของ Squid คือ /etc/squid/squid.conf ซึ่งมีความยาว ~5000 บรรทัด เนื่องจากมีทั้งคำสั่งการกำหนดค่าและเอกสารประกอบ ด้วยเหตุนี้ เราจะสร้างไฟล์ squid.conf ใหม่โดยมีเพียงบรรทัดที่มีคำสั่งการกำหนดค่าเพื่อความสะดวกของเรา โดยไม่เว้นบรรทัดว่างหรือแสดงความคิดเห็นไว้ โดยเราจะใช้คำสั่งต่อไปนี้

mv /etc/squid/squid.conf /etc/squid/squid.conf.bkp

แล้ว

grep -Eiv '(^#|^$)' /etc/squid/squid.conf.bkp

OR

grep -ve ^# -ve ^$ /etc/squid/squid.conf.bkp > /etc/squid/squid.conf

ตอนนี้ ให้เปิดไฟล์ squid.conf ที่สร้างขึ้นใหม่ และค้นหา (หรือเพิ่ม) องค์ประกอบ ACL และรายการเข้าถึงต่อไปนี้

acl localhost src 127.0.0.1/32
acl localnet src 192.168.0.0/24

สองบรรทัดด้านบนแสดงถึงตัวอย่างพื้นฐานของการใช้งานองค์ประกอบ ACL

  1. คำแรก acl ระบุว่านี่คือบรรทัดคำสั่งองค์ประกอบ ACL
  2. คำที่สอง localhost หรือ localnet ระบุชื่อสำหรับคำสั่ง
  3. คำที่สาม src ในกรณีนี้คือประเภทองค์ประกอบ ACL ที่ใช้เพื่อแสดงที่อยู่ IP ของลูกค้าหรือช่วงที่อยู่ ตามลำดับ คุณสามารถระบุโฮสต์เดียวตาม IP (หรือชื่อโฮสต์ หากคุณมีการใช้การแก้ไข DNS บางประเภท) หรือตามที่อยู่เครือข่าย
  4. พารามิเตอร์ที่สี่คืออาร์กิวเมนต์การกรองที่ “ป้อน ” ไปยังคำสั่ง

บรรทัดสองบรรทัดด้านล่างคือกฎ รายการเข้าถึง และแสดงถึงการใช้งานคำสั่ง ACL ที่กล่าวถึงก่อนหน้านี้อย่างชัดเจน กล่าวสั้นๆ ก็คือระบุว่าควรให้สิทธิ์ การเข้าถึง http หากคำขอมาจากเครือข่ายท้องถิ่น (localnet) หรือจาก localhost โดยเฉพาะเครือข่ายท้องถิ่นที่ได้รับอนุญาตหรือที่อยู่โฮสต์ท้องถิ่นคืออะไร? คำตอบคือ: สิ่งที่ระบุไว้ในคำสั่ง localhost และ localnet

http_access allow localnet
http_access allow localhost

ณ จุดนี้ คุณสามารถรีสตาร์ท Squid เพื่อใช้การเปลี่ยนแปลงที่รอดำเนินการ

service squid restart 		[Upstart / sysvinit-based distributions]
systemctl restart squid.service 	[systemd-based distributions]

จากนั้นกำหนดค่าเบราว์เซอร์ไคลเอ็นต์ในเครือข่ายท้องถิ่น (192.168.0.104 ในกรณีของเรา) เพื่อเข้าถึงอินเทอร์เน็ตผ่านพร็อกซีของคุณดังนี้

ในไฟร์ฟอกซ์

1. ไปที่เมนู แก้ไข และเลือกตัวเลือก การตั้งค่า

2. คลิกที่ ขั้นสูง จากนั้นบนแท็บ เครือข่าย และสุดท้ายคลิกที่ การตั้งค่า...

3. ตรวจสอบการกำหนดค่าพร็อกซีด้วยตนเอง และป้อนที่อยู่ IP ของพร็อกซีเซิร์ฟเวอร์และพอร์ตที่กำลังฟังอยู่ สำหรับการเชื่อมต่อ

หมายเหตุ โดยค่าเริ่มต้น Squid จะรับฟังพอร์ต 3128 แต่คุณสามารถแทนที่การทำงานนี้ได้โดยแก้ไข รายการเข้าถึง กฎที่ขึ้นต้นด้วย http_port (โดยค่าเริ่มต้นจะอ่านว่า http_port 3128)

4. คลิก ตกลง เพื่อใช้การเปลี่ยนแปลง เท่านี้ก็เรียบร้อย

การตรวจสอบว่าไคลเอนต์กำลังเข้าถึงอินเทอร์เน็ต

ตอนนี้คุณสามารถตรวจสอบได้ว่าไคลเอ็นต์เครือข่ายท้องถิ่นของคุณกำลังเข้าถึงอินเทอร์เน็ตผ่านพรอกซีของคุณดังนี้

1. ในไคลเอนต์ของคุณ เปิด เทอร์มินัล แล้วพิมพ์

ip address show eth0 | grep -Ei '(inet.*eth0)'

คำสั่งนั้นจะแสดง ที่อยู่ IP ปัจจุบันของลูกค้าของคุณ (192.168.0.104 ในภาพต่อไปนี้)

2. ในไคลเอนต์ของคุณ ให้ใช้เว็บเบราว์เซอร์เพื่อเปิดเว็บไซต์ใดก็ได้ (linux-console.net ในกรณีนี้)

3. ในเซิร์ฟเวอร์ ให้เรียกใช้

tail -f /var/log/squid/access.log

และคุณจะได้รับมุมมองสดของคำขอที่ให้บริการผ่าน Squid

การจำกัดการเข้าถึงโดยไคลเอ็นต์

ตอนนี้ สมมติว่าคุณต้องการปฏิเสธการเข้าถึงที่อยู่ IP ไคลเอ็นต์นั้นอย่างชัดเจน ในขณะที่ยังคงรักษาการเข้าถึงสำหรับส่วนที่เหลือของเครือข่ายท้องถิ่น

1. กำหนดคำสั่ง ACL ใหม่ดังนี้ (ฉันตั้งชื่อมันว่า ubuntuOS แต่คุณสามารถตั้งชื่อมันได้ตามต้องการ)

acl ubuntuOS src 192.168.0.104

2. เพิ่มคำสั่ง ACL ไปยังรายการ การเข้าถึง localnet ที่มีอยู่แล้ว แต่นำหน้าด้วยเครื่องหมายอัศเจรีย์ ซึ่งหมายความว่า “อนุญาตให้เข้าถึงอินเทอร์เน็ตแก่ลูกค้าที่ตรงกับคำสั่ง localnet ACL ยกเว้นรายการที่ตรงกับคำสั่ง ubuntuOS

http_access allow localnet !ubuntuOS

3. ตอนนี้เราต้องรีสตาร์ท Squid เพื่อใช้การเปลี่ยนแปลง ถ้าเราพยายามเรียกดูไซต์ใด ๆ เราจะพบว่าการเข้าถึงถูกปฏิเสธในขณะนี้

การกำหนดค่า Squid – การปรับแต่งแบบละเอียด

การจำกัดการเข้าถึงตามโดเมน และ/หรือ ตามเวลาของวัน/วันในสัปดาห์

หากต้องการจำกัดการเข้าถึง Squid ตามโดเมน เราจะใช้คีย์เวิร์ด dstdomain ในคำสั่ง ACL ดังต่อไปนี้

acl forbidden dstdomain "/etc/squid/forbidden_domains"

โดยที่ forbidden_domains เป็นไฟล์ข้อความธรรมดาที่มีโดเมนที่เราต้องการที่จะปฏิเสธการเข้าถึง

สุดท้ายนี้ เราต้องให้สิทธิ์การเข้าถึง Squid สำหรับคำขอที่ไม่ตรงกับคำสั่งข้างต้น

http_access allow localnet !forbidden

หรือบางทีเราอาจต้องการอนุญาตให้เข้าถึงไซต์เหล่านั้นในช่วงเวลาหนึ่งของวันเท่านั้น (10:00 ถึง 11:00 น.) เฉพาะใน วันจันทร์ (M) วันพุธ (W) และ วันศุกร์ (F)

acl someDays time MWF 10:00-11:00
http_access allow forbidden someDays
http_access deny forbidden

มิฉะนั้น การเข้าถึงโดเมนเหล่านั้นจะถูกบล็อก

การจำกัดการเข้าถึงโดยการรับรองความถูกต้องของผู้ใช้

Squid รองรับกลไกการรับรองความถูกต้องหลายอย่าง (พื้นฐาน, NTLM, Digest, SPNEGO และ Oauth) และตัวช่วย (ฐานข้อมูล SQL, LDAP, NIS, NCSA และอื่นๆ อีกมากมาย) ในบทช่วยสอนนี้ เราจะใช้การตรวจสอบสิทธิ์ขั้นพื้นฐานกับ NCSA

เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/squid/squid.conf ของคุณ

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
auth_param basic credentialsttl 30 minutes
auth_param basic casesensitive on
auth_param basic realm Squid proxy-caching web server for Tecmint's LFCE series
acl ncsa proxy_auth REQUIRED
http_access allow ncsa

หมายเหตุ: ใน CentOS 7 ปลั๊กอิน NCSA สำหรับ squid สามารถพบได้ใน /usr/lib64/squid/basic_nsca_auth ดังนั้นให้เปลี่ยนตามบรรทัดด้านบน

คำชี้แจงบางประการ:

  1. เราจำเป็นต้องบอก Squid ว่าโปรแกรมตัวช่วยตรวจสอบความถูกต้องตัวใดที่จะใช้กับคำสั่ง auth_param โดยการระบุชื่อของโปรแกรม (ส่วนใหญ่จะเป็น /usr/lib/squid/ncsa_auth หรือ /usr/lib64/squid/basic_nsca_auth) รวมถึงตัวเลือกบรรทัดคำสั่ง (/etc/squid/passwd ในกรณีนี้) หากจำเป็น
  2. ไฟล์ /etc/squid/passwd สร้างขึ้นผ่าน htpasswd ซึ่งเป็นเครื่องมือในการจัดการการตรวจสอบสิทธิ์ขั้นพื้นฐานผ่านไฟล์ มันจะช่วยให้เราเพิ่มรายการชื่อผู้ใช้ (และรหัสผ่านที่เกี่ยวข้อง) ที่จะได้รับอนุญาตให้ใช้ Squid
  3. ข้อมูลรับรองsttl 30 นาที จะต้องป้อนชื่อผู้ใช้และรหัสผ่านของคุณทุกๆ 30 นาที (คุณสามารถระบุช่วงเวลานี้ด้วยชั่วโมงได้เช่นกัน)
  4. เปิด casesensitive แสดงว่าชื่อผู้ใช้และรหัสผ่านคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
  5. ขอบเขต แสดงถึงข้อความของกล่องโต้ตอบการตรวจสอบสิทธิ์ที่จะใช้ในการตรวจสอบสิทธิ์กับ squid
  6. สุดท้ายนี้ จะมีการให้สิทธิ์เข้าถึงเมื่อการตรวจสอบสิทธิ์พร็อกซี (proxy_auth REQUIRED) สำเร็จเท่านั้น

เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์และเพิ่มข้อมูลรับรองสำหรับผู้ใช้ gacanepa (ละเว้นแฟล็ก -c หากมีไฟล์อยู่แล้ว)

htpasswd -c /etc/squid/passwd gacanepa

เปิดเว็บเบราว์เซอร์ในเครื่องไคลเอนต์แล้วลองเรียกดูไซต์ที่กำหนด

หากการรับรองความถูกต้องสำเร็จ จะมีการให้สิทธิ์การเข้าถึงทรัพยากรที่ร้องขอ มิฉะนั้นการเข้าถึงจะถูกปฏิเสธ

การใช้แคชเพื่อเร่งการถ่ายโอนข้อมูล

หนึ่งในคุณสมบัติที่โดดเด่นของ Squid คือความเป็นไปได้ในการแคชทรัพยากรที่ร้องขอจากเว็บไปยังดิสก์ เพื่อเร่งความเร็วในการร้องขอวัตถุเหล่านั้นในอนาคตโดยไคลเอนต์เดียวกันหรือผู้อื่น

เพิ่มคำสั่งต่อไปนี้ในไฟล์ squid.conf ของคุณ

cache_dir ufs /var/cache/squid 1000 16 256
maximum_object_size 100 MB
refresh_pattern .*\.(mp4|iso) 2880

คำชี้แจงบางประการเกี่ยวกับคำสั่งข้างต้น

  1. ufs เป็นรูปแบบการจัดเก็บ Squid
  2. /var/cache/squid เป็นไดเร็กทอรีระดับบนสุดที่จะจัดเก็บไฟล์แคช ไดเร็กทอรีนี้ต้องมีอยู่และสามารถเขียนได้โดย Squid (Squid จะไม่สร้างไดเร็กทอรีนี้ให้คุณ)
  3. 1000 คือจำนวน (เป็น MB) ที่จะใช้ภายใต้ไดเร็กทอรีนี้
  4. 16 คือจำนวนของไดเรกทอรีย่อยระดับ 1 ในขณะที่ 256 คือจำนวนของไดเรกทอรีย่อยระดับ 2 ภายใน /var/spool/squid
  5. คำสั่ง maximum_object_size ระบุขนาดสูงสุดของวัตถุที่อนุญาตในแคช
  6. refresh_pattern บอก Squid ถึงวิธีจัดการกับไฟล์บางประเภท (.mp4 และ .iso ในกรณีนี้) และระยะเวลาที่ควรจัดเก็บไฟล์ที่ร้องขอ อ็อบเจ็กต์ในแคช (2880 นาที=2 วัน)

2880 ตัวแรกและตัวที่สองเป็นขีดจำกัดล่างและบน ตามลำดับ เกี่ยวกับระยะเวลาที่ออบเจ็กต์ที่ไม่มีเวลาหมดอายุที่ชัดเจนจะถือเป็นรายการล่าสุด และจะถูกให้บริการโดยแคช ในขณะที่ 0% คือเปอร์เซ็นต์ของอายุของออบเจ็กต์ (เวลาตั้งแต่การแก้ไขครั้งล่าสุด) ที่แต่ละออบเจ็กต์ที่ไม่มีเวลาหมดอายุที่ชัดเจนจะถือเป็นรายการล่าสุด

กรณีศึกษา: การดาวน์โหลดไฟล์ .mp4 จากไคลเอนต์ 2 ตัวที่แตกต่างกันและทดสอบแคช

ไคลเอนต์รายแรก (IP 192.168.0.104) ดาวน์โหลดไฟล์ 71 MB .mp4 ใน 2 นาที 52 วินาที

ไคลเอนต์ที่สอง (IP 192.168.0.17) ดาวน์โหลดไฟล์เดียวกันใน 1.4 วินาที!

นั่นเป็นเพราะว่าไฟล์นั้นให้บริการจาก Squid cache (ระบุโดย TCP_HIT/200) ในกรณีที่สอง ตรงข้ามกับอินสแตนซ์แรก เมื่อดาวน์โหลดโดยตรงจาก อินเทอร์เน็ต (แสดงโดย TCP_MISS/200)

คำหลัก HIT และ MISS พร้อมด้วยโค้ดตอบกลับ 200 http ระบุว่าไฟล์ถูกให้บริการสำเร็จทั้งสองครั้ง แต่แคชกลับกลายเป็น HIT และพลาดตามลำดับ เมื่อแคชไม่สามารถให้บริการคำขอได้ด้วยเหตุผลบางประการ Squid จะพยายามให้บริการจากอินเทอร์เน็ต

บทสรุป

ในบทความนี้ เราได้กล่าวถึงวิธีการตั้งค่า Squid web caching proxy คุณสามารถใช้พร็อกซีเซิร์ฟเวอร์เพื่อกรองเนื้อหาโดยใช้เกณฑ์ที่เลือก และยังช่วยลดเวลาแฝง (เนื่องจากมีการร้องขอขาเข้าที่เหมือนกันจากแคช ซึ่งอยู่ใกล้กับไคลเอนต์มากกว่าเว็บเซิร์ฟเวอร์ที่ให้บริการเนื้อหาจริง ส่งผลให้เร็วขึ้น การถ่ายโอนข้อมูล) และการรับส่งข้อมูลเครือข่ายด้วย (ลดปริมาณแบนด์วิธที่ใช้ ซึ่งจะช่วยประหยัดเงินหากคุณจ่ายค่ารับส่งข้อมูล)

คุณอาจต้องการอ้างอิงถึงเว็บไซต์ Squid สำหรับเอกสารเพิ่มเติม (โปรดตรวจสอบวิกิด้วย) แต่อย่าลังเลที่จะติดต่อเราหากคุณมีคำถามหรือความคิดเห็น เรายินดีเป็นอย่างยิ่งที่ได้รับการติดต่อจากคุณ!