Proxy cho Transparent Proxy / iptables
Trong hầu hết các trường hợp, khi chúng ta nói về proxy, chúng ta ám chỉ proxy "bình thường" hoặc "không trong suốt". Loại proxy này yêu cầu cài đặt rõ ràng trong mỗi ứng dụng. Nhưng còn có một cách khác, mạnh mẽ hơn nhiều — proxy trong suốt (Transparent Proxy).
Công nghệ này chặn và chuyển hướng lưu lượng mạng mà người dùng cuối và ứng dụng của họ không biết. Các chương trình trên máy tính của người dùng thậm chí không biết rằng lưu lượng của họ đi qua proxy.
Tương tự:
Proxy thông thường giống như gửi bưu kiện qua dịch vụ chuyển phát nhanh mà bạn tự chọn và gọi.
Proxy trong suốt giống như tất cả các bưu điện mặc định đóng gói tất cả các bưu kiện của bạn và gửi chúng theo một lộ trình đặc biệt mà không thông báo cho bạn.
Cơ chế làm cho điều này trở nên khả thi trong thế giới Linux được gọi là iptables. Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thức hoạt động của nó, mục đích của nó và cách thiết lập hệ thống như vậy trong thực tế.
⛔️ Cảnh báo quan trọng trước khi bắt đầu
Hướng dẫn này dành cho người dùng nâng cao. Bạn sẽ làm việc với iptables và có quyền truy cập root đầy đủ vào hệ thống. Lệnh sai có thể chặn hoàn toàn quyền truy cập mạng của bạn (bao gồm SSH).
- Kiểm tra trong VM: Luôn kiểm tra các cài đặt như vậy trước tiên trong máy ảo.
- Có kế hoạch dự phòng: Đảm bảo rằng bạn có quyền truy cập console vào máy chủ (không phải SSH) trong trường hợp bạn bị chặn mạng.
- Nhà cung cấp đáng tin cậy: Bạn tin tưởng toàn bộ lưu lượng truy cập của mình vào máy chủ proxy. Đảm bảo rằng bạn sử dụng nhà cung cấp đáng tin cậy và đã được kiểm chứng. Không proxy lưu lượng truy cập nhạy cảm (ngân hàng) mà không có mã hóa end-to-end.
- Tương thích: Đối với các bản phân phối mới (Ubuntu 22+, Fedora), hãy kiểm tra
iptables --version— nếu là nft, hãy chuyển sang:sudo update-alternatives --set iptables /usr/sbin/iptables-legacy. Trong các container (Docker), redsocks yêu cầu cap_net_admin; hãy sử dụng --privileged.
Phần 1. Tại sao cần proxy trong suốt?
Proxy trong suốt là kiểm soát toàn diện lưu lượng truy cập ở cấp độ mạng.
- Mạng công ty và Wi-Fi: Để lọc nội dung, lưu trữ dữ liệu và phân tích an ninh tập trung.
- Quản lý thiết bị (IoT): Bạn có thể proxy lưu lượng truy cập từ các thiết bị không thể cấu hình proxy thủ công (Smart TV, máy chơi game, thiết bị IoT).
- Vượt qua kiểm duyệt cho toàn bộ mạng: Thay vì thiết lập VPN trên mỗi thiết bị, bạn có thể thiết lập một lần cho bộ định tuyến, bộ định tuyến này sẽ chuyển toàn bộ lưu lượng truy cập qua proxy.
Phần 2. Cơ chế hoạt động: iptables
iptables là công cụ quản lý gói mạng trong nhân Linux (Netfilter). Chúng ta sẽ sử dụng bảng nat (Network Address Translation).
Điểm mấu chốt là lựa chọn đúng chuỗi để chặn:
- Chuỗi PREROUTING: Chặn lưu lượng truy cập đi qua máy chủ của bạn (lưu lượng chuyển tiếp). Đây là lựa chọn của bạn nếu bạn đang cấu hình cổng hoặc bộ định tuyến cho các thiết bị khác trong mạng.
- Chuỗi OUTPUT: Chặn lưu lượng do CHÍNH MÁY CHỦ tạo ra (ví dụ: curl, apt-get hoặc các tập lệnh được chạy cục bộ).
Phần 3. Thực hiện thực tế với redsocks
REDIRECT đơn giản không thể hoạt động với các proxy SOCKS5 từ xa yêu cầu xác thực. Chúng ta sẽ cần redsocks.
redsocks là một daemon nhận lưu lượng được chuyển hướng bởi iptables, sau đó tự thiết lập kết nối với proxy từ xa của bạn.
Lưu ý: redsocks gốc khá cũ (cập nhật cuối cùng ~2018). Chúng tôi khuyên bạn nên sử dụng redsocks2 (REDSOCKS2), có các bản sửa lỗi, tính năng mới (tự động chuyển hướng mà không cần danh sách đen, hỗ trợ shadowsocks, IPv6) và có hiệu lực đến năm 2025. Nếu bản phân phối của bạn có gói redsocks2, hãy sử dụng nó.
Nếu không:git clone https://github.com/semigodking/redsocks && cd redsocks && make && sudo make install
(hoặc fork tương tự https://github.com/Intika-Linux-Proxy/Red-Socks-2).
Bước 1: Thu thập dữ liệu xác thực proxy
Bước đầu tiên và quan trọng nhất là đảm bảo rằng bạn có đầy đủ thông tin đăng nhập. Những "chìa khóa" này sẽ cho phép ứng dụng hoặc trình duyệt của bạn kết nối với máy chủ proxy và chuyển lưu lượng truy cập qua nó.
Hãy chuẩn bị các thông tin sau:
- Địa chỉ IP (máy chủ lưu trữ)
- Cổng để kết nối
- Tên đăng nhập và mật khẩu để xác thực
- Loại giao thức (HTTP/HTTPS hoặc SOCKS5)
*Hình 1. Ảnh chụp màn hình này cho thấy tất cả các trường cần thiết để kết nối với máy chủ proxy trong tài khoản cá nhân **CyberYozh App**.*Bước 2. Cài đặt redsocks
sudo apt update
sudo apt install redsocks # Đối với bản gốc; đối với redsocks2 — xem ở trên
Bước 3. Cấu hình redsocks (TCP + DNS)
Mở tệp cấu hình sudo nano /etc/redsocks.conf. Thay thế dữ liệu proxy của bạn để tệp có dạng như sau. Chúng ta sẽ cấu hình redsocks cho lưu lượng TCP, redudp cho UDP/DNS và dnstc cho TCP-DNS (để bắt các yêu cầu TCP hiếm).
base {
log_debug = off;
log_info = on;
log = "file:/var/log/redsocks.log"; // Đường dẫn đến nhật ký để gỡ lỗi
daemon = on;
user = redsocks;
group = redsocks;
redirector = iptables;
}
// Phần dành cho lưu lượng TCP (HTTP, HTTPS, v.v.)
redsocks {
local_ip = 0.0.0.0;
local_port = 12345; // Cổng mà redsocks sẽ lắng nghe cho TCP
ip = 51.77.190.247; // Địa chỉ IP của proxy SOCKS5 từ xa của bạn
port = 9595; // Cổng của proxy SOCKS5 từ xa của bạn
type = socks5; // Sử dụng SOCKS5 (có thể sử dụng http-connect cho proxy HTTP hoặc http-relay cho HTTP thuần túy)
login = "pcobLdlPkt-res-any"; // Tên đăng nhập từ proxy
password = "PC_7CJ2WQqdHNm42dHWj"; // Mật khẩu từ proxy
}
// Phần dành cho lưu lượng DNS (UDP)
redudp {
local_ip = 0.0.0.0;
local_port = 10053; // Cổng mà redsocks sẽ lắng nghe cho DNS
ip = 51.77.190.247; // Cùng IP proxy SOCKS5
port = 9595; // Cùng cổng SOCKS5 proxy
type = socks5;
login = "pcobLdlPkt-res-any"; // Cùng tên đăng nhập
password = "PC_7CJ2WQqdHNm42dHWj"; // Cùng mật khẩu
}
// Phần dành cho TCP-DNS (để bắt các yêu cầu TCP hiếm)
dnstc {
local_ip = 127.0.0.1;
local_port = 5300;
}
Bước 4. Cấu hình iptables (Bước quan trọng nhất)
Các quy tắc này là cốt lõi của hệ thống của chúng tôi. Chúng sẽ ngăn chặn rò rỉ và các vòng lặp vô tận.
Quan trọng: iptables không có "chế độ chỉnh sửa" tích hợp như trình soạn thảo văn bản. Các quy tắc được lưu trữ trong bộ nhớ kernel và được điều khiển bằng các lệnh. Để xem, xóa, chèn hoặc thay thế, hãy sử dụng các lệnh iptables. Đối với các chỉnh sửa phức tạp, hãy tải các quy tắc vào tệp, chỉnh sửa tệp và tải lại. Điều này đặc biệt hữu ích với iptables-persistent, nơi các quy tắc được lưu trữ trong /etc/iptables/rules.v4.
Bước 1. Xem các quy tắc hiện tại
Đầu tiên, hãy xem các quy tắc hiện có để hiểu những gì cần chỉnh sửa.
# Xem tất cả các quy tắc trong bảng nat với số dòng
sudo iptables -t nat -L -n -v --line-numbers
-t nat: Bảng nat (cho REDIRECT của chúng ta).-L: Danh sách các quy tắc.-n: IP số (không có DNS).-v: Chi tiết (bộ đếm gói).--line-numbers: Số quy tắc (để xóa/chèn).
Ví dụ về kết quả:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REDSOCKS all -- * * 0.0.0.0/0 0.0.0.0/0
Bước 2. Chỉnh sửa đơn giản: Xóa, chèn và thay thế
Đối với những thay đổi nhỏ:
- Xóa quy tắc theo số: Chỉ định chuỗi và số.
# Xóa quy tắc số 1 trong PREROUTING
sudo iptables -t nat -D PREROUTING 1
- Chèn quy tắc mới vào vị trí: Sử dụng -I (insert).
# Chèn vào vị trí 1 trong PREROUTING (ví dụ: với các cổng bổ sung) sudo iptables -t nat -I PREROUTING 1 -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS - Thay thế quy tắc: Sử dụng -R (replace).
# Thay thế quy tắc số 1 trong PREROUTING
sudo iptables -t nat -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j REDSOCKS
Bước 3. Chỉnh sửa qua tệp (đối với các thay đổi phức tạp)
Tải các quy tắc vào tệp văn bản, chỉnh sửa và tải lên.
- Tải các quy tắc:
sudo iptables-save > /tmp/iptables.rules # Tệp tạm thời
# Hoặc để lưu trữ vĩnh viễn: sudo nano /etc/iptables/rules.v4
- Chỉnh sửa tệp: Mở tệp trong nano hoặc vi. Tệp trông như sau (ví dụ):
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:REDSOCKS - [0:0]
-A REDSOCKS -d 1.2.3.4 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
# ... các ngoại lệ còn lại
-A REDSOCKS -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 12345
-A PREROUTING -j REDSOCKS
-A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 10053
-A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
Thêm/xóa các dòng có -A, -I, v.v. Lưu tệp.
- Tải quy tắc:
sudo iptables-restore < /tmp/iptables.rules
# Để duy trì: sudo netfilter-persistent reload
Bước 4. Xóa các quy tắc (nếu cần xóa)
- Xóa chuỗi:
sudo iptables -t nat -F REDSOCKS(flush). - Xóa chuỗi:
sudo iptables -t nat -X REDSOCKS. - Xóa hoàn toàn nat:
sudo iptables -t nat -F(cẩn thận!).
Lời khuyên: Sau khi thay đổi, hãy kiểm tra các quy tắc (iptables -t nat -L) và kiểm tra lưu lượng truy cập (curl, dig). Đối với IPv6, hãy sử dụng ip6tables. Nếu hệ thống sử dụng nftables, hãy chỉnh sửa /etc/nftables.conf và áp dụng sudo nft -f /etc/nftables.conf.
Bắt đầu cấu hình iptables:
# QUAN TRỌNG: Chỉ định IP của proxy từ xa của bạn
PROXY_IP="51.77.190.247"
# --- CÀI ĐẶT CHUNG ---
# Xóa chuỗi REDSOCKS (nếu có, để kiểm tra)
sudo iptables -t nat -F REDSOCKS || true
sudo iptables -t nat -X REDSOCKS || true
# Tạo chuỗi REDSOCKS mới cho TCP
iptables -t nat -N REDSOCKS
# Loại trừ máy chủ proxy để tránh vòng lặp vô tận
iptables -t nat -A REDSOCKS -d $PROXY_IP -j RETURN
# Bỏ qua mạng cục bộ và mạng dành riêng
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
# --- SỬA CHỮA: Chỉ chuyển hướng lưu lượng WEB ---
# Chúng tôi KHÔNG muốn phá vỡ SSH, FTP, v.v. Chỉ chuyển hướng HTTP và HTTPS.
# Đối với email (25,465) hoặc các cổng khác, hãy thêm vào --dports
iptables -t nat -A REDSOCKS -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 12345
# (Tùy chọn) Nếu bạn chắc chắn muốn proxy TOÀN BỘ lưu lượng TCP:
# iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 12345
# --- CHỌN KỊCH BẢN CỦA BẠN ---
# === KỊCH BẢN A: Proxy cho cổng (lưu lượng của các thiết bị KHÁC) ===
# Khách hàng phải sử dụng máy chủ làm cổng mặc định (qua DHCP hoặc tĩnh)
# 1. Bật chuyển tiếp IP (liên tục)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 2. Áp dụng quy tắc cho lưu lượng truy cập trung chuyển
iptables -t nat -A PREROUTING -j REDSOCKS
# 3. Chặn lưu lượng DNS (UDP 53) và gửi đến redsocks
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 10053
# 4. Chặn TCP-DNS
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300
# 5. Bật MASQUERADE (RẤT QUAN TRỌNG đối với cổng)
# Thay thế eth0 bằng giao diện mạng NGOÀI của bạn
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# === KỊCH BẢN B: Proxy cho chính máy chủ (lưu lượng truy cập NỘI BỘ) ===
# 1. Áp dụng quy tắc cho lưu lượng cục bộ
iptables -t nat -A OUTPUT -j REDSOCKS
# 2. Chặn lưu lượng DNS cục bộ
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-port 10053
# 3. Chặn TCP-DNS
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-port 5300
Quan trọng: Không áp dụng cả hai kịch bản cùng lúc nếu không hiểu rõ. Chọn kịch bản phù hợp với nhiệm vụ của bạn.
Bước 5. Khởi động redsocks
sudo systemctl start redsocks
# Đảm bảo dịch vụ đã được khởi động
sudo systemctl status redsocks
Phần 4. Vấn đề và Giải pháp Nâng cao
*Rò rỉ DNS (UDP vs TCP) *
Hướng dẫn này giải quyết vấn đề bằng cách chặn các yêu cầu DNS qua UDP (cổng 53) và TCP với dnstc. Tuy nhiên, nếu proxy không hỗ trợ UDP-associate (cho redudp), DNS sẽ không hoạt động — hãy kiểm tra nhật ký. Để bảo vệ hoàn toàn, hãy kiểm tra tại dnsleaktest.com.
Vấn đề với HTTPS và SSL
redsocks không có vấn đề này. Nó hoạt động ở cấp độ truyền tải (TCP) và không cố gắng giải mã lưu lượng HTTPS của bạn. Nó chỉ lấy gói HTTPS đã được mã hóa của bạn và "gói" toàn bộ vào SOCKS5. Chủ sở hữu proxy không thể đọc dữ liệu của bạn.
# Lưu ý về các giải pháp thay thế hiện đại
redsocks là một công cụ mạnh mẽ nhưng khá cũ. Vào năm 2025, đối với các hệ thống mới, đặc biệt là các hệ thống sử dụng nftables, người ta thường khuyên dùng các giải pháp thay thế hiện đại hơn, chẳng hạn như ss-redir (từ shadowsocks-libev) hoặc V2Ray/Xray, thực hiện các tác vụ tương tự với hiệu suất và plugin tốt hơn. Đối với UDP không có redsocks, hãy xem xét TPROXY trong iptables/nftables. Nếu trong container hoặc trên Android/routers (GL.iNet) — redsocks hoạt động, nhưng yêu cầu firmware tùy chỉnh.
Phần 5. Kiểm tra và khắc phục sự cố
Nếu có gì đó không hoạt động, đây là danh sách kiểm tra của bạn:
- Kiểm tra IP:
curl ifconfig.me(phải hiển thị IP của proxy SOCKS5 của bạn, không phải của máy chủ). - Kiểm tra DNS:
dig google.comhoặcnslookup google.com. Kiểm tra địa chỉ IP phản hồi. Kiểm tra rò rỉ: Mở browserleaks.com hoặc dnsleaktest.com. - Kiểm tra nhật ký redsocks: Đây là công cụ hữu ích nhất của bạn.
tail -f /var/log/redsocks.log # Hoặc: journalctl -u redsocks
Tìm các thông báo lỗi kết nối hoặc xác thực (ví dụ: 'authentication failed' — login/password không chính xác).
- Kiểm tra tính khả dụng của proxy: Đảm bảo rằng máy chủ của bạn có thể kết nối với máy chủ proxy:
nc -zv 51.77.190.247 9595
# (Câu trả lời mong đợi: Connection to 51.77.190.247 9595 port [tcp/*] succeeded!)
- Kiểm tra cổng:
ss -tuln(phải nghe 12345, 10053, 5300). - Kiểm tra tường lửa: Đảm bảo rằng ufw hoặc firewalld không chặn các quy tắc mới của bạn. Nếu SSH bị hỏng — tắt chuyển hướng toàn bộ TCP.
- Các vấn đề thường gặp: 'Kết nối nhưng không phản hồi' — kiểm tra proxy-type (http-relay cho HTTP). Vòng lặp vô tận? Đảm bảo rằng PROXY_IP đã bị loại trừ.
Phần 6. Lưu các quy tắc iptables
Cài đặt iptables sẽ bị xóa khi khởi động lại. Để làm cho chúng trở thành vĩnh viễn, hãy cài đặt iptables-persistent.
sudo apt update
sudo apt install iptables-persistent
Trong quá trình cài đặt, nó sẽ hỏi bạn có muốn lưu các quy tắc hiện tại hay không. Hãy đồng ý. Nếu sau này bạn thay đổi các quy tắc, hãy thực hiện:
sudo netfilter-persistent save
Để xóa:sudo iptables -t nat -F REDSOCKS; sudo iptables -t nat -X REDSOCKS; sudo iptables -t nat -D PREROUTING/OUTPUT ...
(xóa các quy tắc cụ thể).
Kết luận
Proxy trong suốt với iptables là một công cụ cực kỳ mạnh mẽ. Nhờ redsocks (hoặc redsocks2), nó có thể được cấu hình để hoạt động với các proxy SOCKS5 hiện đại. Điều quan trọng là phải nhớ về an ninh, tránh chặn tất cả lưu lượng TCP (bằng cách lọc cổng), bật MASQUERADE cho các cổng và luôn chặn các yêu cầu DNS để tránh rò rỉ.
Câu hỏi thường gặp
- Kết nối không hoạt động? Kiểm tra proxy trong nhật ký: 'authentication failed' — login/password không chính xác.
- Vòng lặp vô tận? Đảm bảo rằng PROXY_IP đã bị loại trừ.
- Trong container? Redsocks yêu cầu cap_net_admin; sử dụng --privileged trong Docker.
- Không hoạt động với proxy của tôi? Nếu là HTTP — sử dụng type = http-connect để tương thích với HTTPS.