iptables的规则来阻止所有的web请求到domain.com

我知道这不是最好的解决scheme,它不是一个生产服务器,但是,我仍然试图删除请求到一个域,如果它不匹配域string。

如果我自己应用这个规则,到目前为止它是有效的,但是它不会与其他规则一起工作。 我猜是因为iptables对命令敏感。

iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # Allow unlimited traffic on loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow full outgoing connection but no incomming stuff iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Block sites iptables -I INPUT -p tcp --dport 80 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 80 -m string --string ! "sub.domain.com" --algo kmp -j DROP iptables -A INPUT -i eth0 -j DROP iptables -A OUTPUT -j DROP 

Iptables对规则sorting是非常敏感的。 第一场比赛决定了封包的命运。

可能发生的情况是,在stringDROP规则之前,您有一条规则匹配并接受ESTABLISHED包。 ESTABLISHED规则是iptables安装程序中的第一个规则,这是很常见的。

如果我没有弄错,连接在第一个SYN数据包后立即获得ESTABLISHED状态。 并且SYN数据包不包含带有“sub.domain.com”的主机头名称。 只有具有GET请求的数据包才会包含该数据包,并且它已经与ESTABLISHED规则匹配。

解决办法是将stringDROP放在ESTABLISHED之前。

话虽如此,你的解决scheme是非常不寻常的,甚至可能会给服务器带来一些麻烦,如果这些被阻止的请求的数量很高的话。 连接build立,但客户端静静下来。 服务器将等待,直到一些超时终止的事情。 我不确定会发生什么,但要小心。

我想你出于某种原因不能改变服务器configuration来阻止那些具体的连接。 在阿帕奇这是一块蛋糕设置这种控制。

这不会做你想要的。 你可以有效地限制iptables访问主机。 在你的情况下限制访问托pipe网站的服务器的IP地址。 这仍将允许访问由该服务器托pipe的其他域。

你可以在透明代理模式下使用像squid的代理,并使用ACL来限制对允许访问的站点的访问。 使用DNAT规则将所有HTTP访问redirect到您的代理。 像这样的规则应该redirectnetworkingstream量到端口3129上的代理:

 iptables -t nat -A PREROUTING -p tcp --dport 80 ! -d 127.0.0.1 -j DNAT --to-destination $SQUID:3129 

使用squid在http协议上限制你想要的所有域,易于configuration

并为https协议使用: iptables -A FORWARD -m string --string "facebook.com" --algo bm --from 1 --to 600 -j REJECT