Linux透明代理需同时开启IPv4转发、放行FORWARD链、关闭rp_filter三开关;REDIRECT改目的IP适用于HTTP/HTTPS,TPROXY保原始五元组需代理启用IP_TRANSPARENT并配合mangle表与route_localnet=1。

Linux 实现透明代理不是单纯加几条 iptables 规则就能跑通的事,关键在于理解流量路径、内核机制与代理服务的协同关系。核心是让流量“无感”经过代理,客户端无需改配置,应用层还能拿到真实目标地址。
必须打开的三个开关
缺一不可,否则流量直接静默丢弃:
- 开启 IPv4 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward,并写入/etc/sysctl.conf持久化 - 确认 FORWARD 链默认策略不是 DROP:
iptables -L FORWARD -n | head -1;若为 DROP,临时测试可设为 ACCEPT,生产环境需精确放行 - 关闭反向路径过滤(rp_filter),否则回包被内核丢弃:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter和对应网卡(如eth0)的同路径文件
两种主流转发方式选对场景
REDIRECT 简单够用,TPROXY 更“真透明”:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
REDIRECT(适合 HTTP/HTTPS 代理):只支持本机代理,会把目的 IP 改成 127.0.0.1,丢失原始目标地址。典型规则:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 1080 -
TPROXY(适合需要识别域名或处理 UDP 的场景):不改包头,保留原始五元组,但要求代理监听时启用
IP_TRANSPARENTsocket 选项,并配合 mangle 表和策略路由。最小可用组合:iptables -t mangle -A PREROUTING -i eth0 -p tcp -m socket --transparent -j TPROXY --on-port 1080 --on-ip 127.0.0.1
同时确保net.ipv4.conf.all.route_localnet = 1,否则发往 127.0.0.1 的 TPROXY 包会被丢弃
防循环和放行规则不能少
代理自身发出的流量如果也被重定向,就会无限套娃:
- 在 PREROUTING 最前面排除本地回环:
iptables -t nat -I PREROUTING -s 127.0.0.1 -j RETURN - 若代理运行在 Docker 或特定子网,也要排除:
iptables -t nat -I PREROUTING -s 172.17.0.0/16 -j RETURN - FORWARD 链必须允许进、出方向的流量,尤其注意 UDP 回程要显式放行(不能只靠 ESTABLISHED):
正向:iptables -A FORWARD -i eth0 -o eth1 -d 192.168.2.5 -p udp --dport 53 -j ACCEPT
反向:iptables -A FORWARD -i eth1 -o eth0 -s 192.168.2.5 -p udp --sport 53 -j ACCEPT
代理服务本身要配对
iptables 只负责“送过去”,代理得能“接得住”:
- Squid 需在
squid.conf中声明端口为 transparent:http_port 3128 transparent - Clash/Sing-Box 等现代代理需启用 TPROXY 模式,并监听
0.0.0.0:1080且开启ip-transparent选项 - 自研代理必须以 root 或 CAP_NET_RAW 权限启动,并在 bind socket 时设置
IP_TRANSPARENT

















