Mini Howto Subject : การทำ transparent redirector สำหรับ Squid Cache Proxy Server By : Pruet Boonma Date : Apr 4,1998 Update from : - License: สงวนลิขสิทธิ์เอกสารนี้ โดย พฤษภ์ บุญมา การเผยแพร่เอกสารนี้จะต้องอยู่ภายไต้ เงื่อนไขของ GNU General Public License เวอร์ชั่น 2.0 ที่ออกโดย Free Sofware Foundation กรุฒาอ่านรายละเอียดของ GPL ที่ Introduction : สำหรับ Internet Gateway ที่มีการทำ Cache Proxy Server อาจจะพบปัญหาว่า ผู้ใช้บางคน หรือว่าบางเครื่องไม่ยอม Set ที่ Web browser ของตัวเองให้ใช้ Proxy ดังนั้น ถ้าต้องการบังคับใช้ Proxy ก็อาจจะใช้ Transparent redirector ในการเปลี่ยน connection ของ Web Browser ที่ออกไปยัง Internet ภายนอกโดยตรงให้ผ่าน Proxy ก่อน ___________ ____________ ____________ | | | | | | |-->|in.tproxyd | ---->|Proxy Server| --->| Web Server | ________ | 81| | |____________| 80|____________| | | |___| | | Client | -------> | ipfwadm | |________| 80 | | | | |___________| Prerequire : 1. Squid Cache Proxy server 2. โปรแกรม in.tproxyd 3. Kernel ที่ support IP firewall, IP forwarding/Gateway และ IP transparent proxy การติดตั้งโปรแกรม หลังจาก Download แล้ว ให้ย้ายไปยัง directory /usr/sbin แล้วทำการ set executable mode โดย # chmod +x /usr/sbin/in.tproxyd เพื่อให้สามารถทำงานได้ เสร็จแล้วไปแก้ไข file /etc/services โดยดูจากตัวเลขใน column ที่สอง แล้วใส่ข้อความต่อไปนี้ลงใน บรรทัดที่เหมาะสม tproxy tcp/81 # Transparent Proxy ซึ่งควรจะอยู่ระหว่าง www 80/udp # HyperText Transfer Protocol กับ link 87/tcp ttylink การทำงานโดยใช้ inetd (Super Internet Service Daemon) in.tproxyd สามารถทำงานโดยใช้ inetd เรียกใช้ได้ ซึ่งจะมีข้อดีสำหรับ ระบบเล็ก ๆ ที่อาจจะไม่มี request มากนั้น โดย in.tproxyd จะไม่ทำงานค้างไว้ แต่จะถูก Start โดย inetd ซึ่งจะรอรับ request แทน แต่ว่าวิธีการนี้จะมีข้อเสียคือ ถ้ามี request เป็นจำนวนมาก inetd อาจจะไม่ยอมทำงานได้ การ setup in.tproxyd ใน inetd ทำได้โดยการเพิ่มข้อความต่อไปนี้ลงใน file /etc/inetd.conf tproxy stream tcp nowait nobody /usr/sbin/tcpd in.tproxyd 8080 เป็นการบอกว่า ถ้ามี connection เข้ามา (โดยทั่วไปจะเป็น port 81 ซึ่งจะจำกำหนดไว้ใน file /etc/services) โปรแกรม in.tproxyd ก็จำทำการ redirection connection ไปยัง port 8080 ของเครื่องที่เป็น proxy server ซึ่งอาจจะเป็น เครื่องเดียวกัน หรือว่า เป็นเครื่องอื่นก็ได้ แล้วก็ทำการ restart inetd โดย # kill -HUP `cat /var/run/inetd.pid` เสร็จ แล้วก็ใช้คำสั่ง ipfwadm เพื่อทำการ redirection connection จาก port 80 ไปยัง port 81 โดย สั่งดังนี้คือ # /sbin/ipfwadm -I -a reject -P tcp -D localhost 80 # /sbin/ipfwadm -I -a reject -P tcp -D / 80 # /sbin/ipfwadm -I -a accept -P tcp -D 0.0.0.0/0 80 -r 81 สำหรับเครืี่องที่ไม่มี web server # /sbin/ipfwadm -I -a accept -P tcp -D localhost 80 # /sbin/ipfwadm -I -a accept -P tcp -D / 80 # /sbin/ipfwadm -I -a accept -P tcp -D 0.0.0.0/0 80 -r 81 สำหรับเครื่องที่มี web server เมื่อทำการทดสอบแล้วว่าไม่มีปัญหา ก็ให้ใส่ชุดคำสั่ง ipfwadm ลงไปใน file /etc/rc.d/rc.inet1 การทำงานเป็น Stand alone server การทำงานแบบนี้ เหมาะสำหรับระบบที่มี request จำนวนมาก แต่จะกิน resource มากกว่าแบบ inetd การ start program ทำโดยการ run program เป็น daemon ดังตัวอย่าง # in.tproxyd -s 81 -r nobody 202.44.248.33 8080 & เป็นการ Start โปรแกรมให้รอรับ request ที่ port 81 และ ส่งต่อไปยัง port 8080 ของ proxy server ที่มี IP เป็น 202.44.248.33 โดยทำงานเป็น user nobody (ต้องมี user ชื่อ nobody อยู่จริงด้วย)เสร็จแล้ว ก็ใช้คำสั่ง ipfwadm เพื่อ redirection connection เหมือนด้านบน และเมื่อทดสอบแล้วไม่มีปัญหา ก็ให้ใส่ชุดคำสั่งเหล่านี้ลงไปใน file /etc/rc.d/rc.inet1 ด้วย ข้อสังเกตุ ระหว่างใช้งาน in.tproxyd จะสร้าง child process เป็นจำนวนมาก ตามจำนวน connection ที่เข้า ซึ่งสามารถ check ได้ด้วยว่า มาจากเครื่องไหนโดยพิมพ์คำสั่งต่อไปนี้ # netstat -an | grep "nobody" | grep ":80 " โดย column ที่สี่จะแสดง destination ของการติดต่อ column ที่ห้า จะแสดง source หรือเครื่องที่ทำการ request นั่นเอง เช่น ... tcp 0 0 209.1.236.83:80 203.150.214.46:64868 ESTABLISHED nobody tcp 0 0 204.152.167.21:80 203.150.214.46:64902 ESTABLISHED nobody ... แสดงว่า เครื่องที่มี IP 203.150.46 ทำการขอข้อมูลจาก web server ที่มี IP 203.1.236.83 และ 204.152.167.21 เป็นต้น