以下是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规则。
-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT不能分成NEW / REL,EST等等? --state NEW是多余的,为什么每次CPU决定它是否是NEW (?)。 你最好创build额外的链“INPUT.NEW”,并使用单个-A INPUT -m state --state NEW -j INPUT.NEW将数据包传入。 -m multiport ,则可以减less行数。 RELATED处理。 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 。