我有一个客户想要在 SSL 流量离开其网络时对其进行拦截。我建议的解决方案是设置一个透明的代理,该代理同时具有第 2 层和第 3 层,这样它就可以简单地放入他们的网络中,而无需更改配置。代理有两个 NIC,一个连接到服务器,另一个连接到客户端。客户端、代理和网关由客户控制,服务器则不受控制。
例如:
client --- Proxy --- gateway -|- server
我的代理程序配置了 IP_TRANSPARENT 套接字选项,以便它可以响应发往远程 IP 的连接。
我正在使用以下设置:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --on-port 3128 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -p tcp -j MARK --set-mark 1
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1
有问题的客户端位于其自己的子网上,并且已配置为代理作为默认网关。
结果是:
- 客户端向代理发送一个帧;源 IP 是客户端,源 mac 是客户端,目标 IP 是服务器,目标 mac 是代理
- 代理将此帧转发到网关;源 IP 是代理,源 mac 是代理,目标 IP 是服务器,目标 mac 是网关
- 网关将其转发到服务器并得到响应。
- 网关将答复发送回代理;源 IP 是服务器,源 mac 是网关,目标 IP 是代理,目标 mac 是代理
- 代理将此回复转发给客户端;源 IP 是服务器,源 mac 是代理,目标 IP 是客户端,目标 mac 是客户端。tproxy 和 iptables 配置允许代理发送具有非本地 IP 地址的数据包。
有没有办法在 mac 地址级别使某些东西透明?也就是说,将客户端放在与网关相同的子网上。网关将源 IP 和 mac 视为客户端的 IP 和 mac,即使它们源自代理。是否可以通过将代理配置为网桥然后使用 ebtables 升级要由 iptables 处理的流量来实现?
当我使用 ebtables 将某些内容推送到 iptables 时,我的代理程序似乎没有响应数据包,因为它们的目的地是网关的 mac 地址,而不是代理的 mac 地址。
我还可以调查哪些其他潜在途径?
编辑:当客户端和网关位于不同的子网(并且客户端已将代理设置为网关)时,其工作方式如 1 至 5 中所述。但我想知道是否可以将客户端和网关放在同一个子网中,并使代理完全透明(即客户端不知道代理)。客户不想将某些客户端移动到不同的子网,他们只是想要一个临时解决方案。谢谢!
编辑 2:我可以使用 brctl 将代理配置为网桥,但找不到将此流量定向到我的代理程序的方法 - 在此处询问Linux 桥接器可以拦截流量吗?。目前,描述编号为 1 到 5,它在第 3 层运行;它在客户端是透明的(客户端认为它正在与服务器的 IP 通信),但在网关端不透明(网关正在与代理的 IP 通信)。我想知道的是,是否有可能让它在第 2 层运行,这样它就完全透明了?我应该研究哪些可用选项?谢谢
编辑 3:更详细地澄清情况。
答案1
如果机器位于同一子网中,则答案是否定的。在子网中,以太网协议将数据包从一台机器传送到另一台机器,在以太网层,MAC 地址是真正的源地址,而 IP 地址则未知。