iptables本身不解析URL或内容,仅按源IP等条件重定向流量至本地代理(如Clash、Squid),再由代理服务基于域名/IP黑白名单、GFWList等执行非法资源过滤与放行决策。

在 Linux 上用 iptables -t nat 配置基于源 IP 的透明代理并过滤非法外网资源,核心不是让 iptables 做内容识别或 URL 过滤,而是通过“标记 + 重定向 + 代理服务策略”三级联动实现:先按源 IP 匹配流量,再用 NAT 链重定向到本地代理进程,最后由代理服务(如 Clash、Sing-Box、Squid)执行域名/IP 黑白名单、GFWList 或自定义规则判断是否放行。
一、明确前提:透明代理 ≠ iptables 内容过滤
iptables 本身不解析 HTTP/HTTPS 请求体、不校验域名、不验证证书。它只在网络层/传输层工作,能做的只有:
• 根据源 IP(-s)、目的端口(--dport)、接口(-i)等条件匹配数据包
• 用 REDIRECT 把 TCP 流量导向本机端口(如 1080)
• 或用 TPROXY(需 mangle 表)保留原始目标地址,供支持 TPROXY 模式的代理识别真实域名
真正的“非法资源识别”必须交由后端代理程序完成。
二、按源 IP 分流:设置 nat 规则重定向
假设你要对内网 192.168.10.0/24 网段强制走代理,而 192.168.20.0/24 免代理;代理监听在 127.0.0.1:7890(Clash TUN/TPROXY 模式)或 127.0.0.1:3128(Squid transparent 模式):
- 启用 IP 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward,并写入/etc/sysctl.conf - 加载必要模块(TPROXY 场景):
modprobe xt_TPROXY_IPV4 nf_tproxy_ipv4 xt_socket - 添加 PREROUTING 规则(网关模式,eth0 接内网):
iptables -t nat -A PREROUTING -i eth0 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to-port 7890iptables -t nat -A PREROUTING -i eth0 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to-port 7890 - 排除代理自身回环和管理流量(防循环):
iptables -t nat -A PREROUTING -s 127.0.0.1 -j RETURNiptables -t nat -A PREROUTING -d 127.0.0.1 -j RETURN
三、代理服务侧配置关键点
仅靠 iptables 无法拦截 HTTPS 域名或判断“非法”,必须配合代理服务的策略能力:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
Squid:需开启
http_port 3128 transparent,并在acl中定义源 IP 段,再用url_regex或dstdomain匹配黑名单(如.xxx.com、/.*malware.*/),最后http_access deny -
Clash/Sing-Box:使用
rules:段,例如:- GEOIP,AD,REJECT(拦截广告 IP)- DOMAIN-SUFFIX,example-bad.com,DENY- SRC-IP-CIDR,192.168.10.0/24,PROXY(确保该段走规则) -
HTTPS 注意事项:REDIRECT 会破坏 TLS SNI 原始值;若需精准识别域名,必须用 TPROXY + 支持 socket 检查的代理(如 Sing-Box 的
sniffer: true),否则只能靠 IP 黑名单或证书错误拦截。
四、增强控制:结合 ipset 实现动态源 IP 管理
当需要频繁增删受控源 IP(如临时封禁某台设备),用 ipset 比写多条 iptables 规则更高效:
- 创建集合:
ipset create blocked-src hash:ip - 加入要拦截的源 IP:
ipset add blocked-src 192.168.10.55 - 在 nat 表中跳过重定向:
iptables -t nat -I PREROUTING -m set --match-set blocked-src src -j RETURN
(这条规则放在重定向规则之前,匹配即跳出,不走代理) - 后续只需操作 ipset,无需改 iptables 规则










