使用 iptables 将本地流量重定向到代理端口

使用 iptables 将本地流量重定向到代理端口

我有一台 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并且它将会起作用。

相关内容