iptables 规则只允许一个域的 HTTP 流量

Zen*_*net 22 domain-name-system iptables loopback

我需要将我的机器配置为仅允许进出 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
Run Code Online (Sandbox Code Playgroud)

它不太好用:

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

    iptables -A 输出 -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.
Run Code Online (Sandbox Code Playgroud)

你认为它与DNS有关吗?我也应该允许吗?或者我应该在规则中加入 IP 地址?你认为我想要做的事情可以通过更简单的规则来实现吗?如何?

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

Sco*_*ack 33

对于 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
Run Code Online (Sandbox Code Playgroud)

  • 漂亮,精心制作的答案。 (3认同)
  • 实际上,您可以将 `iptables -P` 语句放在脚本中的任何位置,因为链策略仅在数据包“脱离”链末端时应用。我通常将策略声明(通常是“DROP”策略)放在我的 iptables 脚本的顶部。 (3认同)

sli*_*bri 7

添加

iptables -A OUPUT -p udp --dport 53 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

允许 DNS 查找。


Bil*_*hor 5

使用 Web 代理和/或过滤器可以更好地处理这种需求。Dansgaurdian 可以配置为执行此操作。您将需要使用 NAT 规则来强制您的流量通过过滤器。

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