我有一台 Ubuntu 12.04 主机,上面有一个在端口 8080 上运行的 squid 代理。我想使用 iptables 通过 squid 代理来自主机的所有 Web 流量。正确的方法是:
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
这不起作用。当我浏览页面时,即使代理被禁用,它也会正常显示。任何建议都值得赞赏。
答案1
总结您的命令非常接近。您需要删除该-d 127.0.0.1
片段,并确保以其他用户身份运行代理进程,并将该用户从过滤器中排除,-m owner ! --uid-owner <other-username>
这样代理就不会将其流量重定向到自身。
更多详情
我发现大多数关于配置透明代理的建议iptables
都假设代理机器位于分离主机与客户端之间的通信。我希望代理来自从我的机器(并且我也在同一台机器上运行代理)。
通过阅读您的问题,我认为您想要同样的东西。
这博客文章提到修复:
本地主机也是如此
如果你想在与服务器相同的机器上运行客户端(你在咖啡店里用笔记本电脑;给我准备点心),我们不能使用 PREROUTING 表,因为它只适用于来自外部的数据包。我们可以做的是修改数据包上的目标端口 输出 由我们的客户端进程控制。问题是,它还会影响 mitmproxy 输出的数据包,并且我们会陷入路由循环。
解决这个问题的方法可能有几种,但对我而言最有效的方法是以 root 身份运行 mitmproxy,并制定 iptables 规则 不是 适用于 root 拥有的进程。
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8080
- -m 所有者:加载 所有者 模块。
- !–uid 所有者 root:规则不适用于 root 拥有的进程
请记住,在这种情况下,您将以 root 身份运行 mitmproxy。这还将记录您的所有 https Web 浏览器流量。添加
-m multiport
并替换--dport
为--dports
以拦截多个端口(或仅使用不同的端口重复该行)。
和这个mitmproxy 论坛主题有一个解决方案,这样您就不必以 root 身份运行。您可以专门创建一个单独的用户来运行 mitmproxy,然后在 iptables 过滤器中排除该用户的 uid。
我发现 @keerthi 评论中链接的帖子不太正确,因为这是关于在本地主机上转发单个端口,而我认为你想要转发全部交通。
答案2
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
在你的规则中,IPTables 将仅有的重定向流量发往本地主机到代理。此规则将重定向任何发往端口 80 的流量。在规则中,更改-d到-s并且它将会起作用。