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


20

我需要将机器配置为仅允许往返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输出-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地址放在规则中?您是否认为我可以通过更简单的规则来实现?怎么样?

我会对此有任何帮助或提示。非常感谢!


2
不要忘记sstatic.net和其他人。serverfault.com并非完全来自serverfault.com
Zoredache

您可以在另一个系统上运行代理吗?这是最好/最简单的解决方案:serverfault.com/questions/215134
mattdm 2011年

Answers:


29

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

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

尽管source / destination选项将接受主机名,但强烈建议不要这样做。要引用手册页,

在将规则提交给内核之前,主机名将仅被解析一次。请注意,指定要通过远程查询(例如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

3
漂亮,精心制作的答案。
JakeRobinson 2011年

1
我很感激,尽管您也一定错过了我的错误。哎呀。
Scott Pack

3
实际上,您可以将iptables -P语句放在脚本中的任何位置,因为仅当数据包“掉落”到链的末端时才应用链策略。我通常将策略声明(通常是DROP策略)放在iptables脚本的顶部。
日,星期一

1
@Steven:你绝对正确。OP似乎正在以交互方式键入它们。假设您通过SSH连接到主机,并且第一个规则是针对策略DROP的。在输入其他规则之前,您的SSH连接将被删除。与她遇到的问题一样,这是一个相同的时间问题,如果表现形式不同。
Scott Pack

谢谢。在尝试这个。但是没有添加就没有用sudo iptables -I OUTPUT 1 -o lo -j ACCEPT。不应该添加吗?
基兰


5

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

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


1
完全同意这一点。iptables可能是在这里使用错误的工具,因为它不能很好地处理DNS名称。具有适当过滤器设置的Web代理更适合。
史蒂文(Steven)

2

恐怕iptables在此级别上不起作用,它只关心ip地址,而不关心主机名。如果要阻止访问同一IP上的其他名称虚拟主机,则需要查看放入.htaccess文件。


问题是,当我尝试规则3而不“丢弃所有内容”时,它可以与iptables正常工作!
Zenet 2011年

2
嗯,我看错了问题。是的,在后台发生的事情是iptables将serverfault.com解析为64.34.119.12(请参阅slillibri的答案以了解解析为何不起作用)。但是,由于iptables不理解主机名,而只是允许ip,因此,如果它有多个站点,则可以连接到该ip上的任何网站。
Niall Donegan

2
@Emily,它可以正常工作,因为添加了规则,但是如果serverfault.com IP发生更改,将不允许流量。允许像google.com这样的网站拥有数百个经常更改的地址是根本行不通的。
Zoredache

1

您需要在您的网络服务器上进行配置。iptables是一个数据包过滤器。HTTP事务将站点名称(即stackoverflow)作为TCP有效负载的一部分发送(即,不作为iptables易于读取的TCP标头的一部分)发送。

鉴于此,并且几乎可以肯定的是,HTTP事务几乎肯定会分布在多个数据包中(即,您不能只匹配HTTP标头中的字符串),这可以通过Web服务器配置或前面的代理更好地处理它的。

了解这背后的原因将很有用,还有其他几种选择:

  1. 如果他们输入错误的URL,则重定向到正确的URL(例如,如果他们输入www.stackoverflow.com,则重定向到stackoverflow.com)
  2. 告诉您的网络服务器不要为stackoverflow.com以外的主机提供服务
  3. 将站点放在其他没有解决的IP上,仅让您的Web服务器监听。

嗨,菲尔,我不确定我了解什么网络服务器?我没有网络服务器。我正在计算机上进行此配置。
Zenet 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.