Ta có thể cài đặt chương trình Squid một cách dể dàng và nhanh chóng trong Ubuntu Linux bằng cách thực thi lênh sau.
Với cách cài đặt này ta chấp nhận sử dụng mặc định các cấu hình của Squid. Chương trình sẽ tự động cấu hình và thực thi tạo đĩa cache trên máy.
# sudo apt-get install squid3
Trang 74
Đây là cách làm phổ biến bởi những nhà phát hành hệ điều hành Ubuntu đã cấu hình chương trình sao cho nó hoạt động tốt nhất.
3.2. Những lƣu ý khi trƣớc khi khởi động
3.2.1. Những tham số tùy chọn khi khởi động Squid
Trước khi thực thi Squid, ta nên biết về một số tùy chọn của nó. Nhiều trong số tùy chọn này có thể sẽ không bao giờ được sử dụng và một số lại rất hữu dùng khi để kiểm lỗi.
-a port chỉ ra một giá trị http_port khác khi thực thi và giá trị này sẽ được ưu tiên hơn trong tập tin cấu hình squid.conf. Ta có thể cấu hình nhiều cổng trong squid.conf và –a sẽ chỉ ghi đè cổng đầu tiên.
-d level chỉ cấp độ gửi thông điệp lỗi.
-f file yêu cầu dùng tập tin squid.conf dự phòng thay cho tập tin squid.conf mặc định.
-k function thực thi những thao tác quản trị. Tham số function có thể là một trong số sau: reconfigure, rotate, shutdown, interrupt, kill, debug, check, parse. Mỗi hàm thực hiện một thao tác khác nhau và rất hữu dụng. Reconfigure yêu cầu Squid đọc lại file squid.conf. Rotate yêu cầu Squid quay file log của nó, tức là đóng file, nếu có thể thì đổi tên file và cuối cùng là mở lại file đó hoặc tạo file mới với trùng tên khi file log kia đã được đổi tên. Shutdown sẽ kết thúc chương trình. Interrupt cũng sẽ kết thúc chương trình ngay lập tức mà không đợi những giao tác đang thực thi kết thúc. Kill để dùng để ngắt chương trình Squid nếu Squid đang bị lỗi và không thể tắt được. Đây là biện pháp cuối cùng. Debug sẽ đưa chương trình Squid vào trạng thái bẫy lỗi. Check chỉ đơn giản làm nhiệm vụ kiểm tra tiến trình Squid đang chạy. Parse sẽ kiểm tra lỗi cú pháp trong squid.conf.
-u port chỉ cổng ICP sẽ sử dụng.
Trang 75
-z dùng để khởi tạo cache. Ta phải sử dụng tùy chọn này khi lần đầu tiên chạy Squid hoặc khi ta thêm một thư mục cache mới.
-D buộc Squid không kiểm tra DNS. Thường Squid sẽ không thực thi chừng nào nó kiểm tra được DNS server đang hoạt động.
-N ngăn Squid trở thành một tiến trình ẩn.
3.2.2. Khởi tạo cache
Trước khi khởi tạo cache ta cần phải kiểm tra xem file cấu hình squid.conf đã đúng cú pháp hay còn có lỗi nào nữa không bằng hàm parse.
Nếu ta không thấy thông báo lỗi nào chứng tỏ file cấu hình đã match lệ. Ngược lại Squid sẽ chỉ ra mỗi ở dòng nào và những yếu tố gây nên lỗi. Cần phải khắc phục hết lỗi cú pháp trong file squid.conf thì mới tiếp tục. Khi khởi động Squid lần đầu tiên ta hoặc bất kể khi nào ta thêm một cache_dir vào file cấu hình squid.conf, ta cần phải tạo thư mục cache.
3.3. Chạy thử chƣơng trình
Một khi ta đã thành công khởi tạo được thư mục cache, ta nên chạy thử Squid trên màn hình dòng lệnh để kiểm lỗi. Sử dụng –N để Squid thực thi không trở thành một tiến trình ẩn và –d1 để hiển thị những thông tin cần xem.
Ta sẽ thấy dạng như sau.
# squid3 –N –d1 # squid3 -z
Trang 76
Một khi ta thấy được thông báo Ready to serve requests điều đó có nghĩa là Squid đã thực thi thành công và đang sẳng sàng lắng nghe yêu cầu từ người dùng. Ta có thể kiểm tra bằng lệnh sau.
Nếu như ta thấy được những nội dung HTML của trang web hiển thị lên màn hình dòng lệnh, ta đã thành công. Khi đó, ta có thể ngắt chương trình bằng Ctrl+C và cho phép Squid thực thi dưới dạng tiến trình ẩn.
Nếu chương trình được cài đặt từ Repository thông qua lệnh apt-get thì ta có thể thực hiện thao tác khởi động, dừng, hoặc khởi động lại thông qua script.
Script trên cũng là cách cho Squid tự khởi động mỗi khi khởi động máy. Ta hoàn toàn có thể dùng script trên để dừng Squid hoặc an toàn hơn ta có thể sử dụng hàm –k shutdown.
Nếu có thay đổi nội dung cấu hình trong squid.conf ta có thể khởi động lại bằng script trên hoặc chỉ với hàm –k reconfigure. Khi thực hiện hàm này, Squid sẽ đọc lại những cấu hình trong file squid.conf. Nếu như file cấu hình không có vấn đề gì thì Squid sẽ quay lại phục vụ với cấu hình mới.
3.4. Access Control trong Squid
# sudo /etc/init.d/squid3 start|stop|restart # squidclient http://www.squid-cache.org/ zfirewall@ubuntu:~$ sudo squid3 -N -d1
2009/10/31 09:44:11| Starting Squid Cache version 3.0.STABLE8 for i486-pc-linux-gnu...
2009/10/31 09:44:11| Process ID 4229
2009/10/31 09:44:11| With 1024 file descriptors available 2009/10/31 09:44:11| Performing DNS Tests...
2009/10/31 09:44:11| Successful DNS name lookup tests... <...>
2009/10/31 09:44:12| Set Current Directory to /var/spool/squid3 2009/10/31 09:44:12| Loaded Icons.
2009/10/31 09:44:12| Accepting HTTP connections at 0.0.0.0, port 3128, FD 17.
2009/10/31 09:44:12| Accepting ICP messages at 0.0.0.0, port 3130, FD 18.
2009/10/31 09:44:12| HTCP Disabled.
Trang 77
3.4.1. Access Control Element cơ sở
ACL (access control list) Element là những khối điều khiển truy cập trong Squid. Đó là cách ta chỉ ra những mẫu dải địa chỉ IP, địa chỉ cổng, hay chuỗi URL. Mỗi ACL Element có một tên và ta sẽ sử dụng tên đó để viết luật truy cập. Cú pháp cơ bản của một ACL Element như sau.
Trong hầu hết các trường match ta thường liệt kê nhiều giá trị trên cùng một ACL Element. Tuy nhiên ta có thể có nhiều dòng acl với cùng một tên. Ví dụ, hai ACL Element sau là tương đương.
Squid có xấp xỉ 25 loại ACL khác nhau, và một vài trong số đó có cùng loại cơ sở. Chẳng hạn, cả src và dst đều sử dụng địa chỉ IP là kiểu cơ sở. Squid có một số kiểu cơ sở sau đây:
3.4.1.1. Địa chỉ IP
Được sử dụng bởi các ACL Element src, dst, myip.
Squid có cho phép ta chỉ ra giới hạn địa chỉ IP rất rõ ràng. Ta có thể chỉ ra dải địa chỉ là một mạng con, đoạn địa chỉ, và tên miền. Ta có thể sử dụng nhiều cách để chỉ ra đoạn địa chỉ mà ta muốn. Chẳng hạn, những acl sau là tương đương.
Khi ta ghi ra mặc nạ mạng, Squid sẽ kiểm tra xem mặt nạ mạng đó có match hay không. Giả sử ta có một acl là acl mylocal 127.0.0.1/8. Squid sẽ báo lỗi vì mặc nạ mạng /8 (255.0.0.0) có giá trị 0 ở 3 octet còn lại,
acl zhost src 172.16.44.21/255.255.255.255
acl zhost src 172.16.44.21/32
acl zhost src 172.16.44.21 acl Http_ports port 80 8000 8080
acl Http_ports port 80 acl Http_ports port 8000 acl Http_ports port 8080
Trang 78
trong khi đó 127.0.0.1 lại có giá trị 1 ở octet cuối cùng. Để sửa lại cho chính xác ta nên viết là acl mylocal 127.0.0.1/32 hoặc 127.0.0.0/8.
Ta có thể liệt kê liên tiếp một số mạng con bằng cách viết acl mynetwork src 172.16.10.0-172.16.19.0/24. Acl này sẽ tương đương với nhiều mạng con 172.16.x.0/24.
Squid lưu trữ các ACL địa chỉ IP trong bộ nhớ trong một cấu trúc dữ liệu được gọi là cây splay. Cấu trúc cây này có những đặc tính mạnh mẽ. Nó có thể tự động điều chỉnh khi thực hiện quá trình dò tìm. Khi một phần tử được trùng khớp trong danh sách, phần tử đó trở thành gốc mới của cây. Với cách này những phần tử thường xuyên được trùng hớp sẽ càng về gần với gốc của cây, và như thế sẽ giảm thiểu thời gian cho những lần kiểm tra sau.
Mọi mạng con trong cùng một ACL không được trùng nhau. Squid sẽ cảnh báo nếu ta viết một ACL như sau.
3.4.1.2. Tên miền
Được sử dụng bởi ACL Element srcdomain, dstdomain, và chỉ thị
cache_host_domain.
Một tên miền đơn gian là một tên DNS hoặc một khu vực (zone). Ví dụ ta có những tên miền match lệ sau.
Những ACL về tên miền có thể hơi khác biệt trong việc match với tên miền và những miền con trong đó. Khi một ACL tên miền bắt đầu với một dấu chấm, Squid sẽ xem đó là một wildcard, và sẽ match với tất cả mọi tên con trong miền đó và kể cả tên miền đó. Ngược lại, ACL tên miền đó không bắt đầu bằng dấu chấm, squid sẽ sử dụng đúng cú pháp so sánh
www.squid-cache.org squid-cache.org org
acl Foo src 1.2.3.0/24 acl Foo src 1.2.3.4/32
Trang 79
chuỗi. Hostname phải trùng khớp với chuỗi thì mới được xem là match. Ta có thể xem bảng so sánh sau.
URL hostname Matches ACL lrrr.org? Matches ACL .lrrr.org?
lrrr.org Yes Yes
i.am.lrrr.org No Yes
iamlrrr.org No No
Bảng 3.1 Match bằng tên miền
Squid cũng sử dụng cấu trúc cây splay để lưu trữ những ACL tên miền. Tuy nhiên, thuật toán để match với tên miền lại gây ra một lỗi cho cây splay. Cây splay chỉ yêu cầu một từ khóa có thể match với điều kiện tìm kiếm. Ví dụ, giả sử ta tìm kiếm mẫu là i.am.lrrr.org. Hostname này sẽ match với cả .lrrr.org và .am.lrrr.org. Như vậy có hai giá trị cùng match với một hostname sẽ làm cho thuật toán splay nhầm lẫn. Vì thế ta không nên sử dụng dạng ACL như sau.
Squid sẽ đưa ra cảnh báo nếu ta viết một ACL như trên.
3.4.1.3. Tên ngƣời dùng (username)
Được sủ dụng bởi ACL Element iden, proxy_auth.
ACL loại này thường sử dụng tên người dùng để match. Tên đăng nhập cần phải đúng chính xác mới được xem là match. Squid cũng có những ACL tương tự như ident_regex và proxy_auth_regex sử dụng biểu thức chính quy để match tên người dùng.
Ta có thể sử dụng từ khóa REQUIRED như là một giá trị đặc biệt và match với mọi tên người dùng.
Trang 80
3.4.1.4. Biểu thức chính quy (regular expression)
Được sử dụng bởi ACL Element srcdom_regex, dstdom_regex,
url_regex, url_path_regex, browser_regex, ident_regex,
proxy_auth_regex, reg_mine_type, rep_mine_type.
Có rất nhiều ACL sử dụng biểu thức chính quy để match với chuỗi ký tự. Biểu thức chính quy thông dụng nhất sử dụng để match với chuỗi là bắt đầu hoặc kết thúc chuỗi. Ví dụ, ký tự ^ là ký tự đặc biệt để match với bắt đầu của chuỗi ^http:// sẽ match với mọi URL bắt đầu với http://. Ký tự $ cũng là một ký tự đặc biệt sử dụng để match với cuối chuỗi. \.jpg$ sẽ match vói mọi ảnh jpg.
Trong trường match ta muốn sử dụng so sánh không phân biệt chữ hoa chữ thường ta có thể thêm tùy chọn –i.
3.4.1.5. Số hiệu cổng TCP
Được sử dụng bởi ACL Element port, myport.
Ta sử dụng ALC này để chỉ ra từng cổng hoặc một dải cổng. Giá trị có thể được sử dụng cho số hiệu cổng nằm trong khoảng từ 1 đến 65535.
3.4.1.6. Số hiệu của hệ thống tự trị
Được sử dụng bởi ACL Element src_as, dst_as.
Một số AS thường chỉ đến một tập địa chỉ mạng được quản lý bởi một tổ chức. Khi Squid khởi động, Squid sẽ gửi một yêu cầu đến server whois và yêu cầu server trả về những địa chỉ mạng mà AS chỉ định quản lý. Khi Squid nhận được những địa chỉ IP đó, Squid sẽ sử dụng chúng như những ACL địa chỉ IP.
Trang 81
3.4.2. Phƣơng thức (method)
Phương thức ở đây muốn nói đến các phương thức trong HTTP Request. Phương thức được sử dụng nhiều nhất là GET, kế đến là POST, PUT và những phương thức khác. Ví dụ: acl UploadMethod method POST PUT.
Squid hiểu hầu hết các phương thức thuộc chuẩn HTTP. Ngoài ra Squid còn hiểu được các phương thức của WEBDAV như PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK và nhiều phương thức khác.
Một phương thức đặc biệt là PURGE. Phương thức này chỉ thuộc về Squid và nó dùng để cho phép người quản trị loại bỏ đối tượng đã được cache. Phương thức này tương đối nguy hiểm và Squid mặc định là từ chối mọi yêu cầu với phương thức này. Tuy nhiên là có thể đưa ra một ACL để cho phép phương thức này hoạt động với một số giới hạn.
3.4.3. Giao thức (proto)
Loại ACL này muốn nói đến giao thức sử dụng để truy cập vào một tài nguyên trên mạng. Những giao thức mà Squid hiểu được gồm: http, https, ftp, gopher, urn, whois, cache_object. Giả sử ta muốn từ chối mọi yêu cầu FTP ta có thể làm như sau:
Cache_object là một tính năng của Squid. Giao thức này dùng để quản trị cache.
3.4.4. Thời gian (time)
Loại ACL này cho phép ta kiểm soát truy cập dựa vào thời gian trong ngày và ngày trong tuần. Cú pháp ACL như sau:
acl name time [days] [h1:m1-h2:m2] acl FTP proto FTP
Trang 82
Ta có thể chỉ ra ngày trong, giờ bắt đầu hoặc giờ kết thúc hoặc cả hai. Ngày là một ký tự được liệt kê trong bảng xxx. Giờ được định dạng theo kiểu 24- giờ. Giờ bắt đầu phải nhỏ hơn giờ kết thúc.
Code Day S Sunday M Monday T Tuesday W Wednesday H Thursday F Friday A Saturday D All weekdays (M-F)
Bảng 3.2 Mã và giá trị của ngày
Ví dụ sau tạo một ACL với khoảng thời gian là giờ làm việc hành chính.
Để thấy được sự ràng buộc và khả năng biến đổi của ACL thời gian ta xét thêm một vài ví dụ. Giả sử ISP cho phép khoảng thời gian từ 20:00 đến 04:00 được sử dụng Internet không giới hạn. Ta không thể viết “20:00-04:00”, thay vào đó ta sẽ chia ra thành hai ACL định nghĩa hai khoảng thời gian khác nhau.
Tuy nhiên ta có thể viết ngắn gọn hơn như sau.
Mặc dù Squid cho phép ta viết nhiều giá trị ngày giờ trên cùng một dòng ACL. Tuy nhiên, bộ biên dịch có thể không đủ thông minh để hiểu hết ý đồ của chúng ta. Giả sử một ACL như sau:
acl Blah time M 08:00-10:00 W 09:00-11:00 acl busytime time 04:00-20:00
http_access allow !busytime acl freetime1 time 20:00-23:59 acl freetime2 time 00:00-04:00
http_access allow freetime1 http_access allow freetime2
Trang 83
Tuy nhiên kết quả sau khi biên dịch lại không đúng với ý đồ của ta. Bộ biên dịch sẽ OR những ngày trong tuần và chỉ sử dụng khoảng thời gian cuối cùng. Như vậy ACL trên lại trở thành:
Để thực hiện được yêu cầu trên ta nên sử dụng hai dòng riêng biệt cho cùng một ACL.
3.4.5. Xác thực (ident)
ACL loại này sẽ match với tên người dùng mà giao thức ident sẽ truy vấn được. Đây là một giao thức đơn giản được chi tiết tại RFC 1413 và nó làm việc như sau:
1. Client thực hiện kết nối đến Squid
2. Squid kết nối đến cổng xác thực (113) trên máy client.
3. Squid ghi vào một dòng với hai giá trị cổng là cổng lắng nghe của Squid và cổng nguồn thực hiện kết nối của client.
4. Server ident bên phía client sẽ gửi lại dữ liệu tên người dùng dựa vào tiến trình đã mở kết nối đến Squid.
5. Squid sẽ lưu lại tên người dùng và dùng nó để kiểm tra match với các ACL.
Khi Squid gặp một ACL loại ident này với một yêu cầu cụ thể, yêu cầu đó sẽ hoãn lại cho đến khi tiến trình dò tìm thông tin xác thực hoàn thành. Vì thế sử dụng ACL ident có thể tăng đáng kể độ trể đối với các yêu cầu của người dùng.
3.4.6. Số lƣơng kết nối tối đa (maxconn)
ACL maxconn muốn nói đến số lượng kết nối tối đa đồng thời từ một địa chỉ IP. ACL này hữu dụng khi ngăn cấm một người dùng nào đó sử dụng quá nhiều tài nguyên. ACL maxconn chỉ match với một yêu cầu khi yêu cầu đó vượt quá số lượng mà ta quy định. Vì thế ta chỉ sư dụng ACL maxconn trong luật deny. Ví dụ: