我必须在 Linux 服务器上设置防火墙(我之前的所有经验都是在 Windows 上)。我的规则非常简单 - 禁止所有端口,允许所有端口,允许特定 IP 子网的某些端口,而网络虽小但很复杂(每个主机至少在 2 个 192.168... 网络中有 IP,每个人都可以通过许多不同的方式互连)。我认为使用 iptables 包装器会使系统在逻辑上过于复杂,引入许多不必要的实体,最好保持简单并直接使用 iptables。
您能推荐一个关于如何编写 iptables 规则的好的快速介绍吗?
答案1
官方和推荐链接文档存在于 Netfilter 网站上。
这不是一个新主题,资源是无限。
大多数基本命令都相当直观,可以轻松参考手册页。
netfilter 是实现数据包过滤的内核级技术,非常先进。它还包含其他表,可以破坏数据包、转换数据包,并以其他方式影响路由。该iptables
实用程序是与 netfilter 交互的用户空间工具。如果您想了解高级功能,我建议您参考上述文档。有关基本功能的介绍,请继续阅读。
列出所有现有规则:
iptables -L -n
-n
防止 iptables 解析 ips,从而产生更快的输出。
默认表是filter
表,用于将基本防火墙规则应用于三个链。filter
表中的三个默认链分别是INPUT
、OUTPUT
和FORWARD
。
这些链基本上是不言自明的。INPUT 链影响传入的数据包,OUTPUT 链影响本地生成的数据包,最后 FORWARD 链影响通过系统路由的任何数据包。
在您可以指定的目标中,您可以指定DROP
数据包,这意味着只是忽略而不响应。您可以REJECT
指定数据包,其中将向拒绝源发送 icmp 响应。最后,您可以指定ACCEPT
它们,这允许数据包继续路由。
通常,对于面向外部的防火墙,默认选项是DROP
而不是REJECT
,因为它会减少网络在互联网上的可见足迹。例如,原本将服务限制到特定主机的 IP 在 下可见性会较低DROP
。
注意,-A
表示附加到链的末尾。如果希望插入到顶部,可以使用-I
。所有规则都从上往下处理。 -D
表示删除。
对于DROP
来自以下来源的传入数据包192.168.235.235
:
iptables -A INPUT -s 192.168.235.235 -j DROP
这将跳转到DROP
来自该 IP 的所有协议的目标。
接受:
iptables -A INPUT -s 192.168.235.235 -j ACCEPT
要阻止本地服务器或网络访问该 IP,请执行以下操作:
iptables -A OUTPUT -d 192.168.235.235 -j DROP
您可以指定-p
协议、-s
数据包的源、-d
数据包的目标、目标端口--dport
、源端口--sport
以及许多其他标志,这些标志将影响规则处理数据包的方式。
如果您的默认INPUT
策略是DROP
,并且您希望允许 192.168.123.0/24
子网中的每个人都可以访问您服务器上的 SSH,以下是示例:
iptables -A INPUT -s 192.168.123.0/24 -p tcp --dport 22 -j ACCEPT
没错,你可以使用CIDR 表示法也!
一般来说,最好的默认策略是DROP
适用于所有链。每个链都有一个默认策略,由标志指定-P
。即使您将策略设置为 default DROP
,仍然建议将链中的最后一项DROP
也设置为 a 。
例如,将DROP
INPUT、FORWARD 和 OUTPUT 链的策略更改为:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
当心,如果您在远程系统上指定 INPUT 的默认策略 DROP 而没有首先允许自己进行 SSH 访问,则可能会阻止自己访问系统。如果在远程系统上,您可以指定一个临时 crontab,每 5 分钟刷新一次所有规则作为故障保护。
删除所有规则并允许所有流量:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -X
iptables -F
注意,-X
删除所有创建的链。 -F
刷新所有规则。
有本机工具可以保存和恢复规则。特别是iptables-save
和iptables-restore
。大多数现代Linux发行版在系统提供的iptables init文件中都有save
和功能。restore
还有其他防火墙最佳实践,例如丢弃格式错误的数据包和其他类型的不良流量。这是使用前端实用程序的一个优势,例如岸墙因为它会默认实施其中许多政策。不过,我同意你的方法,也更愿意直接维护我自己的规则,而且这些相同的最佳实践可以在没有前端的情况下实施。
答案2
答案3
我发现https://help.ubuntu.com/community/IptablesHowTo最近很有用。我不认为其中有任何内容是专门针对 Ubuntu 的。