Cài đặt và cấu hình Squid Proxy Server trên Linux: Web Cache, lọc nội dung và kiểm soát truy cập mạng nội bộ

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Lúc 2 giờ sáng, bandwidth của cả văn phòng biến mất

Mình nhớ cái đêm đó rõ lắm. Nhận được alert: băng thông đường truyền văn phòng vọt lên 95% liên tục trong 20 phút, hệ thống ERP gần như không dùng được. SSH vào router nhìn traffic log — một đống máy Windows đang đồng loạt kéo update từ Microsoft servers. Không phải lần đầu xảy ra, nhưng lần này ảnh hưởng đến ca làm việc đêm của team Nhật.

Giải pháp tạm thời lúc đó là throttle bandwidth per-IP, nhưng hôm sau mình quyết tâm dựng Squid Proxy — thứ mà đáng ra phải làm từ lâu. Từ đó về sau, Windows Update, apt upgrade, yum update của cả trăm máy đều đi qua cache, băng thông xuống còn 30–40%.

Squid Proxy là gì và nó giải quyết bài toán gì

Về cơ bản, Squid đứng giữa máy trong mạng nội bộ và internet. Máy A hỏi một file, Squid tải về rồi lưu lại. Lần sau máy B hỏi cùng file đó, Squid trả thẳng từ cache — không chạm đến đường truyền ra ngoài.

Squid thực sự mạnh ở ba điểm:

  • Web caching: Giảm tải đường truyền internet, tăng tốc độ tải trang cho người dùng nội bộ.
  • Content filtering: Chặn domain, URL pattern, MIME type không phù hợp.
  • Access control: Chỉ cho phép một số IP hoặc subnet truy cập internet qua proxy.

Squid không phải VPN, không mã hóa traffic. Cần bảo mật thì kết hợp thêm SSL bump, hoặc dùng riêng công cụ khác.

Cài đặt Squid trên Ubuntu/Debian và CentOS/RHEL

Ubuntu / Debian

sudo apt update
sudo apt install squid -y
sudo systemctl enable squid
sudo systemctl start squid

CentOS / RHEL / Rocky Linux

sudo dnf install squid -y
sudo systemctl enable squid
sudo systemctl start squid

Sau khi cài, kiểm tra Squid đang lắng nghe port 3128:

sudo ss -tlnp | grep squid
# Output: LISTEN  0  128  0.0.0.0:3128  0.0.0.0:*  users:(("squid",...))

Cấu hình cơ bản: squid.conf

Mọi thứ đều nằm trong /etc/squid/squid.conf. Mặc định file này dài và đầy comment — mình thường backup rồi tạo file mới gọn hơn để dễ quản lý.

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

Cấu hình tối thiểu cho mạng nội bộ 192.168.1.0/24:

# Định nghĩa ACL cho mạng nội bộ
acl localnet src 192.168.1.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 21
acl Safe_ports port 8080
acl CONNECT method CONNECT

# Cho phép localnet, từ chối tất cả còn lại
http_access allow localnet
http_access allow localhost
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

# Port lắng nghe
http_port 3128

# Cấu hình cache
cache_mem 256 MB
maximum_object_size_in_memory 512 KB
maximum_object_size 100 MB
cache_dir ufs /var/spool/squid 4096 16 256

# Log
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

Giải thích nhanh phần cache:

  • cache_mem 256 MB: RAM dành cho cache object nhỏ (thường xuyên truy cập).
  • maximum_object_size 100 MB: File lớn hơn 100MB không cache (tránh lấp đầy disk).
  • cache_dir ufs /var/spool/squid 4096 16 256: 4GB cache trên disk, 16 thư mục cấp 1, 256 thư mục cấp 2.

Khởi tạo thư mục cache và restart:

sudo squid -z
sudo systemctl restart squid

Lọc nội dung và chặn domain

Chặn theo domain blacklist

Tạo file danh sách domain cần chặn:

sudo nano /etc/squid/blacklist.txt
.facebook.com
.tiktok.com
.youtube.com
.netflix.com

Thêm vào squid.conf:

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

Lưu ý quan trọng: Đặt dòng http_access deny blacklist trước dòng http_access allow localnet. Squid xử lý ACL theo thứ tự từ trên xuống, rule nào khớp trước thì áp dụng.

Chặn theo URL pattern (regex)

acl bad_urls urlpath_regex -i \.torrent$ \.exe$ \?download=
http_access deny bad_urls

Giới hạn truy cập theo giờ làm việc

acl workhours time MTWHF 08:00-18:00
acl social_media dstdomain .facebook.com .instagram.com

# Chặn mạng xã hội trong giờ làm, cho phép ngoài giờ
http_access deny social_media workhours
http_access allow social_media

Kiểm soát truy cập theo IP và subnet

Cho phép một số máy (ví dụ: nhóm IT) bypass filter:

acl it_team src 192.168.1.10 192.168.1.11 192.168.1.12
http_access allow it_team

# Chặn blacklist chỉ áp dụng cho nhóm còn lại
http_access deny blacklist !it_team

Hoặc chỉ cho phép một vài subnet truy cập qua proxy:

acl allowed_subnet src 192.168.1.0/24 10.0.0.0/8
http_access allow allowed_subnet
http_access deny all

Cấu hình client dùng proxy

Trên Linux (biến môi trường)

export http_proxy="http://192.168.1.1:3128"
export https_proxy="http://192.168.1.1:3128"
export no_proxy="localhost,127.0.0.1,192.168.1.0/24"

Thêm vào /etc/environment để áp dụng toàn hệ thống.

Transparent Proxy (không cần cấu hình client)

Đây là cách mình hay dùng nhất — client không cần biết proxy tồn tại. Traffic HTTP tự động redirect qua Squid nhờ iptables:

# Chạy trên Squid server (đồng thời là gateway)
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Và trong squid.conf, đổi port thành:

http_port 3128 intercept

Xem log và debug

Muốn biết ai đang truy cập gì theo thời gian thực, dùng tail trên access log:

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

Format log: timestamp | duration | client_ip | result_code/http_code | bytes | method | url | user | peer_info | content_type

# Lọc xem những domain bị deny
sudo grep " DENIED " /var/log/squid/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head 20

# Xem client nào tốn bandwidth nhiều nhất
sudo awk '{print $3, $5}' /var/log/squid/access.log | sort | awk -F' ' '{sum[$1]+=$2} END {for (i in sum) print i, sum[i]}' | sort -k2 -rn | head 10

Nhớ lần debug cái intermittent packet loss chỉ xảy ra giờ cao điểm — mất cả buổi sáng không ra. Cuối cùng Squid access log chỉ thẳng nguyên nhân: một nhóm máy đang chạy background sync đúng lúc 8–9 giờ khi cả văn phòng login. Rõ hơn nhiều so với nhìn raw traffic bằng tcpdump.

Kiểm tra cấu hình hợp lệ trước khi reload:

sudo squid -k parse
sudo systemctl reload squid

Tổng kết

Squid không phải công cụ hào nhoáng. Nhưng ở môi trường có chục đến cả trăm máy chung đường truyền, nó làm việc âm thầm và đáng tin. Setup ban đầu mất 30–60 phút — lợi ích tiết kiệm băng thông thấy ngay từ hôm sau.

Muốn đi sâu hơn: SSL Bump cho phép cache cả HTTPS traffic, còn SquidGuard thì lọc nội dung theo danh mục có sẵn — tiết kiệm công maintain blacklist thủ công.

Share: