使用 iptables 实现全局代理

使用 iptables 实现全局代理

我在 Windows 环境中运行 Linux 机(Lubuntu 12.04),其中使用 pac 文件来配置互联网访问。

proxy.pac 文件:

function FindProxyForURL(url, host){
  var proxy_yes = "PROXY xxx.xxx.xxx.xxx:8000";
  var proxy_no = "DIRECT";
  if (shExpMatch(url, "*//yyy.*")) { return proxy_no; }
  if (shExpMatch(url, "*//zzz.zzz.*")) { return proxy_no; }
  if (shExpMatch(url, "*foo.com*")) { return proxy_no; }
  //Proxy anything else
  return proxy_yes;
}

据我所知,Lubuntu 没有全局代理系统。

我没有尝试摆弄只有某些程序(例如,不是 Chromium)尊重的 shell 变量(如 HTTP_PROXY),而是考虑使用 iptables 透明地重定向通过代理的所有流量,从而有效地实现全局代理。

这可能吗?如果可能,我该怎么做?

编辑:我应该澄清一下,我不是管理员,也不是想设置代理。代理已经设置好了,要让机器连接到互联网,需要启用自动代理配置并将其指向上面的 pac 文件。直接连接被阻止。

我希望使用 iptables 自动通过代理路由流量,而不是单独配置每个应用程序。

答案1

我承认我以前从未使用过Lubuntu,但我怀疑它只是Ubuntu在虚拟机中运行的衍生产品。依靠 javascript 进行代理是一件非常愚蠢的事情,因为在许多情况下它很容易被绕过或完全忽略……这最终破坏了使用代理的优势。

我将首先使用以下方法设置适当的代理系统squid。对于衍生产品,存储库中ubuntu有一个包,可以使用或轻松安装。安装后,首先编辑并添加或修改以下您认为合适的设置:squidaptsynaptic/etc/squid/squid.conf

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl lan src 192.168.1.1 192.168.2.0/24
http_access allow localhost
http_access allow lan

您可以使用更多配置选项,但这些对于大多数用途来说都是一个很好的开始。之后,下一步就是在默认路由器中配置 iptables 并将DNAT流量重定向到代理squid

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

当然,您可能希望将其放入某种启动脚本中,以便每次路由器启动时都应用规则。此外,请记住,这不会影响https流量,因为https它故意设计为不允许流量被代理(或被中间人拦截/解密/等)。如果您希望过滤掉流量(到可疑站点),您也可以抛出SquidGuard混合在一起。

可以代理 https 流量,但强烈建议不要这样做。如果你真的想实现该功能,这里有一个很好的指南这里

答案2

这就是我最终做的事情:

  • 在 中设置环境变量ALL_PROXYHTTP_PROXYHTTPS_PROXYFTP_PROXY和。NO_PROXY/etc/environment
  • 为 apt 设置 http、https 和 ftp 代理/etc/apt/apt.conf.d/80proxy(使用语法Acquire::http::proxy "http://xxx.xxx.xxx.xxx:8000";
  • 使用代理链对于任何不尊重环境变量且没有内置代理支持的剩余程序。

相关内容