用于透明代理/iptables的代理

大多数情况下,当我们谈论代理时,指的是“普通”或“非透明”代理。它需要在每个应用程序中进行显式配置。但还有另一种更强大的方法——透明代理。

该技术在终端用户及其应用程序不知情的情况下拦截并重定向网络流量。用户计算机上的程序甚至不会察觉其流量正通过代理传输。

类比说明:
普通代理就像通过您自行选择并预约的快递服务寄送包裹。

透明代理则如同邮局默认将您的所有包裹重新包装,并通过特殊路线寄送,而您对此毫不知情。

在Linux世界中实现此功能的机制称为iptables。本指南将解析其工作原理、应用场景及实际配置方法。

⛔️ 开始前的重要提示
本指南面向高级用户。您将操作iptables并获得系统完全root权限。错误的命令可能导致网络完全中断(包括SSH)。

  • 在虚拟机中测试:请务必先在虚拟机中测试此类配置。
  • 制定备用方案:确保拥有服务器控制台访问权限(非SSH),以防网络被封锁。
  • 可信赖的服务商:您将所有流量托付给代理服务器。请务必选择可靠且经过验证的服务商。请勿在未启用端到端加密的情况下代理敏感流量(如网银操作)。
  • 兼容性:对于新版发行版(Ubuntu 22+、Fedora),请检查iptables --version——若显示nft,请切换至:sudo update-alternatives --set iptables /usr/sbin/iptables-legacy。在容器(Docker)中,redsocks需要cap_net_admin权限;请使用--privileged参数。

第一部分:为何需要透明代理?

透明代理可实现网络层面的全面流量控制。

  • 企业网络和 Wi-Fi:用于内容过滤、数据缓存和集中安全分析。
  • 设备管理(物联网):可代理无法手动配置代理的设备流量(智能电视、游戏机、物联网设备)。
  • 全网绕过审查:无需在每台设备上配置VPN,只需一次性设置路由器,即可将所有流量通过代理转发。

第二部分:工作机制:iptables

iptables 是 Linux 内核(Netfilter)中用于管理网络数据包的工具。我们将使用 nat(网络地址转换)表。

关键点在于正确选择拦截链:

  • PREROUTING 链:拦截通过您服务器的流量 (中转流量)。若您正在为网络中的其他设备配置网关或路由器,则应选择此链路。
  • OUTPUT链路:拦截服务器自身生成的流量(例如curl、apt-get或本地运行的脚本)。

第三部分:使用 redsocks 的实际实现

简单的 REDIRECT 无法处理需要身份验证的远程 SOCKS5 代理。我们需要使用 redsocks。

redsocks 是一个守护进程,它接收 iptables 重定向的流量,然后自行与您的远程代理建立连接。

:原始版 redsocks 相当陈旧(最后更新约在 2018 年)。建议使用分叉版本 redsocks2(REDSOCKS2),该版本包含修复程序、新功能(无黑名单自动重定向、shadowsocks 支持、IPv6)且在 2025 年仍保持更新。若您的发行版包含 redsocks2 包,请直接使用。
否则请执行:
git clone https://github.com/semigodking/redsocks && cd redsocks && make && sudo make install
(或使用类似分支 https://github.com/Intika-Linux-Proxy/Red-Socks-2)。

步骤1:收集代理凭证

第一步也是最重要的一步是确保您拥有完整的授权数据。这些“密钥”将使您的应用程序或浏览器能够连接到代理服务器并通过它传输流量。

请务必准备以下数据:

  • IP地址(主机服务器)
  • 连接端口
  • 授权登录名密码
  • 协议类型(HTTP/HTTPS 或 SOCKS5)
*图1. 此截图显示了在**CyberYozh App**个人账户中连接代理服务器所需的所有字段位置。*
步骤 2. 安装 redsocks
sudo apt update
sudo apt install redsocks  # 原版;redsocks2 版本请参见上文
步骤 3. 配置 redsocks(TCP + DNS)

打开配置文件 sudo nano /etc/redsocks.conf。将其修改为以下内容,并替换为您的代理数据。我们将配置 redsocks 用于 TCP 流量,redudp 用于 UDP/DNS,dnstc 用于 TCP-DNS(以捕获罕见的 TCP 请求)。

base {
    log_debug = off;
    log_info = on;
    log = “file:/var/log/redsocks.log”; // 调试日志路径
    daemon = on;
    user = redsocks;
    group = redsocks;
    redirector = iptables;
}

// TCP流量配置段(HTTP、HTTPS等)
redsocks {
    local_ip = 0.0.0.0;
    local_port = 12345; // redsocks监听TCP的端口

    ip = 51.77.190.247;        // 远程SOCKS5代理的IP地址
    port = 9595;         // 远程SOCKS5代理的端口
    type = socks5;       // 使用 SOCKS5(可选 http-connect 用于 HTTP 代理或 http-relay 用于纯 HTTP)

    login = “pcobLdlPkt-res-any”;    // 代理登录名
    password = “PC_7CJ2WQqdHNm42dHWj”; // 代理密码
}

// DNS流量(UDP)配置段
redudp {
    local_ip = 0.0.0.0;
    local_port = 10053; // redsocks监听DNS的端口
    
    ip = 51.77.190.247;        // SOCKS5代理的IP地址
    port = 9595;         // SOCKS5代理相同端口
    type = socks5;

    login = “pcobLdlPkt-res-any”;    // 相同登录名
    password = “PC_7CJ2WQqdHNm42dHWj”; // 相同密码
}

// TCP-DNS 部分(用于捕获罕见的 TCP 请求)
dnstc {
    local_ip = 127.0.0.1;
    local_port = 5300;
}
步骤 4. 配置 iptables(最重要的一步)

这些规则是我们的系统核心。它们将防止泄漏和无限循环。

重要提示: iptables 没有像文本编辑器那样的内置“编辑模式”。规则存储在内核内存中,通过命令进行管理。要查看、删除、插入或替换规则,请使用 iptables 命令。进行复杂编辑时,请将规则导出至文件进行编辑后再重新加载。使用 iptables-persistent 时尤为便捷,其规则存储于 /etc/iptables/rules.v4。

步骤 1. 查看当前规则

首先查看现有规则以明确编辑方向。

# 查看nat表中所有规则及行号
sudo iptables -t nat -L -n -v --line-numbers
  • -t nat:nat表(用于我们的REDIRECT规则)。
  • -L:规则列表。
  • -n:数字IP(不带DNS)。
  • -v:详细模式(包含数据包计数器)。
  • --line-numbers:规则编号(用于删除/插入)。

输出示例:

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           
步骤 2. 简单编辑:删除、插入和替换

对于小幅修改:

  • 按编号删除规则:指定链和编号。
  # 删除 PREROUTING 中的第 1 条规则
  sudo iptables -t nat -D PREROUTING 1
  • 在特定位置插入新规则:使用 -I(插入)。
    # 在PREROUTING中插入第1位规则(例如添加额外端口)
    sudo iptables -t nat -I PREROUTING 1 -p tcp -m multiport --dports 80,443,8080 -j REDSOCKS
    
  • 替换规则:使用 -R(replace)。
  # 替换 PREROUTING 中的第 1 条规则
  sudo iptables -t nat -R PREROUTING 1 -p tcp -m multiport --dports 80,443 -j REDSOCKS
步骤 3. 通过文件编辑(用于复杂修改)

将规则导出到文本文件,编辑后再导入。

  • 导出规则

    sudo iptables-save > /tmp/iptables.rules  # 临时文件
    # 或为持久化:sudo nano /etc/iptables/rules.v4
    
  • 编辑文件:用 nano 或 vi 打开。文件示例如下:

    *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
    # ...其余例外
    -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
    

    添加/删除带有 -A、-I 等的行。保存文件。

  • 加载规则

    sudo iptables-restore < /tmp/iptables.rules
    # 持久化设置:sudo netfilter-persistent reload
    
步骤 4. 清除规则(如需重置)
  • 清除链:sudo iptables -t nat -F REDSOCKS(flush)。
  • 删除链:sudo iptables -t nat -X REDSOCKS
  • 完全清除 nat:sudo iptables -t nat -F(请谨慎操作!)。

提示:修改后请检查规则(iptables -t nat -L)并测试流量(curl, dig)。对于 IPv6 请使用 ip6tables。若系统基于nftables,请编辑/etc/nftables.conf并执行sudo nft -f /etc/nftables.conf

开始配置iptables:

# 重要提示:请填写您的远程代理IP
PROXY_IP="51.77.190.247"

# --- 通用配置 ---
# 清除 REDSOCKS 链(若存在,用于测试)
sudo iptables -t nat -F REDSOCKS || true
sudo iptables -t nat -X REDSOCKS || true

# 为 TCP 创建新的 REDSOCKS 链
iptables -t nat -N REDSOCKS

# 排除代理服务器本身,避免无限循环
iptables -t nat -A REDSOCKS -d $PROXY_IP -j RETURN

# 忽略本地和保留网络
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

# --- 修正:仅重定向WEB流量 ---
# 我们不想破坏SSH、FTP等服务。仅重定向HTTP和HTTPS。
# 对于电子邮件(25,465)或其他端口,请添加到--dports中
iptables -t nat -A REDSOCKS -p tcp -m multiport --dports 80,443 -j REDIRECT --to-port 12345

# (可选) 若确定需要代理所有TCP流量:
# iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 12345

# --- 选择您的场景 ---

# === 场景 A:网关代理(其他设备的流量) ===
# 客户端应将服务器设为默认网关(通过 DHCP 或静态配置)

# 1. 启用IP转发(永久生效)
echo ‘net.ipv4.ip_forward=1’ | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 2. 对中转流量应用规则
iptables -t nat -A PREROUTING -j REDSOCKS

# 3. 拦截DNS流量(UDP 53)并转发至redsocks
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 10053

# 4. 拦截 TCP-DNS
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300

# 5. 启用 MASQUERADE(网关的关键操作)
# 将 eth0 替换为您的外部网络接口
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


# === 方案 B:服务器自身的代理(本地流量) ===

# 1. 对本地流量应用规则
iptables -t nat -A OUTPUT -j REDSOCKS

# 2. 拦截本地 DNS 流量
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-port 10053

# 3. 拦截 TCP-DNS
iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-port 5300

重要提示:若未深入理解,请勿同时应用两种方案。请根据实际需求选择合适的方案。

步骤 5. 启动 redsocks
sudo systemctl start redsocks
# 确认服务已启动
sudo systemctl status redsocks

第四部分:问题与高级解决方案

*DNS 泄漏(UDP 与 TCP) *

本指南通过dnstc拦截UDP(端口53)和TCP的DNS请求来解决问题。但若代理不支持UDP关联(redudp),DNS将无法通过——请检查日志。为确保全面防护,请访问dnsleaktest.com进行验证。

HTTPS与SSL问题

redsocks不存在此问题。它在传输层(TCP)运行,不会尝试解密您的HTTPS流量。它仅将您已加密的HTTPS数据包整体“封装”到SOCKS5中。代理所有者无法读取您的数据。

# 关于现代替代方案的说明

redsocks 功能强大但较为陈旧。2025 年起,对于新系统(尤其是使用 nftables 的系统),通常推荐更现代的替代方案,如 ss-redir(来自 shadowsocks-libev)或 V2Ray/Xray,它们能以更优性能和插件实现类似功能。对于不使用 redsocks 的 UDP,请考虑 iptables/nftables 中的 TPROXY。在容器或 Android/路由器(GL.iNet)上,redsocks 虽然可用,但需要定制固件。

第五部分:测试与调试

若遇到故障,请按以下步骤排查:

  • 检查IP地址curl ifconfig.me(应显示SOCKS5代理的IP地址,而非服务器地址)。
  • 检查DNSdig google.comnslookup google.com。检查响应的IP地址。检查泄漏:打开browserleaks.com或dnsleaktest.com。
  • 检查redsocks日志:这是您的最佳帮手。
    tail -f /var/log/redsocks.log
    # 或:journalctl -u redsocks
    

查找连接或认证错误信息(例如'authentication failed'——登录名/密码错误)。

  • 检查代理可用性: 确保您的服务器能够连接到代理服务器:
  nc -zv 51.77.190.247 9595
  # (预期响应:Connection to 51.77.190.247 9595 port [tcp/*] succeeded!)
  • 检查端口ss -tuln(应监听12345、10053、5300端口)。
  • 检查防火墙:确保ufw或firewalld未阻塞新规则。若SSH故障,请关闭所有TCP转发。
  • 常见问题:‘连接但无响应’——检查代理类型(HTTP 需为 http-relay)。出现无限循环?确保 PROXY_IP 已排除。

第 6 部分:保存 iptables 规则

iptables 设置会在重启时重置。要使其永久生效,请安装 iptables-persistent。

sudo apt update
sudo apt install iptables-persistent

安装过程中会询问是否保存当前规则。请同意。若后续修改规则,请执行以下命令保存:

sudo netfilter-persistent save

清除规则:
sudo iptables -t nat -F REDSOCKS; sudo iptables -t nat -X REDSOCKS; sudo iptables -t nat -D PREROUTING/OUTPUT ...
(删除具体规则)。

总结

基于 iptables 的透明代理是极其强大的工具。借助 redsocks(或 redsocks2),可将其配置为支持现代 SOCKS5 代理。关键在于注意安全性:避免拦截所有TCP流量(需过滤端口)、为网关启用MASQUERADE,并始终拦截DNS请求以防止泄露。

常见问题解答

  • **连接失败?**请检查日志中的代理信息:‘authentication failed’ 表示登录名/密码错误。
  • 出现无限循环? 确保已排除 PROXY_IP。
  • 在容器中运行? Redsocks 需要 cap_net_admin 权限;请在 Docker 中使用 --privileged 参数。
  • 无法与我的代理配合使用? 若为 HTTP 协议,请使用 type = http-connect 以实现 HTTPS 兼容性。