Squid + iptables:我如何允许https传递并绕过Squid?

时间:2010-04-08 15:55:44

标签: https iptables squid pass-through

今天基本上从Squid和iptables开始(谷歌是你的朋友)。这件事将成为我的死亡。

我在Ubuntu 9.04服务器上安装了Squid3作为Transparent Proxy。当我使用代理框作为我的默认网关等时,它工作得很好。此设置的iptable规则是本教程的一部分。 :P

遗憾的是,我无法访问https网站(例如Gmail或基本上443端口上的任何内容)。这是因为Squid不喜欢它无法缓存的内容,在这种情况下是https流量。

我想添加iptable规则,以便我基本上可以访问https网站并使用Skype。基本上允许这些类型的流量通过而不经过Squid代理? (绕过它可以这么说)

是否有人可能知道如何做到这一点,或者有任何来源的链接可以帮助我搞清楚?

谢谢。

3 个答案:

答案 0 :(得分:5)

在实际考虑通过我自己的手腕咀嚼并梦寐以求的IP整夜+蛮力谷歌搜索/尝试任何我可以得到我的数字手指我设法把一些实际工作的东西放在一起。我不知道技术原因,所以如果你能提供解释,请这样做! :d

PS:解释中的所有内容都是通过命令行

完成的

PS:这不是最终的解决方案,但它是回答我自己的问题的一个有效的解决方案。

这是:

步骤1:必须在包装盒上启用IP转发:

vim /etc/sysctl.conf

//查找并取消注释以下内容

net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1

第2步:添加循环规则(当所有端口都被覆盖时,这更适用于显然很多应用需要它?

iptables -I INPUT -i lo -j ACCEPT

步骤3.添加绕过端口443的规则:(eth1是互联网接口,x.x.x.x / eth0是LAN接口)

iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t filter -A FORWARD -i eth0 -p tcp --dport 443 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source x.x.x.x

步骤4.然后最后规则使Squid透明:(x.x.x.x是LAN接口的IP)

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination x.x.x.x:3128

iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

答案 1 :(得分:3)

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source x.x.x.x

那是错的。意味着您从实习生LAN发送到Internet的每个数据包TCP/UDP/etc将使用专用LAN IP(可能是192.178.x.x)而不是公共IP作为SOURCE IP。

可能对您有所帮助:

PREROUTING == DestinationNAT -> From Internet to Intern LAN

POSTROUTING == SourceNAT -> From Intern LAN to Internet


iptables -t nat -A PREROUTING -i intern -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i intern -p tcp --dport 3128 
iptables -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o extern -p tcp --dport 80
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i extern -p tcp --sport 80
iptables -A OUTPUT -j ACCEPT -m --state ESTABLISHED,RELATED -o intern -p tcp --sport 80

绕过443就足够了:

iptables -I FORWARD -p tcp --dport 443 -j ACCEPT

如果您的system/squid/firewall也是从您的网络到互联网的路由器,请不要忘记:

iptables -t nat -A POSTROUTING -o extern -j SNAT --to-source Public_external_IP

答案 2 :(得分:1)

对于那些解释......

步骤#1将机器设置为路由器。对于任何要接受或转发目的地为其他机器的IP流量的Linux机器,都需要这样做。如果没有这个,网络堆栈的最低级别将拒绝流量,NAT甚至没有机会做到这一点。

步骤#2与被问及的问题无关。与代理无关的路由器操作可能需要也可能不需要。

步骤#3使机器中继端口443正常作为路由器。使用MASQUERADE而不是SNAT可以使POSTROUTING规则更好。

步骤#4两条线以不同的方式做同样的事情。如果您不知道DNAT和REDIRECT之间的差异,第一行可能会导致您将来遇到麻烦。为简单起见,仅使用REDIRECT。

阅读http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect本可以为您节省很多麻烦。

您的设置中还缺少一个关键的mangle表规则,该规则在该Wiki页面上进行了解释。