如何在Linux中使用iptables将HTTP和HTTPS流量转发到透明代理

13

我有一个Ubuntu Linux系统作为网关系统,上面有两个接口。一个接口是用于本地网络的,另一个接口是用于互联网的。我能够毫无问题地通过它路由流量。我使用两条iptables规则将出站流量从内部接口转发:

iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface eth1 -j ACCEPT

我现在需要创建一个 iptables 规则,以过滤和重定向通过 eth1 接口离开我的网络的所有 TCP 端口 80 和 443 流量,并将其发送到在本地回环接口上的 TCP 端口 9090 上的代理服务器。

我已经在 Stack Overflow 上搜索了很久,但是没有找到可行的示例。有没有一种有效的方法可以做到这一点?


3
不是 SO 相关话题,应该发到 [sf] 上。 - Jim Garrison
2个回答

17
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 9090

透明代理无法使用HTTPS。虽然有一些技巧,但这没有任何意义且毫无用处。


嘿,diegows,我认为这个规则只会改变数据包的端口而不是数据包的目标IP地址,对吧? - ajt
REDIRECT目标将数据包重定向到本地机器,总是如此 :) - Diego Woitasen
1
HTTPS 透明代理:https://www.tectut.com/2015/08/configure-squid-as-http-and-https-transparent-proxy/ - Jeryl Cook
3
透明代理可以利用HTTPS,为什么你认为它们不能呢? - iNoob
@iNoob 因为你期望进行端到端的加密通讯。代理在这方面并不添加任何价值。正如我所说,有一些方法,但并不推荐。 - Diego Woitasen
3
代理服务器可以为离开网络的数据添加价值,并且在大多数情况下,代理服务器是唯一被允许与网络外进行通信的系统。如果您使用中间人攻击(mitming),代理服务器还可以检查https流量。因此,它确实有其价值,这取决于您想要实现什么目标。 - iNoob

2
iptables -t nat -A PREROUTING -i eth0 -s ! squid-box -p tcp --dport 80 -j DNAT --to squid-box:3128
iptables -t nat -A POSTROUTING -o eth0 -s local-network -d squid-box -j SNAT --to iptables-box
iptables -A FORWARD -s local-network -d squid-box -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT

说明:

  • squid-box:你的Squid服务器
  • local-network:你的网络(在我的情况下是192.168.0.0/24)
  • iptables-box:你的iptables软件所在的地方(通常为网关,在我的情况下为192.168.1.1)

第一个命令将数据包从iptables-box发送到squid-box。第二个命令确保回复通过iptables-box发送回来,而不是直接发送给客户端(这非常重要!)。最后一个命令确保iptables-box将适当的数据包转发到squid-box。它可能不是必需的,具体情况因人而异。请注意,我们指定了“-i eth0”和“-o eth0”,它们分别代表输入接口eth0和输出接口eth0。如果你的数据包在不同的接口上进入和离开,则需要相应地调整命令。

将这些命令添加到适当的启动脚本中,路径为/etc/rc.d/。

来源:http://www.tldp.org/HOWTO/TransparentProxy-6.html


--dport 80 的意思是只转发端口80吗?我能通过Squid转发所有端口吗? - Pawel Cioch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接