透明代理讓用戶端**無需任何瀏覽器設定**,流量經由網關強制導向 Squid 代理伺服器,實現統一存取控制、內容快取與頻寬管理。本文詳細記錄 Linux 2.2/2.4/2.6 核心下透明代理的完整部署流程,涵蓋 Squid 設定、核心選項編譯、防火牆轉向規則與常見陷阱。
前置條件: 用戶端預設閘道必須指向 Squid 主機;用戶端 DNS 設定正確(由瀏覽器自行解析域名)。
/etc/squid/squid.conf)http_port 3128 transparent # 2.6 核心建議寫法
# 或舊版相容寫法
http_port 8080
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
/etc/squid.conf)http_port 8080
httpd_accel virtual 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
重新載入設定:squid -k reconfigure。若提示核心不支援,需重編核心。
核心配置選項(make menuconfig → Networking options):
[*] Network packet filtering framework (Netfilter)
[*] IP tables support (required for filtering/masq/NAT)
[*] Connection tracking (required for masq/NAT)
[*] FTP protocol support
[*] IRC protocol support
[*] IP tables NAT support
[*] REDIRECT target support # 關鍵:透明代理重導向
[*] Full NAT
[*] MASQUERADE target support
[*] REDIRECT target support
[*] Packet mangling
[*] LOG target support
# 2.4/2.6 核心不再有獨立 "IP: transparent proxy support" 選項
# 透明代理完全由 Netfilter REDIRECT 目標實現
編譯安裝新核心並重啟。
# 1. 允許本地回環
iptables -A INPUT -i lo -j ACCEPT
# 2. 允許本機發出的封包(防迴路)
iptables -A INPUT -p tcp -d --dport 80 -j ACCEPT
# 3. 核心規則:將內網 HTTP 流量重導向 Squid
iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 3128
# 4. 若 Squid 不在閘道上,需額外 DNAT/SNAT,此處假設 Squid 即閘道
關鍵點: 必須在 nat 表的 PREROUTING 鏈處理,早於路由決策。
ipchains -A input -i lo -j ACCEPT
ipchains -A input -p tcp -d /32 80 -j ACCEPT
ipchains -A input -p tcp -s /24 -d 0/0 80 -j REDIRECT 8080
ipfwadm -I -a accept -W lo
ipfwadm -I -a accept -P tcp -D /32 80
ipfwadm -I -a accept -P tcp -S /24 -D 0/0 80 -r 8080
/etc/rc.d/rc.firewall)#!/bin/sh
IPT=/sbin/iptables
LAN_IF=eth0
LAN_NET=192.168.11.0/24
SQUID_PORT=3128
# 清空規則
$IPT -F
$IPT -t nat -F
$IPT -X
# 預設策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# 允許回環
$IPT -A INPUT -i lo -j ACCEPT
# 允許已建立連線
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 透明代理核心規則
$IPT -t nat -A PREROUTING -i $LAN_IF -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT
# 允許內網其他流量轉發(可選)
$IPT -A FORWARD -i $LAN_IF -s $LAN_NET -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# NAT 上網(若為閘道)
$IPT -t nat -A POSTROUTING -s $LAN_NET -o -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
squid.conf 設定 http_access allow localnet 等規則,否則預設拒絕net.core.netdev_max_backlog、nf_conntrack_max 等核心參數# 檢查 NAT 規則
iptables -t nat -L -n -v
# 檢查 Squid 存取日誌
tail -f /var/log/squid/access.log
# 用戶端測試:直接瀏覽 https://example.com,觀察日誌出現 TCP_MISS/200 或 TCP_HIT/200
透明代理是企業級網路管控的基石,配合 SquidGuard/DansGuardian 可實現內容過濾,結合 Delay Pools 實現頻寬限速,構建完整的上網行為管理體系。