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.
