Cài Đặt Squid Proxy Server trên Linux: Kiểm Soát Truy Cập, Lọc Nội Dung và Cache Băng Thông

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Tại Sao Mạng Của Bạn Cần Proxy — và Tại Sao Lại Là Squid

Vài năm trước, tôi đang quản lý một mạng văn phòng nhỏ, nơi nhân viên liên tục kết nối đến cùng một máy chủ cập nhật phần mềm lớn, mỗi máy tải xuống các file giống hệt nhau một cách độc lập. Hóa đơn băng thông tăng vọt. Tốc độ phản hồi giảm sút. Và không có bất kỳ khả năng nào để theo dõi những gì đang thực sự được truy cập. Đó chính xác là vấn đề mà một forward proxy giải quyết — và Squid là thứ đã giúp tôi xử lý được.

Squid là một HTTP proxy mã nguồn mở có khả năng caching và forwarding, tồn tại từ giữa những năm 90. Nó đứng giữa các client và internet, chặn các request đi ra ngoài. Khi hai máy yêu cầu cùng một tài nguyên, Squid phục vụ bản đã cache cho máy thứ hai thay vì kết nối lại đến máy chủ từ xa. Ngoài caching, nó còn thực thi các chính sách truy cập: chặn các loại trang web, hạn chế truy cập theo dải IP, giới hạn lưu lượng theo thời gian trong ngày, và ghi log mọi thứ cho mục đích kiểm toán.

Hướng dẫn này bao gồm toàn bộ quá trình thiết lập Squid trên Ubuntu/Debian — cài đặt, cấu hình ACL, tinh chỉnh caching, và giám sát. Tất cả những gì bạn cần để thực sự vận hành trên môi trường production.

Cài Đặt

Cài Squid trên Ubuntu/Debian

Squid có sẵn trong repository mặc định, nên việc cài đặt rất đơn giản:

sudo apt update
sudo apt install squid -y

Đối với RHEL/CentOS/Rocky Linux:

sudo dnf install squid -y

Sau khi cài đặt, kích hoạt và khởi động service:

sudo systemctl enable squid
sudo systemctl start squid
sudo systemctl status squid

Mặc định, Squid lắng nghe trên cổng 3128. Kiểm tra xem nó đã được bind đúng chưa:

ss -tlnp | grep 3128

Bạn sẽ thấy Squid đang lắng nghe trên 0.0.0.0:3128 hoặc :::3128.

Cấu Hình Firewall

Cho phép client kết nối đến cổng proxy:

# UFW (Ubuntu)
sudo ufw allow 3128/tcp

# firewalld (RHEL/Rocky)
sudo firewall-cmd --permanent --add-port=3128/tcp
sudo firewall-cmd --reload

Cấu Hình

File cấu hình chính là /etc/squid/squid.conf. File này khá dài và có nhiều comment giải thích, nhưng bạn chỉ cần chỉnh sửa một vài directive để có một thiết lập hoạt động được. Hãy sao lưu trước khi thực hiện bất kỳ thay đổi nào:

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

Định Nghĩa Ai Được Dùng Proxy (ACL)

Kiểm soát truy cập của Squid được xây dựng xung quanh các ACL — các điều kiện được đặt tên mà bạn định nghĩa, sau đó tham chiếu trong các rule allow/deny. Mở file cấu hình:

sudo nano /etc/squid/squid.conf

Tìm phần ACL và thêm dải mạng của bạn. Nếu LAN của bạn là 192.168.1.0/24:

# Định nghĩa mạng nội bộ
acl localnet src 192.168.1.0/24

# Cho phép mạng đó truy cập
http_access allow localnet

# Từ chối tất cả các kết nối còn lại (dòng này thường đã có ở cuối file)
http_access deny all

Thứ tự ở đây rất quan trọng. Squid xử lý các rule http_access từ trên xuống và dừng lại ở kết quả khớp đầu tiên. Hãy giữ deny all ở cuối danh sách.

Lọc Nội Dung: Chặn Domain và Danh Mục

Tạo một ACL loại dstdomain để chặn các domain cụ thể:

# Chặn mạng xã hội trong giờ làm việc
acl social_media dstdomain .facebook.com .twitter.com .instagram.com .tiktok.com

# Định nghĩa giờ làm việc
acl work_hours time MTWHF 08:00-18:00

# Chặn mạng xã hội trong giờ làm việc
http_access deny social_media work_hours

# Cho phép tất cả các kết nối khác từ mạng nội bộ
http_access allow localnet

Các danh sách chặn lớn hơn — hàng trăm hoặc hàng nghìn domain — nên được đặt trong một file riêng:

# /etc/squid/blocklist.txt — mỗi dòng một domain
.gambling.com
.malware-domain.net
.phishing-example.org

Sau đó tham chiếu đến nó trong squid.conf:

acl blocklist dstdomain "/etc/squid/blocklist.txt"
http_access deny blocklist

Khớp mẫu URL có thể bắt những gì danh sách domain bỏ sót:

acl bad_words url_regex -i torrent piracy crack keygen
http_access deny bad_words

Cấu Hình Cache để Tối Ưu Băng Thông

Đây là nơi việc tiết kiệm băng thông thực sự hiện ra. Theo kinh nghiệm của tôi, việc tinh chỉnh cache đúng cách có thể cắt giảm băng thông ra ngoài từ 20–40% trong các môi trường thường xuyên tải phần mềm, cập nhật gói, hoặc các tài nguyên media.

Các directive cache quan trọng cần tinh chỉnh:

# Vị trí lưu cache và kích thước (10 GB trong ví dụ này)
cache_dir ufs /var/spool/squid 10240 16 256

# Cache trên RAM — đặt khoảng 25% RAM khả dụng
cache_mem 512 MB

# Kích thước object tối đa được cache (không cache các file quá lớn)
maximum_object_size 100 MB

# Kích thước object tối thiểu (bỏ qua các object nhỏ không cần caching)
minimum_object_size 0 KB

# Thời gian lưu object khi không có header hết hạn rõ ràng
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Sau khi chỉnh sửa cài đặt cache, khởi tạo thư mục cache:

sudo squid -z
sudo systemctl restart squid

Xác Thực (Tùy Chọn nhưng Khuyến Nghị)

Kiểm soát truy cập theo IP là một điểm khởi đầu tốt. Thêm xác thực cơ bản khi bạn cần theo dõi từng người dùng hoặc muốn có trách nhiệm giải trình cá nhân trong log:

# Cài apache2-utils để dùng htpasswd
sudo apt install apache2-utils -y

# Tạo file mật khẩu
sudo htpasswd -c /etc/squid/passwd john
sudo htpasswd /etc/squid/passwd jane

Sau đó cấu hình Squid để sử dụng nó:

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm Squid Proxy
auth_param basic credentialsttl 2 hours

acl authenticated proxy_auth REQUIRED
http_access allow authenticated
http_access deny all

Cấu Hình Log

Squid ghi log vào /var/log/squid/access.log theo mặc định. Mỗi dòng chứa timestamp, thời gian phản hồi, IP client, mã kết quả, số byte đã truyền, phương thức HTTP, URL, và nhiều thông tin khác. Định dạng có thể cấu hình được:

# Dùng định dạng combined mặc định
access_log /var/log/squid/access.log squid

# Hoặc tắt logging cho các hệ thống yêu cầu hiệu năng cao
# access_log none

Kiểm Tra và Giám Sát

Kiểm Tra Proxy

Từ máy client, đặt biến môi trường proxy và kiểm tra bằng curl:

# Đặt proxy cho phiên shell này
export http_proxy="http://192.168.1.100:3128"
export https_proxy="http://192.168.1.100:3128"

# Kiểm tra kết nối qua proxy
curl -v http://example.com

# Kiểm tra IP đầu ra (phải là IP của máy chủ proxy)
curl http://ifconfig.me

Kiểm tra xem tính năng chặn có hoạt động như mong đợi không:

curl -v http://facebook.com
# Kết quả mong đợi: 403 Forbidden (Từ chối truy cập)

Kiểm Tra Tỷ Lệ Cache Hit

Chỉ số quan trọng nhất là tỷ lệ cache hit. Squid cung cấp thống kê thời gian thực qua cache manager:

# Kiểm tra thống kê cache từ chính máy chủ proxy
squidclient -h 127.0.0.1 -p 3128 mgr:info

# Hoặc lọc các counter liên quan đến hit
squidclient -h 127.0.0.1 -p 3128 mgr:counters | grep hit

Trong môi trường doanh nghiệp thông thường, hãy kỳ vọng tỷ lệ hit từ 20–50% sau khi cache đã được làm ấm. Đòn bẩy lớn nhất là tinh chỉnh refresh_pattern. Trên một mạng thường xuyên cập nhật apt/yum, việc thêm các pattern cụ thể cho file .deb, .rpm, và Packages.gz có thể đẩy tỷ lệ hit từ 15% lên hơn 40% chỉ với thay đổi đó.

Theo Dõi Access Log Trực Tiếp

Xem lưu lượng truy cập theo thời gian thực:

sudo tail -f /var/log/squid/access.log

Mỗi dòng trông như thế này:

1712550000.123    245 192.168.1.42 TCP_MISS/200 15234 GET http://example.com/ - DIRECT/93.184.216.34 text/html

TCP_MISS có nghĩa là object chưa có trong cache và đã được lấy từ nguồn gốc. TCP_HIT có nghĩa là nó được phục vụ từ cache. Hãy theo dõi giá trị thứ hai tăng dần khi cache được lấp đầy.

Phân Tích Log với awk

Xem nhanh các domain được truy cập nhiều nhất:

sudo awk '{print $7}' /var/log/squid/access.log | \
  grep -oP '(?<=://)([^/]+)' | \
  sort | uniq -c | sort -rn | head -20

Các IP tiêu thụ băng thông nhiều nhất:

sudo awk '{print $3, $5}' /var/log/squid/access.log | \
  awk '{arr[$1]+=$2} END {for (i in arr) print arr[i], i}' | \
  sort -rn | head -10

Tải Lại Cấu Hình Mà Không Cần Khởi Động Lại

Sau khi chỉnh sửa squid.conf, hãy luôn kiểm tra cú pháp trước khi áp dụng:

# Kiểm tra cú pháp cấu hình
sudo squid -k parse

# Tải lại mà không ngắt kết nối hiện tại
sudo squid -k reconfigure

# Hoặc dùng systemctl
sudo systemctl reload squid

Những Lỗi Thường Gặp

  • Chặn HTTPS trong suốt (transparent interception) yêu cầu SSL bump và thiết lập certificate authority — một quá trình phức tạp hơn nhiều so với proxying HTTP thông thường, với các hệ lụy pháp lý và quyền riêng tư ở nhiều khu vực pháp lý. Hãy cân nhắc kỹ xem bạn có thực sự cần nó không trước khi đi theo hướng đó.
  • Quyền thư mục cache: Squid chạy với user proxy. Nếu bạn trỏ cache_dir đến một đường dẫn tùy chỉnh, hãy chạy chown proxy:proxy /đường/dẫn/cache/của/bạn trước khi khởi động Squid, nếu không nó sẽ âm thầm không ghi được cache.
  • MTU không khớp: Lỗi kết nối client không liên tục đôi khi là vấn đề MTU. Kiểm tra bằng ip link show eth0 và điều chỉnh bằng ip link set eth0 mtu 1400 nếu cần.
  • refresh_pattern cho package manager: Đang cache repo apt/yum? Thêm các pattern cụ thể cho file .deb, .rpm, và Packages.gz với TTL dài hơn. Các pattern mặc định sẽ không cache những file này đủ tích cực.
Share: