Sunday, June 15, 2008

ติดตั้ง Pfsense + Squid + squidGuard + lightsquid

บันทึกฉบับนี้เขียนถึงการติดตั้งและคอนฟิกซ์ Squid ทำงานร่วมกับ squidGuard (เป็นตัวกรองเว็บ) และ lightsquid (เป็นตัวเก็บสถิติ)

หลังจากติดตั้งและคอนฟิกซ์ pfSense เรียบร้อยแล้ว ทำการเพิ่ม add-on ที่จำเป็น ในที่นี้คือ proxy server ที่มีความสามารถสูง คือ Squid และโปรแกรมเสริมสำหรับ Squid ในการกรองเนื้อหาที่ไม่พึงประสงค์ (content filter) คือ squidGuard ที่ช่วยให้การบล็อกเว็บทำได้ง่ายขึ้นเยอะเลย

การเพิ่ม package ของ Squid และ squidGuard ให้เข้าไปที่เมนู System -> Packages แล้วติดตั้งทั้ง 2 โปรแกรม แล้วทำการคอนฟิกซ์ สำหรับกรณีของผมทำดังนี้
1.Squid ไปที่เมนู Service -> Proxy Server

Proxy server: General settings

Proxy Interface : LAN
Allow user on interface : check
Transparent proxy : check
Do NOT proxy Private Address Space (RFC 1918) : check
Enabled logging : check (โปรแกรมจะเลือกที่เก็บ log ให้ คือ /var/squid/log)
Proxy port : 3128 (หรือ 8080 ก็ได้)

(นอกนั้นว่างไว้...)
กด Save

Proxy server: Cache management
Hard disk cache size : 10000 MB. (ตอนแรกโปรแกรมกำหนดให้ 100 MB. ทั้งนี้ผมเพียงทดสอบเท่านั้น)
Hard disk cache location : โปรแกรมตั้งให้เป็น /var/squid/cache
Memory cache size : 180 (RAM 512 / 3 = 170.66 ผมเลือก 180 อิๆ...)

(นอกนั้นว่างไว้...)
กด Save

2.squidGuard ไปที่เมนู Service -> Proxy Content Filter

Proxy Content filter SquidGuard: General settings
Enable : check กด Aply
Blacklist : check (เป็นการเรียกใช้ไฟล์ blacklist ที่บรรจุเว็บที่ต้องการบล็อกไว้ ซึ่งจะเก็บไว้ที่ /var/db/squidGuard/)


(นอกนั้นว่างไว้...)
กด Save



Proxy Content filter SquidGuard: Default

Default destination : เลือก deni เป็นบางอัน...หรือจะทั้งหมดก็ได้ แต่อันสุดท้ายต้องเป็น Allow


Not to allow IP addresses in URL : check
Enable log : check (ไม่ check ก็ได้ เป็นการบันทึก log)

แค่นี้เองเหรอ...ทำไมมันง่ายจังหว่า..???

หมายเหตุ // work around
เราสามารถเก็บสถิติการใช้งานโดยเพิ่ม lightsquid เข้าไป โดยเมื่อได้ลองใช้ดูแล้วพบว่ามีบันทึกที่ค่อนข้างใช้ได้ และมีข้อสังเกตุดังนี้
  • หากเราไปตั้งค่าให้ rotate squid log มันจะเพิ่มคำสั่งใน crontab อัตโนมัติ...
    สำหรับผมได้ตั้งค่าให้ rotate ทุกวันศุกร์ ปรากฎว่าใน crontab จะมีบรรทัดเพิ่้มเข้ามาดังนี้...

    0 0 * * */1 root /usr/local/sbin/squid -k rotate > /dev/null

    รูปแบบ
    #minute hour mday month wday who command

    ผลคือ lightsquid ไม่ยอมทำงานในวันถัดไป ต้องกด refresh ในหน้า lightsquid แฮะ....

  • ลองแก้ crontab ให้แบ็คอัพ access.log (ใช้คำสั่ง cp /var/squid/log/access.log /home/shared/$DATE-access.log
    แต่ในการบู๊ตเครื่องครั้งต่อไป pfsense จะลบบรรทัดที่เราเพิ่มใน crontab ทิ้งไป ตอนนี้ยังหาวิธีการอยู่
  • ลองเอาคำสั่ง rotate จาก lightsquid ออก และกำลังรอดูผล...ปรากฎว่า ต้องกด refresh เหมือนเดิม...(ถ้าไม่ถึงชั่วโมง lightsquid จะไม่บันทึกผล โดยกรนีนี้ตั้งค่าให้เก็บ log ทุก 1 ชั่วโมง ผลคือ หากมีคำสั่ง rotate พอเปิดเครื่อง จะไม่เก็บ access.log แต่พอเอาคำสั่ง rotate ออก มันเริ่มเก็บทันที ...ยังแปลกใจอยู่...)
  • ลองเอาคำสั่ง cache_swap_low 90, cache_swap_high 95 ออก (cache_swap_low 90 เริ่มเก็บ cache เมื่อพื้นที่ 90 % ของ disk cache ที่ตั้งไว้, และเก็บจนถึง 95 % ของ disk cache) เดาว่าคำสั่งนี้อาจทำให้ squid ไม่ยอมเก็บ cache เพราะเราตั้ง cache ไว้ที่ 1000 MB. แต่ตอนนี้ใช้พื้นที่ไปเพียง 500 MB. คือ 50 % จึงยังไม่ถึง cache_swap_low ที่ตั้งไว้ 90 %
  • รอดูผล...access.log เริ่มเก็บแล้ว....
สรุป
  • การเก็บ log ด้วย lightsquid ต้อง เอา cache_swap, rotate ออก ...???
21 มิย. 51
  • เปิดเครื่องแล้ว squid ไม่เก็บ log เลย (access.log) ไม่ update
  • พอแก้ไขค่าอะไรซักอย่างใน squid แล้ว save มันก็เริ่มทำงาน....lightsquid เริ่มเก็บ (แปลว่าตัวแปรหลักคือ squid ไม่ใช่ lightsquid
  • ข้อสันนิษฐานที่ผ่านมาอาจผิดหมด...ตอนนี้ปัญหาที่ access.log ไม่เก็บนั้น คงมาจาก squid ที่เดียว...
  • ศึกษาขั้นตอนการทำงานของระบบ...
    ตอนบู๊ตเครื่องนั้นระบบจะเรียก squid จาก /usr/local/etc/rc.d/squid.sh ซึ่งมีรายละเอียดดังนี้

    #!/bin/sh
    # This file was automatically generated
    # by the pfSense service handler.

    rc_start() {
    if [ -z "`ps auxw | grep "[s]quid -D"|awk '{print $2}'`" ];then
    /usr/local/sbin/squid -D
    fi

    }

    rc_stop() {
    /usr/local/sbin/squid -k shutdown
    # Just to be sure...
    sleep 5
    killall -9 squid 2>/dev/null
    killall pinger 2>/dev/null

    }

    case $1 in
    start)
    rc_start
    ;;
    stop)
    rc_stop
    ;;
    restart)
    rc_stop
    rc_start
    ;;
    esac
25 มิ.ย. 51
ระบบมันทำงานอยู่นะ...เอ...มันยังไงหว่า รึว่าเราคิดมากไปเอง...???

26 มิ.ย. 51
ได้ทำ custom error page แล้ว...วิธีการจะมา update วันหลัง....