这是我的networkingconfiguration:
我的networkingconfigurationhttp://daveden.files.wordpress.com/2013/05/network-configuration.png
代理服务器在端口3128上使用Squid运行Ubuntu,在端口8080上运行DansGuardian。
我想强制所有客户端使用代理服务器 – 特别是端口8080 – 用于任何HTTP / HTTPS访问。
但是,我不想透明地redirect,因为这不适用于HTTPS。 我不介意configuration每个客户端,我不介意每个客户端都知道它使用的是代理服务器。 我只是不希望客户端能够在没有代理设置的情况下浏览网页。
我该怎么做呢? 如果客户端未configuration为在端口8080上使用代理服务器,是否可以丢弃数据包?
我尝试使用iptables丢弃具有8080以外的端口的数据包,但拒绝太多我认为我不能再访问任何东西。
我重新写了这个问题,以便它不是特定于iptables,但我并不反对使用iptables。 我只想吸引更广泛的可能的解决scheme。
我想我可能给了一些错误的印象。 只是要清楚,我不是有兴趣过滤 HTTPSstream量(例如,在代理上查看数据包并检查内容)。 我更感兴趣的是使用DansGuardian 阻止网站,无论是通过HTTP还是HTTPS(通过查看数据包的目的地)。
根据Alexandru-Florin Vintil的build议,下面是我现在正在做的事情:
# Redirect HTTP traffic to port 8080 (DansGuardian) iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080 # Check TCP and UDP traffic against whitelist iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist # Drop all other HTTPS traffic iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP # Drop all traffic aimed straight at the proxy iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP
简而言之,将HTTPstream量redirect到端口8080,丢弃所有未列入白名单的HTTPSstream量(在单独的链中),并删除所有明确使用代理的stream量。 如果没有最后一条规则,客户端可以使用HTTPS访问任何网站,只要他们将浏览器configuration为使用代理服务器,因为那么目标端口是8080而不是443.因此,即使删除所有绑定到443的stream量也不会完全阻止HTTPS 。
我的2美分:
关于HTTP:让防火墙将80端口stream量透明地转发给代理/filter是最简单的方法。 无需客户端configuration,您可以免除任何主机/子网使用代理,而无需客户端重新configuration。 这是唯一可以保证所有应该通过代理的方式。
除了阻止所有传出的HTTPS 443stream量以及仅允许基于允许传出端口443的IP的站点的子集以外的任何方法将无法按预期工作。 HTTPS的安全协议被devise为防止中间人攻击(代理是“合法的”MITM)(有一些瑕疵)。 通过这种方式,HTTPS被允许执行它devise的任务。 但是,如果你想IGNORE HTTPS,你应该设置你的鱿鱼使用直接,而不是使用连接(窃听),但即使这种情况下,你仍然可能遇到混合HTTP / HTTPS部分有问题的网站。 这样,你的Squid代理也会pipe理HTTPS。 这也应该反映在防火墙的透明转发部分。
每当你看到某个应该起作用的东西不起作用时,你就需要询问是否还有其他一些你没有看到的因素。 规则
sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT
看起来它应该工作,但你已经把它附加到INPUT链,所以它可能被链条中的先前的规则绕过。 这个规则本身应该是足够的,因为INPUT链是传入数据包命中的第一个链。 如果它们在INPUT链上被拒绝,他们永远不会到达FORWARD或OUTPUT链。 当然,这个规则会阻止所有不是8080端口的TCP,这可能并不是你真正想要的东西,除非8080上的代理是机器上唯一的服务,而你只能从控制台login。
所以首先要做的是列出规则并寻找可能导致数据包通过的原因:
sudo iptables -L
如果你的防火墙是反向NAT,那么你也应该列出NAT表。
sudo iptables -L -t nat
之后,尝试在链的开头放置相同的规则:
sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT
看看是否能解决问题,或者至less让你更加确信自己了解了iptables工作方式,以便完成规则集。 如果你正在从远程工作这个主机,我的build议会切断你,所以你应该只从控制台做到这一点。 为了安全地从远程工作,请参阅我的同事Eli Rosencruft关于从远程调整防火墙的文章 。
一个单独的(用户定义的)链可能会有所帮助。
# create a chain just for user 100 (192.168.1.100) iptables -N custom_user_100 # redirect all traffic FROM user 100 to custom chain iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100 # return from user chain for valid traffic, drop all other iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN iptables -A custom_user_100 -j DROP
所以 – 这是做什么redirect到192.168.1.100的任何stream量到一个自定义链。 如果find有效的匹配(stream量指向端口8080),则此自定义(用户定义的)链仅返回。 所有其他不匹配的stream量都不会从链中返回。
稍后,您可以查看表格统计信息来validation这是发生了什么事情:
iptables -L -v -n
现在,在处理转发stream量的机会之外,会有一些不同的规则 – 但使用自定义(用户定义的)链的想法是一样的。 我喜欢参考这个链接图: http : //www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htm当试图了解stream量数据包。
在这种情况下,您可能需要执行以下操作:
# create a chain just for user 100 (192.168.1.100) iptables -N custom_user_100 # redirect all traffic FROM user 100 to custom chain iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100 # return from user chain for valid traffic, drop all other iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN iptables -A custom_user_100 -j DROP
除了应用于INPUT链的规则被应用于FORWARD链之外,这与第一个相同。
我已经重新阅读你的问题。 所以会重新开始。
假设你的“代理”实际上是一个路由器。 也就是说,它将所有数据包从一个接口传递到另一个接口 – 可能使用NAT。 这意味着所有感兴趣的数据包都stream经FORWARD链。
下一步:你说你将使用端口8080configuration所有的客户端自己的代理。 精细。 这意味着所有这些数据包将通过INPUT链进入“代理”。
所以:你只是想阻止任何人在FORWARD链上走出8080端口。
iptables -A FORWARD -p tcp --dport 8080 -j REJECT
这个规则将确保任何被转发到目的地端口8080的数据将被拒绝(一个ICMP数据包将被发送到试图通过代理传递数据包的客户端)。
在你实现这个规则之后,通过尝试进行这种禁止连接来testing这个规则是非常重要的 – 然后你通过input以下内容来列出规则:
iptables -L -v -n |grep 8080
并确保柜台增加。 如果没有,那么路由器configuration有问题。
首先阅读一下iptables文档 – 具体来说,你至less需要知道数据包将在哪个表中链接(请看这里: http : //www.iptables.info/en/structure-of-iptables.html ) 。
你必须在两件事情之间取得平衡:你的目标是强迫每个人使用代理和每个人的方便。 一方面,你可以禁止任何数据包的转发(你甚至可以在内核中禁用ip_forwarding标志)。 这样,本地计算机将只能通过您的代理服务器访问互联网。 但即使这样也不能阻止所有人通过你的http代理使用隧道连接(而使用https代理更容易)。 所以你将无法完全监控或限制互联网的使用。
另一方面,你可以采取一个更柔和的方法:只限制输出到80端口的stream量。在这种情况下,不使用http(例如Skype)的软件将不必隧道stream量在http和良好的客户端将具有本地httpcaching的所有好处(更快地访问站点)。
您当前的configuration看起来像上面的第一个选项。 但是你在FORWARD链中有不必要的接受规则。 您不希望路由器转发任何数据包。 本地计算机连接到您的代理(数据包通过INPUT链),而不是远程主机。 使用您当前的设置,有人可以在互联网上任何地方的端口8080上查找代理,然后使用该代理来代替您的代理。
如果您不希望您的客户端访问没有代理的http {s}站点,那么您可能只需要将数据包DROP或REJECT到端口80和443:
IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT
eth1是你的内部接口。 这样做,您将不必与其他端口/访问混乱。
就个人而言,我喜欢将INPUT和FORWARD链的默认策略设置为DROP
iptables -P INOUT DROP iptables -P FORWARD DROP
然后,只允许我想要的stream量 – 这样,我发现更less的惊喜,并且非常确定,只有我允许的才是我指示的地方。