了解/优化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 

我可能会将INPUT链上的RELATED,ESTABLISHED ... ACCEPT规则移到该链的最顶端。 除非你的大部分连接都是非常短暂的,我敢打赌绝大多数的数据包将成为连接的一部分,应该被这个规则所接受。

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

 iptables -t filter -L -n -v 

并特别注意数据包和字节数。 你可能会注意到,我上面提到的规则已经占用了大部分的数据包。 如果任何其他规则匹配了大量的数据包,则可以通过在较less的“stream行”规则之前移动它们来优化规则集。

最后,我注意到你的OUTPUT链有接受策略。 这使得OUTPUT链上的ACCEPT规则变得冗余,应该删除它们。 同样,由于您的INPUT链策略是DROP,所以INPUT链上的最终DROP规则是不必要的。

一般来说,安排规则,让你快速退出防火墙是一件好事。 如果大部分stream量都是端口80和3306,那么他们应该build议在INPUT表的列表中更高一些。

Iptables在桌子上工作。 你有3,INPUT,FORWARD和OUTPUT。 DROP命令在INPUT表中。 DROP之后的规则是针对OUTPUT链的,因此它们将仅针对传出数据包进行处理。 它们可以被删除,因为OUTPUT表上的策略是ACCEPT,它们是ACCEPT规则。

  1. 为什么-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT不能分成NEW / REL,EST等等?
  2. 许多--state NEW是多余的,为什么每次CPU决定它是否是NEW (?)。 你最好创build额外的链“INPUT.NEW”,并使用单个-A INPUT -m state --state NEW -j INPUT.NEW将数据包传入。
  3. INPUT.NEW然后可以填充端口比较。 如果您使用-m multiport ,则可以减less行数。
  4. 接受所有的ICMP是不安全的,因为它不仅意味着回声请求。 只select你可以允许的那些ICMP(这可以仅仅作为echo-r​​equests的一部分)。 请记住,合法的其他protos(例如TCP)特定的ICMP将被RELATED处理。
  5. 没有什么意义(如果有的话)允许OUTPUT只有NEW,RELATED,ESTABLISHED 。 允许它不分割。

看起来不错。 我将放弃端口20的接受,因为它应该作为一个相关的数据包处理到FTP连接。 我通常把端口123作为第一个检查,以最大限度地减lessNTP的延迟。

对于OUTPUT链,只有DROP或REJECT规则才有意义。 现有的输出规则不会执行任何操作,只能重复该策略。

你可能想看看你的柜台,并相应地调整规则的顺序。

考虑在每个接口上使用不同的链接进行新的连接。

考虑logging未被接受的数据包。

使用像Shorewall这样的工具来构build防火墙可能会让所有事情都变得更容易。

我没有使用每个协议/端口组合的显式规则,而是强烈build议使用ipset

为TCP和UDP制作2组,每组1个:

 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 

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

 -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包是bollixed; 您必须从源代码下载并安装。 我已经解释了如何在我的博客。 你可以在这里阅读: http : //pepoluan.posterous.com/powertip-howto-install-ipset-on-ubuntu 。