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

ztn*_*man 2 ubuntu proxy iptables

我有一台 Ubuntu 12.04 主机,上面有一个在端口 8080 上运行的鱿鱼代理。我想使用 iptables 通过鱿鱼代理来自主机的所有 Web 流量。正确的方法是:

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
Run Code Online (Sandbox Code Playgroud)

这是行不通的。当我浏览到某个页面时,即使禁用了代理,它也会正常显示。任何建议表示赞赏。

小智 5

tl;dr你的命令非常接近。您需要删除该-d 127.0.0.1片段并确保以其他用户身份运行代理进程,并从过滤器中排除该用户,-m owner ! --uid-owner <other-username>以便代理不会将其流量重定向到自身。

\n\n

更多详情

\n\n

我发现大多数配置透明代理的建议都iptables假设代理计算机位于与客户端不同的主机上。我想代理源自的计算机的流量(并且我还在同一台计算机上运行代理)。

\n\n

我读你问题的方式让我觉得你也想要同样的东西。

\n\n

这篇博文提到了修复方法:

\n\n
\n

本地主机也是如此

\n\n

如果您想在与服务器相同的计算机上运行客户端(您\xe2\x80\x99在咖啡店里使用笔记本电脑;给我准备一份糕点),我们\n可以\xe2\x80\x99t使用PREROUTING 表,因为它仅适用于来自外部的数据包。我们能做的就是修改\n数据包OUTPUT上的目标端口 我们可以做的是修改客户端进程问题是它也会影响 mitmproxy 输出的数据包,并且我们会进入路由循环。

\n\n

可能有多种方法可以解决这个问题,但对我来说最有效的方法是以 root 身份运行 mitmproxy,并使 iptables 规则不 生效 root 拥有的进程。

\n\n
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner root --dport 443 -j REDIRECT --to-port 8080\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • -mowner:加载 所有者 模块。
  • \n
  • !\xe2\x80\x93uid-所有者根:规则不适用于 root 拥有的进程
  • \n
\n\n

请记住,在这种情况下,您\xe2\x80\x99 将以 root 身份运行 mitmproxy。这还将记录您的所有 https Web 浏览器流量。添加 -m multiport 并\n 替换 --dport--dports 以拦截多个端口(或仅使用不同的端口重复该行)。

\n
\n\n

还有这个mitmproxy 论坛帖子有一个解决方案,因此您不必以 root 身份运行。您专门创建一个单独的用户来运行 mitmproxy,然后在 iptables 过滤器中排除该用户的 uid。

\n\n

我发现@keerthi 评论中链接的线程不太正确,因为那是关于转发本地主机上的单个端口,而我认为您想转发所有端口 traffic.

\n