网站搜索

每个 Linux 管理员都应该知道的 25 条有用的 IPtable 防火墙规则


管理网络流量是系统管理员必须处理的最艰巨的工作之一。他必须配置防火墙,使其能够满足系统和用户对传入和传出连接的要求,而不会使系统容易受到攻击。

这就是 iptables 派上用场的地方。 Iptables 是一个 Linux 命令行防火墙,允许系统管理员通过一组可配置的表规则来管理传入和传出流量。

Iptables 使用一组表,这些表的链包含一组内置或用户定义的规则。感谢它们,系统管理员可以正确过滤其系统的网络流量。

根据 iptables 手册,目前有 3 种类型的表:

    1. FILTER – 这是默认表,其中包含以下内置链:

      1. INPUT – 发往本地套接字的包
      2. FORWARD – 通过系统路由的数据包
      3. OUTPUT – 本地生成的数据包
    2. NAT – 当数据包尝试创建新连接时参考的表。它具有以下内置功能:

      1. PREROUTING – 用于在收到数据包后立即更改数据包
      2. OUTPUT – 用于更改本地生成的数据包
      3. POSTROUTING – 用于在数据包即将发出时更改数据包
    3. MANGLE – 该表用于数据包更改。在内核版本 2.4 之前,该表只有两个链,但现在是 5 个:

      1. PREROUTING – 用于更改传入连接
      2. 输出 – 用于更改本地生成的数据包
      3. INPUT – 用于传入数据包
      4. POSTROUTING – 用于在数据包即将发出时更改数据包
      5. FORWARD – 用于通过盒子路由的数据包

在本文中,您将看到一些有用的命令,它们将帮助您通过 iptables 管理 Linux 防火墙。出于本文的目的,我将从更简单的命令开始,直到最后更复杂的命令。

1.启动/停止/重启Iptables防火墙

首先,您应该了解如何在不同的 Linux 发行版中管理 iptables 服务。这相当简单:

基于 SystemD 的 Linux 发行版

------------ On Cent/RHEL 7 and Fedora 22+ ------------
systemctl start iptables
systemctl stop iptables
systemctl restart iptables

基于 SysVinit 的 Linux 发行版

------------ On Cent/RHEL 6/5 and Fedora ------------
/etc/init.d/iptables start 
/etc/init.d/iptables stop
/etc/init.d/iptables restart

2.检查所有IPtables防火墙规则

如果您想检查现有规则,请使用以下命令:

iptables -L -n -v

这应该返回类似于以下内容的输出:

Chain INPUT (policy ACCEPT 1129K packets, 415M bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT all -- * lxcbr0 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT all -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 354K packets, 185M bytes)
 pkts bytes target prot opt in out source destination

如果您想检查特定表的规则,可以使用 -t 选项,后跟要检查的表。例如,要检查 NAT 表中的规则,您可以使用:

iptables -t nat -L -v -n

3. 在 IPtables 防火墙中阻止特定 IP 地址

如果您发现某个 IP 地址存在异常或滥用行为,您可以使用以下规则阻止该 IP 地址:

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

其中"xxx.xxx.xxx.xxx"需要修改为实际IP地址。运行此命令时要非常小心,因为您可能会意外阻止自己的 IP 地址。 -A 选项将规则附加到所选链的末尾。

如果您只想阻止来自该 IP 地址的 TCP 流量,则可以使用指定协议的 -p 选项。这样命令将如下所示:

iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP

4. 在 IPtables 防火墙中解锁 IP 地址

如果您决定不再阻止来自特定 IP 地址的请求,可以使用以下命令删除阻止规则:

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP

-D 选项从所选链中删除一个或多个规则。如果您喜欢使用较长的选项,可以使用 --delete

5. 阻止 IPtables 防火墙上的特定端口

有时您可能想要阻止特定端口上的传入或传出连接。这是一项很好的安全措施,您在设置防火墙时应该认真考虑这一问题。

要阻止特定端口上的传出连接,请使用:

iptables -A OUTPUT -p tcp --dport xxx -j DROP

要允许传入连接,请使用:

iptables -A INPUT -p tcp --dport xxx -j ACCEPT

在这两个示例中,将 "xxx" 更改为您希望允许的实际端口。如果您想阻止 UDP 流量而不是 TCP,只需将 "tcp" 更改为 "udp"以上 iptables 规则。

6. 使用多端口允许 IPtable 上的多个端口

您可以使用多端口同时允许多个端口,您可以在下面找到针对传入和传出连接的此类规则:

iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT

7. 允许 IPtables 上特定端口上的特定网络范围

您可能希望将特定端口上的某些连接限制到给定网络。假设您希望允许端口 22 上的传出连接到网络 192.168.100.0/24

您可以使用以下命令来完成此操作:

iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT

8. 在 IPtables 防火墙上阻止 Facebook

一些雇主喜欢阻止其员工访问 Facebook。以下是如何阻止 Facebook 流量的示例。

注意:如果您是系统管理员并且需要应用这些规则,请记住您的同事可能会停止与您交谈:)

首先找到Facebook使用的IP地址:

host facebook.com 
facebook.com has address 66.220.156.68
whois 66.220.156.68 | grep CIDR
CIDR: 66.220.144.0/20

然后,您可以通过以下方式阻止该 Facebook 网络:

iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP

请记住,Facebook 使用的 IP 地址范围可能因您所在的国家/地区而异。

9. 在 IPtables 中设置端口转发

有时您可能希望将一项服务的流量转发到另一个端口。您可以使用以下命令来实现此目的:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525

上述命令将网络接口 eth0 上的所有传入流量从端口 25 转发到端口 2525。您可以将端口更改为您需要的端口。

10. 使用 IPtables 阻止 Apache 端口上的网络洪水

有时,IP 地址可能会向您网站上的 Web 端口请求过多的连接。这可能会导致许多问题,为了防止此类问题,您可以使用以下规则:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

上述命令将传入连接数从每分钟限制为 100 并将限制突发设置为 200。您可以根据自己的具体要求编辑限制和限制突发。

11. 阻止 IPtables 上传入的 Ping 请求

出于安全考虑,一些系统管理员喜欢阻止传入的 ping 请求。虽然威胁不是那么大,但了解如何阻止此类请求还是有好处的:

iptables -A INPUT -p icmp -i eth0 -j DROP

12.允许环回访问

环回访问(从127.0.0.1访问)很重要,您应该始终将其保持活动状态:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

13. 在 IPtables 上保留丢弃的网络数据包的日志

如果要记录网络接口 eth0 上丢弃的数据包,可以使用以下命令:

iptables -A INPUT -i eth0 -j LOG --log-prefix "IPtables dropped packets:"

您可以根据自己的选择更改 "--log-prefix" 之后的值。消息记录在 /var/log/messages 中,您可以使用以下命令搜索它们:

grep "IPtables dropped packets:" /var/log/messages

14. 阻止访问 IPtables 上的特定 MAC 地址

您可以使用以下方法阻止从特定 MAC 地址访问您的系统:

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

当然,您需要将 "00:00:00:00:00:00" 更改为您想要阻止的实际 MAC 地址。

15.限制每个IP地址的并发连接数

如果您不想在给定端口上从单个 IP 地址建立太多并发连接,可以使用以下命令:

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

上述命令允许每个客户端不超过 3 个连接。当然,您可以更改端口号以匹配不同的服务。此外,应更改 --connlimit-above 以满足您的要求。

16. 在 IPtables 规则内搜索

定义 iptables 规则后,您可能需要不时进行搜索,并且可能需要更改它们。在规则中搜索的一种简单方法是使用:

iptables -L $table -v -n | grep $string

在上面的示例中,您需要将 $table 更改为您希望在其中搜索的实际表,并将 $string 更改为您要查找的实际字符串。

这是一个例子:

iptables -L INPUT -v -n | grep 192.168.0.100

17.定义新的IPTables链

使用 iptables,您可以定义自己的链并在其中存储自定义规则。要定义链,请使用:

iptables -N custom-filter

现在您可以检查新的过滤器是否存在:

iptables -L
样本输出
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain custom-filter (0 references)
target prot opt source destination

18. 刷新 IPtables 防火墙链或规则

如果您想刷新防火墙链,您可以使用:

iptables -F

您可以使用以下命令从特定表中刷新链:

iptables -t nat -F

您可以将 "nat" 更改为您想要刷新的链的实际表。

19. 将 IPtables 规则保存到文件

如果您想保存防火墙规则,可以使用 iptables-save 命令。您可以使用以下命令将规则保存并存储在文件中:

iptables-save > ~/iptables.rules

将文件存储在哪里以及如何命名它取决于您。

20.从文件恢复IPtables规则

如果您想恢复 iptables 规则列表,可以使用 iptables-restore。该命令如下所示:

iptables-restore < ~/iptables.rules

当然,您的规则文件的路径可能不同。

21. 设置 PCI 合规性的 IPtables 规则

某些系统管理员可能需要将其服务器配置为符合 PCI 标准。不同的 PCI 合规性供应商有很多要求,但共同的要求很少。

在许多情况下,您需要拥有多个 IP 地址。您需要对站点的 IP 地址应用以下规则。使用以下规则时要格外小心,并且仅在确定自己在做什么时才使用它们:

iptables -I INPUT -d SITE -p tcp -m multiport --dports 21,25,110,143,465,587,993,995 -j DROP

如果您使用 cPanel 或类似的控制面板,您可能还需要阻止其端口。这是一个例子:

iptables -I in_sg -d DEDI_IP -p tcp -m multiport --dports  2082,2083,2095,2096,2525,2086,2087 -j DROP

注意:为了确保您满足 PCI 供应商的要求,请仔细检查他们的报告并应用所需的规则。在某些情况下,您可能还需要阻止某些端口上的 UDP 流量。

22.允许已建立的相关连接

由于网络流量的传入和传出是分开的,因此您将希望允许已建立的相关传入流量。对于传入连接,请执行以下操作:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

对于外出使用:

iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

23. 删除IPtables中的无效数据包

某些网络数据包可能被标记为无效。有些人可能更喜欢记录这些包,但其他人更喜欢丢弃它们。要丢弃无效数据包,您可以使用:

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 

24. 阻止网络接口上的连接

有些系统可能有多个网络接口。您可以限制对该网络接口的访问或阻止来自特定 IP 地址的连接。

例如:

iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP

“xxx.xxx.xxx.xxx”更改为您要阻止的实际IP地址(或网络)。

25. 禁用通过 IPTables 发送邮件

如果您的系统不应发送任何电子邮件,您可以阻止 SMTP 端口上的传出端口。例如你可以使用这个:

iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT

结论

Iptables 是一款功能强大的防火墙,您可以轻松受益。对于每个系统管理员来说,至少学习 iptables 的基础知识至关重要。如果您想找到有关 iptables 及其选项的更多详细信息,强烈建议您阅读它的手册:

man iptables

如果您认为我们应该向此列表添加更多命令,请通过在下面的评论部分提交来与我们分享。