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ạychown proxy:proxy /đường/dẫn/cache/của/bạntrướ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 eth0và điều chỉnh bằngip link set eth0 mtu 1400nế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.gzvớ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.

