Khởi tạo cache

Một phần của tài liệu tìm hiểu và cài đặt hệ thống firewall kết hợp với proxy để bảo vệ hệ thống mạng bên trong (Trang 76)

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ụ:

Trang 84

ACL maxconn dựa vào một cơ sở dữ liệu được quản lý bởi Squid. Cơ sơ dữ liệu này cho phép lưu trữ thong tin của từng địa chỉ IP người dùng. Nếu ta có quá nhiều trạm trong mạng, cơ sở dữ liệu này có thể sẽ chiếm dụng nhiều tài nguyên. Ta có thể loại bỏ cơ sơ dữ liệu này và đồng nghĩa với việc ACL maxconn sẽ không làm việc được nữa.

3.4.7. Trình duyệt (browser)

Hầu hết các HTTP Request đều có kèm một thông tin header User-Agent. Giá trị này tùy thuộc vào trình duyệt mà ta đang sử dụng. Ví dụ, đối với trình duyệt Firefox trên hệ điều hành Ubuntu là Mozilla/4.51 [en] (X11; I; Linux 2.2.5-15 i686).

ACL browser cũng sử dụng biểu thức chính quy để match với giá trị trong header User-Agent.

3.4.8. Nội dung trong request (req_mine_type)

ACL req_mine_type muốn nói đến header Content-Type trong HTTP Request bên phía client gửi đi. Header Content-type thường xuất hiện trong những yêu cầu có body. Phương thức POST và PUT thường có header này nhưng phương thức GET lại không. Ta thường dùng ACL req_mine_type để dò tìm những loại file gửi đi qua HTTP Request.

ACL req_mine_type sử dụng biểu thức chính quy để match. Chẳng hạn để bắt được loại file âm thanh (audio), ta có thể viết một ACL như sau.

3.4.9. Nội dung trong response (rep_mine_type)

Tương tự như ACL req_mine_type, ACL rep_mine_type cũng sử dụng header Content-Type nhưng là trong HTTP Response từ bên phía server gửi trả lại.

acl AuidoFileUploads req_mime_type -i ^audio/ acl OverConnLimit maxconn 4

Trang 85

3.4.10.External ACL

External ACL là một tính năng mới kể từ Squid 2.5. Yêu cầu sẽ được kiểm tra bởi một tiến trình khác và gửi trả lại Squid thông tin là có match hay không. External_acl_type dùng để định nghĩa một loại ACL mới và cú pháp như sau:

Squid hỗ trợ một số tùy chọn (options) sau:

 ttl=n là lượng thời gian tính bằng giây để cahce một kết quả đã match trước đó. Mặc định là 3600 giây.

 negative_ttl=n tương tự như ttl nhưng là để cache một kết quả không match.

 concurrency=n chỉ số lượng tiến trình tạo ra. Mặc định là 5.

 format là một hoặc nhiều từ khóa bắt đầu với ký tự %. Squid có thể hỗ trợ những loại định dạng sau:

 %LOGIN. Tên đăng nhâp.

 %IDENT. Tên đăng nhập thông qua giao thức ident.

 %SRC. Địa chỉ IP của client.

 %DST. Địa chỉ của server nguồn.

 %PROTO. Giao thức sử dụng.

 %PORT. Cổng cần kết nối.

 %METHOD. Phương thức sử dụng.

 %{Header}. Giá trị một header trong HTTP request, ví dụ %{User- Agent} sẽ yêu cầu Squid gửi một chuỗi như "Mozilla/4.0 (compatible; MSIE 6.0; Win32)" đến tiến trình thực hiện kiểm tra.

 %{Hdr:member}. Chọn ra những mục trong danh sách dựa trên HTTP headers, ví dụ ta có một HTTP header: X-Some-Header:

Một phần của tài liệu tìm hiểu và cài đặt hệ thống firewall kết hợp với proxy để bảo vệ hệ thống mạng bên trong (Trang 76)