iptables 规则仅允许 HTTP 流量流向一个域

iptables 规则仅允许 HTTP 流量流向一个域

我需要将我的机器配置为仅允许往返于 serverfault.com 的 HTTP 流量。所有其他网站、服务端口均无法访问。我想出了以下 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

效果不太好:

  • 在我放下一切,继续执行规则 3 之后:

    iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j 接受

我收到此错误:

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

您认为这与 DNS 有关吗?我也应该允许它吗?还是我应该只在规则中输入 IP 地址?您认为我试图做的事情可以通过更简单的规则来实现吗?怎么做?

我将非常感激任何有关此问题的帮助或提示。非常感谢!

答案1

对于 IPTables 规则,顺序很重要。规则按顺序添加和应用。此外,手动添加规则时,它们会立即应用。因此,在您的示例中,一旦设置了默认策略,任何通过 INPUT 和 OUTPUT 链的数据包都会开始被丢弃。顺便说一句,这也是您收到错误消息的原因。发生的事情是这样的:

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

虽然源/目标选项可以接受主机名,但强烈建议不要这样做。引用手册页中的一段话:

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

Slillibri 的回答一针见血,你错过了 DNS ACCEPT 规则。在你的情况下,这无关紧要,但通常我会在流程的后面设置默认策略。你最不想做的就是远程工作并允许 SSH开启默认拒绝。

此外,根据您的发行版,您应该能够保存防火墙规则,以便它们在启动时自动应用。

了解所有这些并重新安排您的脚本后,我建议执行以下操作。

# 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

答案2

添加

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

允许 DNS 查找。

答案3

使用 Web 代理和/或过滤器可能更能满足此类要求。Dansgaurdian 可以配置为执行此操作。您需要使用 NAT 规则强制您的流量通过过滤器。

使用 iptables 进行过滤将允许来自相关 IP 地址的任何站点。这通常是整个网络的一小部分。

答案4

您需要在您的 Web 服务器上配置此功能。iptables 是一个数据包过滤器。HTTP 事务将站点名称(即 stackoverflow)作为 TCP 有效负载的一部分发送(即,不是作为 TCP 标头的一部分,iptables 可以轻松读取)。

鉴于这一点,以及 HTTP 事务几乎肯定会分布在多个数据包中(即您不能只匹配 HTTP 标头中的字符串),因此最好通过您的 Web 服务器配置或其前面的代理来处理。

了解这背后的原因很有用,还有其他一些选择:

  1. 如果他们输入了错误的 URL,则重定向到正确的 URL(例如,如果他们输入 www.stackoverflow.com,则重定向到 stackoverflow.com)
  2. 告诉你的网络服务器不要为 stackoverflow.com 以外的主机提供服务
  3. 将网站放在一个单独的 IP 上,没有其他任何 IP 可以解析,并且只让您的网络服务器监听该 IP。

相关内容