Trong quản trị hệ thống, việc kiểm soát tập trung truy cập Internet cho nhiều thiết bị (như máy ảo, container, hoặc toàn bộ mạng văn phòng) là một nhu cầu thiết yếu. Tuy nhiên, việc cấu hình proxy thủ công trên từng máy client là một cơn ác mộng.
Đây là lúc Squid Transparent Proxy (Proxy trong suốt) phát huy sức mạnh. Không giống các phương pháp proxy truyền thống, nó hoạt động “vô hình” ở tầng mạng. Traffic của người dùng bị chặn và chuyển hướng qua Squid một cách tự động mà họ không hề hay biết.
Bài viết này sẽ hướng dẫn bạn cấu hình loại proxy cao cấp này trên VPS Linux.
Phân biệt 3 chế độ hoạt động của Squid
Squid là một công cụ cực kỳ linh hoạt. Để tránh nhầm lẫn, chúng ta cần phân biệt rõ 3 chế độ hoạt động chính của nó:
- Forward Proxy (Proxy Xuôi):
- Mục đích: Ẩn danh cho người dùng khi truy cập Internet.
- Yêu cầu: Người dùng phải chủ động cấu hình trình duyệt (nhập IP, Port, User/Pass).
- Bạn có thể xem chi tiết cách cài đặt tại bài viết: Cách setup Proxy Server trên VPS: Hướng dẫn cài Squid (Ubuntu/CentOS).
- Reverse Proxy (Proxy Ngược / Web Accelerator):
- Mục đích: Tăng tốc, cache, và bảo vệ cho máy chủ Web (Website) của bạn.
- Yêu cầu: Squid đứng trước website, “giả dạng” làm máy chủ web
- Chúng tôi đã có bài hướng dẫn chi tiết: Cấu hình Squid Caching Proxy làm Web Accelerator (Hướng dẫn tăng tốc website).
- Transparent Proxy (Proxy Trong suốt) – Bài viết này:
- Mục đích: Tự động “bắt” và lọc traffic của client mà không cần client cấu hình.
- Yêu cầu: Cấu hình phức tạp ở tầng mạng (VPS Gateway) và tường lửa.
Lợi ích khi triển khai Squid Transparent Proxy
Việc cài đặt proxy trong suốt mang lại nhiều lợi ích cho quản trị viên hệ thống:
- Không cần cấu hình Client: Đây là lợi ích lớn nhất. Bạn có thể áp dụng chính sách mạng cho toàn bộ dải IP mà không cần can thiệp vào từng máy.
- Quản lý tập trung: Ghi log (nhật ký) và giám sát mọi truy cập ra Internet từ một nơi duy nhất.
- Lọc nội dung và bảo mật: Dễ dàng chặn các website độc hại, quảng cáo, hoặc nội dung không phù hợp cho toàn bộ mạng.
Cảnh báo: Nhược điểm của Interception Proxy
Dù rất mạnh mẽ, phương pháp này (theo tài liệu chính thức của Squid) có nhiều nhược điểm kỹ thuật nghiêm trọng bạn phải cân nhắc:
- Phá vỡ tiêu chuẩn TCP/IP: Client nghĩ rằng chúng đang nói chuyện trực tiếp với máy chủ gốc, nhưng thực tế là đang nói chuyện với proxy.
- Không tương thích: Phương pháp này làm hỏng các giao thức hiện đại như WebSockets, SPDY và một số cơ chế HTTP/2.
- Không hỗ trợ xác thực: Bạn không thể sử dụng Proxy Authentication (User/Pass) vì trình duyệt không biết nó đang nói chuyện với proxy.
- Gây lỗi PMTUD: Có thể làm hỏng việc phát hiện Path MTU, khiến một số trang web không thể truy cập được, đặc biệt nếu client dùng PPPoE.
- Tăng tải DNS: Cả client và proxy đều thực hiện tra cứu DNS, làm tăng gấp đôi tải DNS.
Khuyến nghị: Chỉ sử dụng giải pháp này khi bạn hiểu rõ các hạn chế và chấp nhận chúng, hoặc khi việc cấu hình thủ công cho client là bất khả thi.
Chuẩn bị môi trường VPS
Mô hình này giả định VPS Linux của bạn hoạt động như một Gateway (Cổng kết nối).
- Một VPS Linux (Khuyến nghị Ubuntu 22.04/20.04 hoặc CentOS 7/8+).
- Quyền truy cập
roothoặcsudo. - Yêu cầu quan trọng: Toàn bộ traffic từ các máy client (ví dụ: mạng LAN
192.168.1.0/24) phải được định tuyến đi qua VPS này để ra Internet. - Khuyến nghị: Bạn nên bảo mật VPS Linux với UFW, Fail2Ban và Hardening SSH trước khi thực hiện các bước bên dưới.
Bước 1: Cài đặt Squid và kích hoạt IP Forwarding
Bước đầu tiên là cài đặt các gói cần thiết và cho phép kernel Linux chuyển tiếp các gói tin mạng.
Cài đặt Squid
- Trên Ubuntu/Debian:
sudo apt update sudo apt install squid -y - Trên CentOS/RHEL:
sudo yum install squid -y
Kích hoạt IP Forwarding (Bắt buộc)
Chúng ta cần cho phép kernel Linux chuyển tiếp các gói tin (packets) từ client ra Internet.
- Kích hoạt ngay lập tức:
sudo sysctl -w net.ipv4.ip_forward=1 - Lưu cấu hình vĩnh viễn: Mở file
/etc/sysctl.conf(bằngnanohoặcvim):sudo nano /etc/sysctl.confTìm và bỏ dấu
#ở dòng sau (hoặc thêm vào nếu chưa có):net.ipv4.ip_forward = 1Lưu file và chạy
sudo sysctl -pđể áp dụng.
Bước 2: Cấu hình Squid cho chế độ “Intercept” (HTTP)
Bây giờ, chúng ta sẽ cấu hình Squid để nó hiểu và chấp nhận các kết nối bị “bắt” lại.
- Sao lưu file cấu hình gốc:
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
- Xóa và tạo file cấu hình mới (Khuyến nghị): File
squid.confmặc định rất phức tạp. Tốt nhất là xóa sạch và tạo file mới.sudo > /etc/squid/squid.conf sudo nano /etc/squid/squid.conf - Dán cấu hình cơ bản sau vào file:
# Định nghĩa ACL cho mạng nội bộ (client) của bạn # Thay 192.168.1.0/24 bằng dải IP mạng của bạn acl localnet src 192.168.1.0/24 # Cổng HTTP: Chạy ở port 3128 và ở chế độ "intercept" # "intercept" là chỉ thị quan trọng nhất, báo Squid nhận traffic chuyển hướng http_port 3128 intercept # Cho phép mạng nội bộ truy cập http_access allow localnet # Chặn tất cả các truy cập còn lại http_access deny all # Cấu hình cơ bản (tùy chọn) visible_hostname squid.myvps.com
Lưu file cấu hình và thoát.
Bước 3: Chuyển hướng traffic HTTP (Port 80) bằng tường lửa
Đây là phần “ma thuật” làm nên tính “trong suốt”. Chúng ta sẽ dùng tường lửa để chuyển hướng (REDIRECT) mọi traffic HTTP (port 80) đến cổng 3128 của Squid.
Giả sử card mạng nội bộ (phía client) là eth1.
Dùng Iptables (Cũ – Mặc định trên Ubuntu/Debian)
# Trong bảng NAT (-t nat), thêm quy tắc vào chuỗi PREROUTING
# Bắt traffic TCP (-p tcp) đến cổng 80 (--dport 80) trên card eth1
# Và REDIRECT nó về cổng 3128 của chính VPS
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
Để lưu quy tắc (Ubuntu), cài iptables-persistent và chạy sudo netfilter-persistent save.
Dùng Firewalld (Mặc định trên CentOS/RHEL)
Lưu ý: Chúng ta dùng --add-redirect, không dùng --add-forward-port. REDIRECT là chuyển hướng cục bộ, chính là thứ chúng ta cần.
# Giả sử card eth1 nằm trong zone "internal"
# Thêm quy tắc chuyển hướng (REDIRECT) vĩnh viễn
sudo firewall-cmd --permanent --zone=internal --add-redirect=port=80:proto=tcp:toport=3128
# Tải lại Firewalld
sudo firewall-cmd --reload
Bạn có thể xem thêm về cách cho phép tất cả lưu lượng truy cập từ một địa chỉ IPv4 thông qua Firewall Centos 7 nếu cần mở port.
Dùng Nftables (Hiện đại – Mặc định trên RHEL 8+, Ubuntu 22.04+)
nftables là công cụ thay thế iptables.
# 1. Tạo bảng 'nat'
sudo nft add table ip nat
# 2. Thêm chuỗi 'prerouting' (hook vào trước khi định tuyến)
sudo nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
# 3. Thêm quy tắc redirect
sudo nft add rule ip nat prerouting iifname "eth1" tcp dport 80 redirect to :3128
Khởi động và kiểm tra (HTTP)
- Khởi động lại Squid:
sudo systemctl restart squid sudo systemctl status squid - Kiểm tra từ máy Client: Từ một máy client (thuộc dải
192.168.1.0/24), hãy thử truy cập một trang web HTTP (ví dụ:http://httpbin.org/ip). - Kiểm tra trên Server: Theo dõi log truy cập của Squid:
sudo tail -f /var/log/squid/access.log. Nếu thấy log hiện ra, bạn đã thành công.
Bước 4: Thử thách HTTPS và làm rõ thuật ngữ SslBump
Bạn sẽ nhận ra rằng các trang HTTPS (như Google, Facebook) sẽ không hoạt động. Traffic HTTPS (port 443) được mã hóa và không thể REDIRECT đến cổng 3128 (HTTP) được.
- Để hiểu rõ hơn về cổng này, bạn có thể đọc bài viết: Port 443 là gì? Port 443 dùng làm gì?.
Để xử lý HTTPS, Squid cung cấp một tính năng (feature) gọi là SslBump.
Quan trọng: SslBump có nhiều chế độ (mode) hoạt động:
- Chế độ MITM (Man-in-the-Middle): Chế độ cũ (
client-first). Squid giải mã, đọc nội dung, rồi mã hóa lại. Chế độ này KHÔNG trong suốt vì yêu cầu tất cả client phải cài đặt chứng chỉ CA “giả” của Squid. - Chế độ “Peek and Splice” (Lén nhìn và nối): Chế độ mới (
peek-n-splice) mà chúng ta sẽ dùng.
“Peek and Splice” hoạt động:
- Squid “nhìn trộm” (peek) gói tin SNI chưa bị mã hóa để biết client muốn đi đâu (ví dụ:
google.com). - Sau đó, Squid “nối” (splice) kết nối thẳng đến
google.com. - Client nhận được chứng chỉ “xịn” của Google và không hề hay biết Squid vừa làm trung gian. Đây mới là “trong suốt” thực sự.
Bước 5: Cấu hình Squid cho ‘Peek and Splice’ (HTTPS)
Chúng ta cần một cổng riêng (ví dụ 3129) để xử lý HTTPS.
Tạo chứng chỉ SSL tự ký (Self-Signed)
Squid cần một chứng chỉ (dù là tự ký) để có thể thực hiện thao tác “peek” gói tin SSL.
# Tạo thư mục chứa cert
sudo mkdir -p /etc/squid/ssl
cd /etc/squid/ssl
# Tạo key và cert tự ký, có hiệu lực 10 năm
sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
-keyout squid.key -out squid.crt
Bạn sẽ được hỏi một số thông tin, có thể nhập tự do.
- Cấp quyền cho Squid: (User của Squid là
proxytrên Ubuntu, vàsquidtrên CentOS)# Trên Ubuntu sudo chown -R proxy:proxy /etc/squid/ssl # Trên CentOS (bỏ dấu # nếu dùng CentOS) # sudo chown -R squid:squid /etc/squid/ssl
Khởi tạo Database SSL của Squid
Squid cần một thư mục database để quản lý các chứng chỉ động.
# Xóa database cũ (nếu có)
sudo rm -rf /var/spool/squid/ssl_db
# Tìm đường dẫn chính xác của helper (trên Ubuntu)
# (Trên CentOS 7 thường là /usr/lib64/squid/)
sudo /usr/lib/squid/security_file_certgen -c -s /var/spool/squid/ssl_db -M 4MB
# Cấp quyền cho thư mục database
# Trên Ubuntu
sudo chown -R proxy:proxy /var/spool/squid/ssl_db
# Trên CentOS (bỏ dấu # nếu dùng CentOS)
# sudo chown -R squid:squid /var/spool/squid/ssl_db
Lưu ý: Nếu không tìm thấy security_file_certgen, hãy dùng find / -name security_file_certgen để tìm.
Cập nhật squid.conf cho “Peek and Splice”
Mở lại file cấu hình: sudo nano /etc/squid/squid.conf
- Thêm các dòng sau (bên dưới dòng
http_port 3128):# Cổng HTTPS: Chạy ở port 3129, chế độ intercept và bật ssl-bump http_port 3129 intercept ssl-bump \ generate-host-certificates=on \ dynamic_cert_mem_cache_size=4MB \ cert=/etc/squid/ssl/squid.crt \ key=/etc/squid/ssl/squid.key # Chỉ thị "ma thuật" cho Peek and Splice acl step1 at_step SslBump1 ssl_bump peek step1 all # Bước 1: "Nhìn trộm" SNI ssl_bump splice all # Bước 2: "Nối" kết nối, không giải mã # Cho phép các cổng SSL/TLS (quan trọng) acl SSL_ports port 443 acl CONNECT method CONNECT # Chỉ cho phép CONNECT tới các cổng SSL # Đặt quy tắc này trước quy tắc 'http_access allow localnet' http_access deny CONNECT !SSL_ports
Lưu file cấu hình và thoát. Hãy đảm bảo http_access deny CONNECT !SSL_ports nằm trước http_access allow localnet.
Bước 6: Cập nhật Tường lửa cho Port 443
Bây giờ, chúng ta chuyển hướng traffic HTTPS (port 443) đến cổng 3129 mới của Squid.
Dùng Iptables (Ubuntu/Debian)
# Thêm quy tắc mới cho port 443 (trên card eth1), trỏ về 3129
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 3129
# Lưu lại
sudo netfilter-persistent save
Dùng Firewalld (CentOS/RHEL)
# Thêm quy tắc chuyển hướng (REDIRECT) vĩnh viễn cho port 443
sudo firewall-cmd --permanent --zone=internal --add-redirect=port=443:proto=tcp:toport=3129
# Tải lại
sudo firewall-cmd --reload
Dùng Nftables (Hiện đại)
# Thêm quy tắc redirect cho port 443 (vào bảng 'nat' đã tạo ở Bước 3.3)
sudo nft add rule ip nat prerouting iifname "eth1" tcp dport 443 redirect to :3129
Xử lý SELinux (Chỉ dành cho CentOS/RHEL)
SELinux sẽ chặn Squid kết nối vào các cổng 3128, 3129. Chúng ta cần cho phép nó.
# Cài đặt công cụ 'semanage'
sudo yum install -y policycoreutils-python-utils
# "Dạy" SELinux rằng 2 cổng này là cổng của Squid
sudo semanage port -a -t squid_port_t -p tcp 3128
sudo semanage port -a -t squid_port_t -p tcp 3129
Khởi động lại và kiểm tra (HTTPS)
- Kiểm tra cú pháp file config:
sudo squid -k parseNếu không báo lỗi là thành công.
- Khởi động lại Squid:
sudo systemctl restart squid - Kiểm tra từ máy Client: Mở trình duyệt và truy cập bất kỳ trang HTTPS nào (ví dụ:
https://google.com). Trang web phải tải bình thường, và bạn sẽ thấy biểu tượng ổ khóa “Connection is secure” (kết nối an toàn) với chứng chỉ gốc của Google. - Kiểm tra trên Server:
sudo tail -f /var/log/squid/access.logBạn sẽ thấy các dòng
CONNECT google.com:443 ...hoặc tương tự.
Bảng so sánh cấu hình (Ubuntu vs. CentOS vs. Nftables)
| Tính năng | Ubuntu (22.04) | CentOS 7 | Nftables (Hiện đại) |
| User chạy Squid | proxy |
squid |
Tùy distro |
| Path SSL Helper | /usr/lib/squid/... |
/usr/lib64/squid/... |
Tùy distro |
| Tường lửa (Cũ) | iptables |
firewalld |
nft (thay thế cả hai) |
| Redirect HTTP | ... -j REDIRECT --to-port 3128 |
... --add-redirect=port=80:proto=tcp:toport=3128 |
... redirect to :3128 |
| Redirect HTTPS | ... -j REDIRECT --to-port 3129 |
... --add-redirect=port=443:proto=tcp:toport=3129 |
... redirect to :3129 |
| Vấn đề SELinux | Không | Bắt buộc (Phải chạy semanage port ...) |
Bắt buộc (Nếu bật) |
Gỡ lỗi (Troubleshooting)
- Lỗi: Client không thể truy cập bất kỳ trang nào (Timeout)
- Kiểm tra:
net.ipv4.ip_forwardđã bằng 1 chưa? (Chạycat /proc/sys/net/ipv4/ip_forward). - Kiểm tra: Tường lửa đã được cấu hình đúng (
REDIRECT, không phảiDNAT) và đã tải lại chưa? - Kiểm tra:
systemctl status squid(xem Squid có đang chạy không). - Xem thêm: Phân tích & sửa lỗi kết nối Proxy: Hướng dẫn debug “Connection Refused” & “Timeout” (HTTP/SOCKS5).
- Kiểm tra:
- Lỗi: HTTP (Port 80) chạy, HTTPS (Port 443) không chạy
- Kiểm tra: Quy tắc tường lửa cho port 443 đã đúng và trỏ về port 3129 (chứ không phải 3128) chưa?
- Kiểm tra: Quyền sở hữu thư mục SSL DB (
/var/spool/squid/ssl_db) đã đúng (userproxyhoặcsquid) chưa? - Kiểm tra: Log lỗi của Squid:
sudo tail -f /var/log/squid/cache.log. Thường lỗi SslBump sẽ hiện ở đây. - Kiểm tra (CentOS): Đã chạy
semanage portcho port 3129 chưa?
Câu hỏi thường gặp (FAQ)
1. Squid Transparent Proxy là gì?
Đây là một máy chủ proxy tự động chặn và chuyển hướng traffic mạng (như truy cập web) mà không đòi hỏi bất kỳ cấu hình nào từ phía máy người dùng (client). Người dùng thậm chí không biết họ đang truy cập Internet thông qua proxy.
2. Tại sao tôi không cần cài đặt chứng chỉ CA trên máy client?
Vì chúng ta sử dụng chế độ “Peek and Splice”. Ở chế độ này, Squid chỉ “nhìn trộm” (peek) địa chỉ website mà client muốn đến (ví dụ: google.com), sau đó “nối” (splice) kết nối thẳng tới máy chủ Google. Trình duyệt của bạn nhận được chứng chỉ “xịn” trực tiếp từ Google, do đó không có cảnh báo bảo mật và không cần cài CA.
3. Cấu hình này có hỗ trợ WebSocket (WS) hoặc SPDY không?
Không. Đây là một trong những nhược điểm lớn nhất của phương pháp Interception Proxy. Nó sẽ làm hỏng các kết nối sử dụng WebSocket (thường dùng trong chat trực tiếp, game) và các giao thức nâng cao khác.
4. Tôi có thể yêu cầu User/Password (xác thực) với proxy này không?
Không. Vì trình duyệt của client không biết nó đang nói chuyện với proxy (nó nghĩ đang nói chuyện với web server gốc), nó sẽ không bao giờ gửi thông tin xác thực proxy.
5. Lệnh intercept và transparent trong squid.conf khác gì nhau?
Chúng về cơ bản là giống nhau. transparent là chỉ thị cũ dùng trong Squid 3.x. intercept là chỉ thị hiện đại, được khuyến nghị sử dụng cho các phiên bản Squid mới khi cấu hình proxy trong suốt.
6. Tại sao tôi bị lỗi “Timeout” (Hết giờ) khi truy cập web?
Đây là lỗi phổ biến nhất và thường do 3 nguyên nhân:
- Bạn quên kích hoạt
net.ipv4.ip_forward=1. - Quy tắc tường lửa (
iptables,firewalld,nftables) của bạn bị sai (ví dụ: gõ sai port, sai tên card mạng) hoặc chưa được tải lại. - Dịch vụ Squid của bạn không chạy (kiểm tra bằng
systemctl status squid).
7. Lỗi Permission Denied (Từ chối truy cập) khi Squid khởi động?
Lỗi này rất phổ biến trên CentOS/RHEL. Đó là do SELinux đang chặn Squid truy cập vào các cổng 3128, 3129. Bạn bắt buộc phải chạy lệnh semanage port (như ở Bước 6.4) để cho phép các cổng này.
Kết luận
Chúc mừng! Bạn vừa hoàn thành một trong những cấu hình phức tạp nhưng mạnh mẽ nhất của Squid. Bằng cách kết hợp intercept của Squid, REDIRECT của tường lửa, và chế độ Peek and Splice của SslBump, bạn đã xây dựng thành công một Squid Transparent Proxy thực thụ.
Hệ thống này cho phép bạn kiểm soát traffic mạng mà không cần can thiệp từ phía người dùng. Tuy nhiên, hãy luôn ghi nhớ các nhược điểm (như không tương thích WebSocket) trước khi triển khai trong môi trường production.
Để chạy một proxy hiệu suất cao, ổn định, bạn cần một nền tảng VPS mạnh mẽ. Hãy tham khảo các gói VPS Linux tốc độ cao của ZingServer để triển khai hệ thống gateway của riêng bạn ngay hôm nay! Bạn có thể tham khảo tối ưu VPS Ubuntu 24.04 với Checklist 11+ bước quan trọng để bắt đầu.




