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 :
การติดตั้งโปรแกรม
หลังจาก 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 <your-proxy-server>
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 <ip of local network>/<netmask> 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 <ip of local network>/<bits-in-net> 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 เป็นต้น