我正在尝试强制一台 PC 使用远程透明 squid 代理,方法是将所有发往端口 80 的传出数据包重新路由到 squid 代理,尽管我在使用精确的 iptables 命令行时遇到了一些困难。
迷你 HOWTO 位于http://tldp.org/HOWTO/TransparentProxy-6.html对于两种“极端”情况有一些很好的链接:三台(或更多)机器设置,其中包括客户端、路由器和代理,以及单台机器设置,其中所有这三台机器都在同一台机器上。
在我的设置中,我有一台机器(名为 foo),其 IP 为 192.168.1.100。通常,它通过路由器 192.168.1.1 连接到互联网,该路由器执行 NAT 并具有公共 IP。在这种情况下,foo 还通过 OpenVPN 隧道(foo 的隧道地址为 10.8.0.5/6)连接到一台名为 bar 的机器(远程地址为 10.8.0.1),该机器运行 squid。我想使用 iptables 将从 foo 发往端口 80 的所有传出数据包路由到 bar 的 squid 代理(端口 3128)。
我一直无法弄清楚要使用哪个链和哪些目标;我所有的尝试要么是非法的(-A OUTPUT 没有 -t nat 和 --to-destination),要么就是没有任何效果(-A PREROUTING、OUTPUT、POSTROUTING 等的各种组合)。
编辑:我认为最接近的答案是这样的:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to 10.8.0.1:3128
现在,端口 80 的流量无法到达任何地方,但至少正在得到处理。使用 -A PREROUTING 失败...可能是因为数据包来自本地,而不是通过机器路由?
答案1
如果我理解正确的话,您想要做的事情不会仅通过配置 iptables 来处理。REDIR 目标只能用于定位在本地系统上运行的进程。我认为尝试使用 DNAT 目标将转发到远程 squid 框会删除远程 squid 框正确处理请求所需的一些信息
请允许我猜一下。我认为您正在尝试将主机上的默认网关保留为 192.168.1.1,然后通过 VPN 发送端口 80 流量,对吗?
远程 squid 需要进行一些配置,以便它实际上可以充当透明代理。如果您可以在 squid 主机上设置正确的 iptables 重定向,并且远程主机位于网络路径中,那么可以使用一些高级路由通过 vpn 转发所有端口 80 请求。
PS,如果我正确理解了您的需求,请添加评论,我可以用有关如何设置路由的更多详细信息更新我的答案。
答案2
转到 foo 并执行以下操作:telnet 10.8.0.1 3128
可以吗?如果可以,您的 VPN 就可以正常工作!
你能做一个
GET / HTTP/1.1
Host: www.heise.de
它会显示页面吗?那么 squid 就配置为透明代理了!
在这种情况下,链接中的简单规则应该有效:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.8.0.1:3128
iptables -t nat -A POSTROUTING -o eth0 -s local-network -d 10.8.0.1 -j SNAT --to iptables-box
(foo 是您正在处理的 iptables-box)
这有用吗?
答案3
在这里你可以看到一篇关于使用 squid 和 iptables 的透明代理的简短文章 http://www.linuxconfig.net/2009/11/14/creating-transparent-proxy-with-squid-and-iptables.html