Skip to content

Latest commit

 

History

History
18 lines (11 loc) · 2.09 KB

File metadata and controls

18 lines (11 loc) · 2.09 KB

透明代理

在 Linux 下, 我们可以很方便地创建虚拟网卡。虚拟网卡可以位于 2 层 (tap 设备, 包头中带有 mac 头) 或 3 层 (tun 设备, 包头中带有 ip 头, 无 mac 头)。利用虚拟网卡, 我们可以使机器上所有其他应用程序的流量全部直接经过我们的代理服务器。这样做的好处是, 无需配置应用程序即可使得流量经过代理服务器。例如, 如果有一个没有源代码、不支持通常代理配置方法的应用程序, 此时我们若想捕获它的网络流量, 即可使用透明代理。

当流量经过 tun 模式的透明代理时, 应用程序发给代理服务器的流量是直接以 ip 包的形式发送的。例如, 应用程序发起一个 tcp 连接时, 透明代理收到的报文是一个 syn 包。此时, 透明代理需要将这个 syn 包转换为一个外向连接请求; 如果实现了 socks5 客户端的功能, 还可能将这个 syn 包转换为一个 socks5 连接请求。连接建立之后, 透明代理也需要维护每个连接在经过代理前的 (source IP, source port) 到经过代理后的 tcp 连接的对应关系, 并进行双向的流量转发。

如果需要实现 UDP 连接的透明代理 (DNS 协议是走 UDP 的; 如果想让透明代理支持解析域名, 则需要支持 UDP 代理), 则还需要将 UDP 的端口与出向的 UDP binding 建立映射。

我们还需要把机器上的流量路由到虚拟网卡上。这项工作可以调用 ip 命令来完成。难点在于, 如何使得透明代理本身的流量不会路由回到虚拟网卡上。在 Linux 系统中, 可以对每个包打标签 (mark), 可以配置 iptables 规则来让不同标签的包使用不同的路由表, 从而实现流量的分离。

实现此功能大致分为以下几个部分:

  • tun 设备的创建及报文的发送、收取 (可以调用第三方库完成)
  • 连接映射的维护
  • tcp 报文的解析及封装 (可以调用第三方库完成)
  • 修改 Linux 路由表

此功能难度较大, 需要对网络有较深入的理解。非常不建议在除 Linux 外的任何操作系统上完成此功能。