我想将我的实例的所有流量重定向到运行透明 squid 代理的另一个实例,使用 IP 表规则并且不更改实例的默认路由。
它是在 POSTROUTING 链上完成的吗?操作是什么?SNAT?MASQUERADE?
有人有一个可行的例子吗?
我尝试过这个:
iptables -t nat -A PREROUTING -p tcp -m multiport \
--dports 80,443,2323 -j DNAT --to-destination squid-ip:3128
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
这显然不起作用。谢谢。
答案1
使用 iptables 无法轻松实现这一点;让我来给你一些见解。透明代理位于用户和互联网之间,并拦截通过它路由的所有数据包。为了实现这一点(在正常情况下),透明代理会查看源地址和目标地址,并执行打开连接所需的所有步骤。
现在,让我告诉你为什么 iptables 对你的要求来说不是一个好的选择。
- DNAT(改变目标 IP)不是一个好主意,因为透明代理不再知道数据包是发往哪个目的地。
- 在这种情况下,MASQUERADE 是无用的,因为这是一个隐藏源子网的目标,而目标网络没有路由到该子网(通常在家庭路由器上完成,以隐藏来自互联网的私有子网)
- SNAT 会更糟,因为改变源 IP 会导致网关将回复发送回错误的 IP……
您真正需要的是动态更改所选流量的网关。动态路由是一个复杂的主题,我不会在这里讨论。也许您应该重新考虑更改默认网关,这将是最简单的解决方案……或者,像这样放置两个路由:
route add -net 0.0.0.0/1 gw <squid_ip>
route add -net 128.0.0.0/1 gw <squid_ip>
这样,即使不再使用,您的默认网关仍会保留。但删除这两条路由后,您的默认网关又恢复了功能……