我安排了一个透明的 Squid 代理,它监听本地主机的 3128 端口,以阻止一些网站。
我已经使用 Firefox 测试了该代理,并且它可以运行。
然后我运行了这个,希望将所有的 http 请求重定向到代理:
sudo iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-ports 3128
遗憾的是,什么都没发生。我的系统中的其他浏览器似乎没有使用代理。我也不想配置每个浏览器来使用代理。
sudo iptables -L
显示没有指定规则。
我使用的是 Ubuntu 13.04,并使用 3G USB 调制解调器 ( ppp0
) 连接到互联网。任何建议都非常感谢!
答案1
我认为您错过了目的港,请尝试以下操作
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
没有端口,您正在将目标端口为 3128 的流量转发到本地端口 3128。您想要的是将目标端口为 80 的流量转发到本地端口 3128。
此外,为了展示纳特规则,使用
iptables -t nat -L
但是,上述规则不适用于在浏览器的同一台机器上设置的透明代理,因为预路由chain 在从远程客户端路由之前会修改数据包,并且不会对本地生成的数据包执行任何操作。因此我们应该使用输出从系统发出的本地生成的数据包的链。
尝试关注
iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner proxy --dport 80 -j REDIRECT --to-port 3128
它将仅重定向用户拥有的进程以外的进程的流量proxy
。
如果没有-m owner ! --uid-owner proxy
,它将无法工作,因为规则也会捕获代理服务器的传出流量并最终陷入循环。