iptables规则只允许HTTPstream量到一个域

我需要configuration我的机器只允许来自serverfault.com的HTTPstream量。 所有其他网站,服务端口都不可访问。 我想出了这些iptables规则:

#drop everything iptables -P INPUT DROP iptables -P OUTPUT DROP #Now, allow connection to website serverfault.com on port 80 iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT #allow loopback iptables -I INPUT 1 -i lo -j ACCEPT 

这不太合适:

我得到这个错误:

 iptables v1.4.4: host/network `serverfault.com' not found Try `iptables -h' or 'iptables --help' for more information. 

你认为它与DNS有关吗? 我应该允许吗? 或者,我应该只是在规则中的IP地址? 你认为我想要做什么可以用更简单的规则来实现吗? 怎么样?

我将不胜感激任何帮助或提示。 非常感谢!

使用IPTables规则,订单很重要。 规则将按顺序添加并应用。 而且,手动添加规则时会立即生效。 因此,在您的示例中,只要设置默认策略,任何通过INPUT和OUTPUT链的数据包就会开始丢弃。 顺便说一句,这也是为什么你收到了你所做的错误信息。 发生了什么事情是这样的:

  1. 应用默认的DROP策略
  2. IPTables接收主机名作为目的地
  3. IPTables尝试在“serverfault.com”上进行DNS查找
  4. DNS查找被DROP操作阻止

虽然源/目标选项将接受主机名,但强烈不鼓励。 引用手册页,

在将规则提交给内核之前,主机名将只被parsing一次。 请注意,使用远程查询(如DNS)指定要parsing的任何名称是一个非常糟糕的主意。

Slillibri砸在他的答案的头上,你错过了DNS接受规则。 在你的情况下,这并不重要,但通常我会在后面的过程中设置默认策略。 你想要的最后一件事是远程工作,并打开默认拒绝允许SSH。

此外,根据您的分发,您应该能够保存防火墙规则,以便在开始时自动应用这些规则。

知道这一切,并重新安排您的脚本,这是我会build议。

 # Allow loopback iptables -I INPUT 1 -i lo -j ACCEPT # Allow DNS iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # Now, allow connection to website serverfault.com on port 80 iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Drop everything iptables -P INPUT DROP iptables -P OUTPUT DROP 

 iptables -A OUPUT -p udp --dport 53 -j ACCEPT 

允许DNS查找。

使用网页代理和/或filter可以更好地处理这种需求。 丹佛店可以configuration这样做。 您将需要使用NAT规则来强制您的stream量通过filter。

使用iptables过滤将允许从相关的IP地址提供任何网站。 这通常是整个networking的一小部分。

我担心iptables不能在这个级别工作,它只关心ip地址,而不是主机名。 如果你想阻止访问同一个IP上的其他名称虚拟主机,你需要看看.htaccess文件。

您需要在您的networking服务器上进行configuration。 iptables是一个包filter。 HTTP事务发送站点名称(即stackoverflow)作为TCP有效载荷的一部分(即不作为TCP标头的一部分,这是iptables很容易读取的)。

鉴于此,事实上HTTP事务几乎肯定会分散在多个数据包中(即,您不能只匹配HTTP标头中的string),这可以通过Web服务器configuration或代理服务器处理得更好的。

了解背后的推理是有用的,还有其他一些select:

  1. redirect到正确的URL,如果他们input错误的URL(例如,如果他们inputwww.stackoverflow.comredirect到stackoverflow.com)
  2. 告诉您的networking服务器不要为除stackoverflow.com以外的其他主机提供服务
  3. 把网站放在一个单独的IP上,没有别的办法解决,只让你的networking服务器来听。