理解/优化 iptables 输出

理解/优化 iptables 输出

以下是 Ubuntu Linux 服务器的结果iptables-save。我的问题是,它有什么问题或不够理想吗?

例如,我相信规则是按顺序处理的,那么端口 80 和 3306(www/mysql)的规则是否应移至顶部?

另外,DROP 后面的规则有什么作用?它们看起来与上面的规则类似。

# Generated by iptables-save v1.4.1.1 on Sun Feb 13 16:11:59 2011
*filter
:INPUT DROP [1:52]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [496336:22258327]
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 69 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 69 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 110 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 143 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 123 -m state --state NEW -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 20 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -p udp -m udp --dport 3306 -m state --state NEW -j ACCEPT 
-A INPUT -j DROP 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Sun Feb 13 16:11:59 2011

答案1

我可能会将RELATED,ESTABLISHED ... ACCEPTINPUT 链上的规则移到该链的最顶端。除非您的大多数连接都极其短暂,否则我敢打赌,绝大多数传入数据包都将成为连接的一部分,并且应该被该规则接受。

为了更好地了解数据包在规则集中的位置,您可以运行以下命令:

iptables -t filter -L -n -v

并特别注意数据包和字节数。您可能会注意到,我上面提到的规则以相当大的优势夺取了最多的数据包。如果任何其他规则都匹配了大量的数据包,您可以通过将它们移到不太“受欢迎”的规则之前来优化规则集。

最后,我注意到您的 OUTPUT 链具有 ACCEPT 策略。这使得 OUTPUT 链上的 ACCEPT 规则变得多余,应该将其删除。同样,由于您的 INPUT 链策略是 DROP,因此 INPUT 链上的最终 DROP 规则是不必要的。

答案2

一般来说,安排规则以便您快速退出防火墙是一件好事。如果大多数流量都流向端口 80 和 3306,那么它们应该像您建议的那样在 INPUT 表的列表中处于较高的位置。

Iptables 适用于表。您有 3 个表,INPUT、FORWARD 和 OUTPUT。DROP 命令位于 INPUT 表中。DROP 之后的规则适用于 OUTPUT 链,因此它们将仅针对传出数据包进行处理。它们可以被删除,因为 OUTPUT 表上的策略是 ACCEPT,并且它们是 ACCEPT 规则。

答案3

  1. 为什么-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT不像其他的一样分为NEW/REL、EST呢?
  2. 很多--state NEW都是多余的,为什么每次都要让 CPU 决定是否是NEW(?)。你最好创建额外的链“INPUT.NEW”,并使用单个-A INPUT -m state --state NEW -j INPUT.NEW将数据包导入其中。
  3. 然后可以用端口比较填充 INPUT.NEW。如果使用,行数可以减少-m multiport
  4. 接受所有 ICMP 是不安全的,因为它意味着不仅仅是回显请求。只选择那些你可以允许的 ICMP(可以是少数回显请求)。请记住,合法的其他协议(例如 TCP)特定的 ICMPRELATED无论如何都会被处理。
  5. 允许 OUTPUT 仅为 是没有意义的(如果有的话)NEW,RELATED,ESTABLISHED。允许它不进行细分。

答案4

我强烈建议不要对每个协议/端口组合使用一个显式规则,而是使用ipset

制作 2 组,分别用于 TCP 和 UDP:

ipset -N Allowed_TCP_Ports portmap --from 0 --to 65535
ipset -N Allowed_UDP_Ports portmap --from 0 --to 65535

填充每个集合:

for p in $TCP_PORTS; do ipset -A Allowed_TCP_Ports; done
for p in $UDP_PORTS; do ipset -A Allowed_UDP_Ports; done

然后,您可以将与端口相关的规则简化为 2 条规则:

-A INPUT -p tcp -m set --match-set Allowed_TCP_Ports dst -j ACCEPT 
-A INPUT -p udp -m set --match-set Allowed_UDP_Ports dst -j ACCEPT 

注意:我正在删除 -m state --state NEW 比赛。我的意思是,为了什么? -m state --state RELATED,ESTABLISHED 规则,全部数据包要么是新的,要么是无效的。

注意 2:Ubuntu 的ipset软件包很乱;您必须从源代码下载并安装。我在我的博客中解释了如何操作。您可以在这里阅读:http://pepoluan.posterous.com/powertip-howto-install-ipset-on-ubuntu

相关内容