# iptables -t nat -A PREROUTING –i eth0 -p tcp \ --dport 80 –j REDIRECT --to-port 3128
Trang 97
Vì một vài lý do nào đó, nếu trong mạng có nhiều proxy ta cần phải cấu hình để các proxy này giao tiếp với nhau. Điều này là hoàn toàn cần thiết, như vậy các server proxy trong mạng sẽ giảm thiểu được sự trùng lắp trong việc cache các đối tượng giống nhau.
Một server cache hàng xóm có thể tăng hiệu năng hệ thống mạng bằng cách tăng một ít số lượng yêu cầu cache hit. Hay nói cách khác, một vài yêu cầu là cache miss của một proxy có thể là cache hit tại một proxy khác. Tải một đối tượng từ một proxy hàng xóm thường bao giờ cũng nhanh hơn là tải từ server nguồn.
3.7.1. Xác định các proxy hàng xóm
Squid sử dụng chỉ thị cache_peer để chỉ ra những proxy lân cận mà ta cần giao tiếp. Cú pháp cơ bản như sau:
Tham số đầu tiên chỉ ra hostname hoặc địa chỉ IP của proxy hàng xóm. Hostname là duy nhất. Tham số thứ hai là loại proxy hàng xóm. Có ba loại proxy hàng xóm gồm: parent, sibling, và multicast. Tham số thứ ba là địa chỉ cổng HTTP của server proxy hàng xóm. Địa chỉ cổng này tương ứng với giá trị http_port trong file cấu hình của proxy hàng xóm. Tham số cuối cùng là chỉ ra số hiệu cổng ICP hoặc HTCP. Mặc định Squid sử dụng ICP để giao tiếp, truy vấn đến những server proxy khác.
Squid lưu giữ rất nhiều thông tin về trạng thái của mỗi hàng xóm của nó. Một trong số đó là Squid biết được hàng xóm của mình vẫn còn sống (alive) hay đã chết (dead). Việc xác định được hàng xóm còn sống hay đã chết ảnh hưởng rất nhiều đến lựa chọn của Squid. Squid sử dụng cả TCP (HTTP) và UDP (ICP/HTCP) để liên lạc và quyết định tình trạng của hàng xóm mình.
3.7.2. Giới hạn truy cập đến hàng xóm
Squid có bảy loại chỉ thị để tác động đến các yêu cầu, bao gồm:
Trang 98
cache_peer_access định nghĩa một danh sách truy cập cho cache hàng xóm. Như vậy chỉ thị này quyết định một yêu cầu có thể được chuyển cho hàng xóm đó hay không.
cache_peer_domain chỉ sử dụng tên miền trong URI để chọn ra hàng xóm cần chuyển tiếp yêu cầu.
never_direct ngăn việc Squid gửi yêu cầu trực tiếp đến server nguồn. Khi một yêu cầu match với danh sách truy cập này, nó sẽ được gửi đến một hàng xóm (thường là cấp cha).
always_direct yêu cầu Squid cần phải gửi những yêu cầu được match đến server nguồn.
hierarchy_stoplist làm cho yêu cầu match lệ trở thành không có thứ bậc. Squid đánh dấu một yêu cầu là có hoặc không có thứ bậc. Một yêu cầu không thứ bậc thường không bao giờ là cache hit. Chẳng hạng, một yêu cầu với phương thức POST. Vì thế việc trung chuyển những yêu cầu này đến những hàng xóm là vô ích, thay vào đó, Squid kết nối trực tiếp đến server nguồn.
nonhierarchical_direct điều khiển cách Squid trung chuyển những yêu cầu không thứ bậc. Mặc định, Squid sẽ gửi trực tiếp những yêu cầu này đến server nguồn bởi vì những yêu cầu loại này thường không là một cache hit. Nếu ta ngắt tính năng này, ta phải định hướng cho những yêu cầu đó. Tuy nhiên việc này là không khuyến khích.
nonhierarchical_direct off
cache_peer europe-cache parent 3128 3130 cache_peer asia-cache parent 3128 3130
cache_peer_domain europe-cache parent .ch .dk .fr .uk cache_peer_domain asia-cache parent .jp .kr .cn .vn cache_peer A-parent.my.org parent 3128 3130
acl DayTime time 07:00-18:00
Trang 99
prefer_direct điều khiển cách Squid trung chuyển những yêu cầu có thứ bậc. Mặc định, Squid sẽ gửi những yêu cầu loại này đến những hàng xóm của mình. Ta có thể loại bỏ cách hoạt động này bằng chỉ thị sau. Tuy nhiên cách này cũng không được khuyến khích.
3.7.3. Giao thức ICP
ICP là một giao thức định vị đối tượng. Một client gửi truy vấn đến một hay nhiều server và hỏi xem server đó có một đối tương tương ứng với một URI nào đó không. Server trả lời là ICP_HIT, ICP_MISS hoặc một số thông điệp khác. Client sẽ sử dụng những thông tin trả về để đưa ra quyết định.
Ngoài ra, thông điệp ICP cũng giống như thông điệp ICMP được dùng để duy trùy tình trạng kết nối giữa Squid và những hàng xóm của nó.
3.7.3.1. ICP server
Khi ta sử dụng chỉ thị icp_port, Squid mặc nhiên trở thành một ICP server và lắng nghe yêu cầu trên cổng chỉ định, mặc định là 3130. Thêm vào đó, mặc định Squid từ chối mọi yêu cầu ICP gửi đến nó vì thế ta cần thêm danh sách truy cập icp_access để cho phép truy vấn từ những hàng xóm.
3.7.3.2. ICP client
Để trở thành một ICP client ta cần phải cấu hình như sau. Trước hết ta cần sử dụng chỉ thị cache_peer để xác định những server cache hàng xóm. Tiếp đến ta cần định nghĩa cổng ICP bằng chỉ thị icp_port mặc dù ta chỉ sử dụng Squid như là một ICP client. Squid sử dụng cùng một socket để gửi
acl N1 src 192.168.0.1 acl N2 src 172.16.0.2 acl All src 0/0
icp_access allow N1 icp_access allow N2 icp_access deny All prefer_direct on
Trang 100
và nhận thông điệp ICP. Vì ta chỉ cần trở thành một ICP client nên phải từ chối mọi truy vấn ICP từ những nơi khác.
3.8. Bộ điều hƣớng
Bộ điều hướng là một tiến trình phụ thay đổi giá trị URL của client. Ví dụ, mặc dù người dùng yêu cầu tải trang http://www.example.com/page1.html, bộ redirector có thể thay đổi yêu cầu đó đến một địa chỉ khác chẳng hạn, http://www.example.com/page2.html. Squid mặc nhiên tải nội dung của URL đã được thay đổi.
Bộ điều hướng cho phép ta thêm nhiều tính năng cho Squid như kiểm soát truy cập, loại bỏ quảng cáo, chọn bản sao (mirror). Bộ điều hướng còn cho phép ta kiểm soát truy cập để gửi lại người dùng giải thích tại sao yêu cầu của người đó đã bị từ chối. Nhằm lọc nội dung quảng cáo, bộ điều hướng giúp ta có thể thay thế những nội dung ảnh GIF hay JPEG thành một yêu cầu đến một ảnh trắng.
Squid sử dụng một tập các tiến trình điều hướng để xử lý yêu cầu gửi đến. Nếu một tiến trình đang bận xử lý, Squid sẽ chọn một tiến trình rãnh rỗi để xử lý yêu cầu tiếp theo. Như vậy, các tiến trình sẽ xử lý song song. Ta có thể xác định số lượng tiến trình này bằng chỉ thị redirect_children, mặc định là 5 tiến trình.
Chỉ thị redirect_program chỉ ra chương trình điều hướng sẽ sử dụng.
Chỉ thị redirector_access nhằm cho phép hoặc không bộ điều hướng thay đổi yêu cầu đối với một ACL Element. Chẳng hạn, ví dụ sau không cho bộ điều hướng thay đổi những yêu cầu được gửi thừ ACL Foo.
acl Foo src 192.168.1.0/24 acl All src 0/0
redirector_access deny Foo redirector_access allow All
redirect_program /usr/local/squid/bin/my_redirector acl All src 0/0
Trang 101
Thông thường Squid sẽ đưa vào hàng đợi những yêu cầu được gửi đến cho đến khi một tiến trình trong số những tiến trình điều hướng rãnh rỗi. Nếu hàng đợi này quá lớn, Squid sẽ ngừng chương trình. Nhằm ngăn chặn tình trạng đó chỉ thị
redirector_bypass sẽ cho phép những yêu cầu đưa vào hàng đợi đó được xử lý mà không cần phải đi qua bộ điều hướng. Đây là một lựa chọn được mất.
3.9. Chứng thực
Squid hỗ trợ ba phương thức để thu thập thông tin chứng thực của người dùng là Basic, Digest, và NTLM. Những phương thức này quyết định cách thức lấy được thông tin tên đăng nhập và mật khẩu từ người dùng. Dưới góc dộ bảo mật, phương thức chứng thực Basic là yếu nhất. Digest và NTLM được xem là mạnh hơn nhiều.
Tương tự như bộ điều hướng, công việc chứng thực cũng được thực thi bởi những tiến trình bên ngoài và được tạo thành một nhóm các tiến trình.
3.9.1. Chứng thực bằng HTTP Basic
Đây là loại chứng thực đơn giản và kém bảo mật nhất. Thông tin tên đăng nhập và mật khẩu được truyền đi dưới dạng văn bản thuần, được mã hóa bằng kiểu 64bit.
HTTP Basic hỗ trợ những tham số sau:
auth_param basic program command
auth_param basic children number
auth_param basic realm string
auth_param basic credentialsttl time-spec
Tham số program chỉ ra chương trình thực hiện công việc chứng thực. Tham số children chỉ ra có bao nhiêu tiến trình sẽ được tạo ra. Tham số realm chỉ ra chuỗi thông báo sẽ xuất hiện trên trình duyệt người dùng nhằm nhắc nhở người dùng đăng nhập. Tham số cuối cùng là credentialsttl chỉ ra khoảng thời gian mà hiệu lực chứng thực còn tác dụng. Mặc định giá trị này là 2 giờ.
Trang 102
Squid đi kèm với nhiều chương trình chứng thực dạng Basic, bao gồm:
NCSA sử dụng một file để lưu giữ tên đăng nhập và mật khẩu tương tự như tập tin /etc/passwd. Ta cần chỉ rõ đường dẫn đến tập tin này khi dùng chỉ thị auth_param program. Tài khoản người dùng lưu trong tập tin này được tạo từ chương trình htpasswd.
LDAP dùng một server để thực hiện chứng thực. Hiện nay OpenLDAP là một viện mở rất được nhiều người sử dụng. Squid_ldap_auth đòi hỏi hai tham số là tên phân biệt (distinguished name) và địa chỉ hostname của LDAP server.
MSNT sử dụng giao thức SMB để truy cập vào cơ sở dữ liệu chứng thực của các máy chủ tên miền. Cách chứng thực này dùng một tập tin cấu hình msnauth.conf để chỉ ra các máy chủ tên miền.
Multi-domain-NTLM tương tự như MSNT. Cả hai đều gửi truy vấn đến cơ sở dữ liệu của máy quản lý miền.
PAM vốn là một chương trình để thực hiện chứng thực cho nhiều dịch vụ và Squid là một trong số đó.
SMB cũng là một trình chứng thực khác cơ sở dữ liệu trên máy quản lý miền Window. Chương trình thực thi một script từ một gói của Samba. Vì thế ta cần cài đặt Samba trước khi dùng kiểu chứng thực này. Smb_auth yêu cầu một tham số là tên miền mà ta cần chứng thực. Ta có thể liệt kê nhiều tên miền.
3.9.2. Chứng thực bằng HTTP Digest
server pdc1_host bdc1_host my_nt_domain server pdc2_host bdc2_host another_nt_domain
auth_param basic program /usr/local/squid/libexec/pam_auth auth_param basic children 10
auth_param basic realm My Awesome Squid Cache auth_param basic credentialsttl 1 hour
acl KnownUsers proxy_auth REQUIRED http_access allow KnownUsers
Trang 103
Chứng thực bằng Digest được xem là bảo mật hơn nhiều so với chứng thực bằng Basic. Quan trọng nhất là kiểu chứng thực này không chuyển thông tin người dùng theo dạng văn bản thuần mà gửi thông điệp đã được mã hóa.
Chứng thực HTTP Digest hỗ trợ những tham số sau:
auth_param digest program command
auth_param digest children number
auth_param digest realm string
auth_param digest nonce_garbage_interval time-spec
auth_param digest nonce_max_duration time-spec
auth_param digest nonce_max_count number
auth_param digest nonce_strictness on|off
Với những tham số đầu tương tự như kiểu chứng thực Basic. Tham số
nonce_garbage_interval chỉ khoảng thời gian mà Squid sẽ thực hiện dọn rác. Mặc định giá trị này là 5 phút.
Tham số nonce_max_duration chỉ ra khoảng thời gian mà hiệu lực chứng thực còn match lệ. Nếu sau khoảng thời gian này, Squid sẽ mặc nhiên tạo một thông điệp 401 để yêu cầu người dùng nhập lại thông tin đăng nhập. Mặc định gia trị này là 30 phút.
Tham số nonce_max_count chỉ ra số lượng tối đa yêu cầu mà người dùng có thể gửi sau một lần nhập thông tin đăng nhập. Mặc định giá trị này là 50 yêu cầu. Sau 50 yêu cầu người dùng phải nhập lại thông tin đăng nhập để tiếp tục gửi yêu cầu mới.
Một chương trình chứng thực được cài đặt trong Squid cho kiểu chứng thực này là password. Chương trình này đơn giản là đọc ra tên đăng nhập và mật khẩu từ một tập tin văn bản. Mỗi một dòng trong tập tin này có định dạng: username:password và đây cũng là tham số duy nhất cho auth_param program.
Trang 104
NTLM là một gioa thức chứng thực độc quyền của Microsoft. NTLM cũng dùng cơ chế bắt tay ba pha để thực hiện chứng thực một kết nối. Trước hết, client gửi một yêu cầu và vài thông tin định danh. Server sẽ gửi lại một thông điệp thách thức. Cuối cùng client sẽ gửi lại câu trả lời cho thông điệp thách thức và kèm theo yêu cầu.
Kiểu chứng thực NTLM hỗ trợ những tham số sau:
auth_param ntlm program command
auth_param ntlm children number
auth_param ntlm max_challenge_reuses number
auth_param ntlm max_challenge_lifetime time
Những tham số đầu cũng tương tự như hai kiểu chứng thực trước. Tham số
max_challenge_reuses giới hạn một mẫu thách thức sẽ được sử dụng lại bao nhiêu lần. Mặc định giá trị này là 0. Như vậy một thông điệp thách thức sẽ không bao giờ được sử dụng lại.
Tham số max_challenge_lifetime giới hạn khoảng thời gian mà thông điệp thách thức cần phải thay đổi cho dù vẫn chưa đạt giá trị ngưỡng của
max_challenge_reuses. Mặc định giá trị này là 60 giây.
Với kiểu chứng thực này ta có thể dùng chương trình chứng thực SMB tương tự như khi sử dụng kiểu chứng thực Basic. Người dùng chỉ cần cung cấp thông tin miền họ muốn vào, đồng thời đi kèm là tên đăng nhập và mật khẩu.
3.9.4. External ACL
3.9.4.1. Ip_user
Chương trình hỗ trợ chứng thực này nhận hai tham số là tên đăng nhập và địa chỉ IP trạm. Chương trình sẽ kiểm tra hai giá trị này so với tập cấu hình và quyết định xem có match hay không. Để rõ hơn, ta xét ví dụ sau.
external_acl_type ip_user_helper %SRC %LOGIN /usr/local/squid/libexec/ip_user
-f /usr/local/squid/etc/ip_user.conf acl AclName external ip_user_helper
Trang 105
Tập tin ip_user.conf có định dạng và gia trị như sau:
Như vậy ACL AclName ở trên sẽ match với mọi yêu cầu từ 127.0.0.1, yêu cầu từ 192.168.1.0/24 với tên người dùng phải là bob và tương tự.
3.9.4.2. Ldap_group
Chương trình này hỗ trợ xác định xem một người dùng có thuộc về một nhóm LDAP nào hay không. Nhóm LDAP có thể được chỉ ra khi ta viết ACL. Để biên dịch được chương trình này cần cài đặt thư viện OpenLDAP.
3.9.4.3. Unix_group
Chương trình hỗ trợ này kiểm tra xem người dùng có thuộc về một nhóm nào trong cơ sở dữ liệu nhóm của Unix.
3.9.4.4. Windbin_group
Chương trình hỗ trợ này được viết băng C và truy vấn winbindd server kiểm tra tên người dùng Window có thuộc một nhóm nào đó hay không. Chương trình này dựa trên kiểu chứng thực Basic và NTLM.
3.10.Log
Nhật ký là nguồn thông tin chính về những hoạt động của Squid. Nói cách khác, những tập tin này cung cấp những trường thông tin về những gì Squid đã và đang làm. Chẳng hạn, những yêu cầu của người dùng, những đối tượng đã được lưu và
external_acl_type ldap_group_helper %LOGIN /usr/local/squid/libexec/squid_ldap_group
-b "ou=people,dc=example,dc=com" ldap.example.com acl AclName external ldap_group_helper GroupRDN ... 127.0.0.1 ALL
192.168.1.0/24 bob 10.8.1.0/24 @lusers 172.16.0.0/16 NONE
Trang 106
đĩa, những thông điệp cảnh báo hoặc xảy ra lỗi. Khi Squid có vẻ hoạt động không đúng, nơi ta cần kiểm tra đầu tiên chính là những tập tin nhật ký này.
Tùy vào cấu hình của chúng ta mà Squid có thể dùng số lượng tập tin nhật ký như thế nào. Có tối đa 7 loại nhật ký và trong đó có 3 tập tin nhật ký chính là cache.log, access.log, và store.log. Những tập tin nhật ký khác ít được sử dụng.
3.10.1.Tập tin cache.log
Nhật ký cache.log lưu nhiều thông điệp chẳng hạn về cấu hình của Squid, những cảnh báo về hiệu năng hệ thống, và những thông báo lỗi.
Mỗi mục trong cache.log bắt đầu với một mốc thời gian ứng với thông điệp xuất hiện, tiếp đến là thông điệp cần thông báo. Với nhiều thông điệp ta có thể bỏ qua nếu không hiểu.
Thông thường kích thước tập tin này tăng rất chậm. Hầu hết những lỗi hay điều bất thường xảy ra thường được ghi lại trong tập tin nhật ký này.
Nhật ký này có thể thay đổi thông tin ghi nhận bằng chỉ thị debug_option. Chỉ thị này tùy chỉnh cấp độ chi tiết thông tin sẽ ghi lại trong cache.log. Mặc