在上一篇文章中,我们讨论了如何使用强化最佳实践保护 Linux 服务器。有人问我防火墙部分,里面简单介绍了iptables防火墙。今天我们就来详细讨论一下Linux iptables 防火墙以及如何使用出色的防火墙来保护您的服务器流量。
CentOS 7 上的 iptables
如果你使用的是CentOS 7,你会发现firewalld管理iptables,所以如果你想回到iptables,你必须停止并屏蔽firewalld。
$ systemctl stop firewalld
$ systemctl mask firewalld
然后安装 iptables 服务并启用它:
$ yum install iptables-services
$ systemctl enable iptables
然后你就可以启动它:
$ systemctl start iptables
Linux 防火墙的工作原理
Iptables 防火墙功能构建在 Linux 内核中用于数据包过滤的 Netfilter 框架之上。
防火墙类型
有两种类型的防火墙:
无状态防火墙单独处理每个数据包,这意味着它不会看到同一连接的其他数据包。
状态防火墙这种类型的防火墙关心通过它的所有数据包,因此它知道连接的状态。它可以更好地控制流量。
网络过滤器包含tables。这些表包含chains,并且链包含个体rules.
如果数据包匹配任何规则,iptables 将应用该规则action到那个数据包。
行动可以是:accept, reject, ignore, or pass将数据包转移到其他规则以进行更多处理。
Netfilter 可以使用 IP 地址和端口号处理传入或传出流量。
iptables 命令管理和配置 Netfilter。
在开始编写防火墙命令之前,我们需要了解一下防火墙的结构,以便我们可以轻松地编写防火墙规则。
iptables 防火墙表
Netfilter有三个表可以携带处理规则。
iptables过滤表是处理流量的主表。
第二个是NAT表,它处理 NAT 规则。
第三张表是磨床用于破坏数据包。
桌链
上述表中的每个表都包含链;这些链是iptables规则的容器。
过滤表包含前进,输入, and OUTPUT 链。您可以创建自定义链来保存您的规则。
如果一个数据包是来到主人身边, iptables 将通过以下方式处理它输入链rules.
如果数据包是去另一个主机,这意味着 OUTPUT 链规则将对其进行处理。
iptables 使用正向链用于处理具有访问了主机但注定是另一位主人。
连锁政策
过滤表中的每个链都有一个策略。该策略是 iptables 采取的默认操作。
该政策可能是丢弃、拒绝, and ACCEPT.
ACCEPT 策略允许数据包通过防火墙。 DROP 策略丢弃数据包而不通知客户端。 REJECT 策略还会丢弃数据包并通知发送方。
从安全角度来看,您应该丢弃所有到达主机的数据包,并仅接受来自可信来源的数据包。
添加 iptables 规则
您可以使用 iptables 命令添加新规则,如下所示:
$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT
让我们把这个命令分成几部分,这样我们就可以理解它的一切。
-A 表示我们正在添加一条新规则。默认情况下,iptables 将所有新规则添加到过滤表除非您指定另一个表。
-i 标志指定将应用规则的设备。如果您不指定设备,iptables 会将规则应用于所有传入流量,无论设备如何。
-p 标志指定您要处理的数据包的协议,在我们的例子中是 TCP。
–dport 标志指定目标端口,即 80。
-d 指定目的IP 地址,即1.2.3.4。如果未指定目标 IP 地址,则该规则将应用于 eth1 上的所有传入流量,无论 IP 地址如何。
-j 指定操作或JUMP要做的行动。这里我们使用接受策略接受数据包。
上述规则允许端口 80 上的传入 HTTP 流量。
允许传出流量怎么样?
$ iptables -A OUTPUT -o eth1 -p tcp --sport 80 -j ACCEPT
您可以使用 -A 标志将规则添加到 OUTPUT 链。
-o 标志用于用于传出流量的设备。
-sport 标志指定源端口。
您可以使用 http 或 https 等服务名称来代替 sport 或 dport 上的数字端口号。所有服务名称都在 /etc/services 文件中。
您应该使用服务名称而不是端口号,这使得阅读规则更容易。
iptables 规则顺序
iptables 将新规则放置在链的末端。您可以使用 -I 选项将其添加到顶部。
正如您现在将看到的,规则的顺序很重要。您可以使用 I 标志将规则准确插入到您想要的位置。
查看以下规则以了解规则排序的重要性:
$ iptables -I INPUT 3 -i eth1 -p udp -j ACCEPT
$ iptables -I INPUT 4 -i eth1 -p udp --dport 80 -j DROP
第一条规则接受来自 eth1 的所有 UDP 流量,数字 3 是规则顺序。
第二条规则丢弃进入端口 80 的流量。
第一个规则将接受所有流量,然后应该丢弃流量的第二个规则将不执行任何操作,因为 iptables 在第一个规则中传递流量。
您的规则应该有意义,因为链中规则的顺序很重要。
列出 iptables 规则
您可以使用 -L 标志列出链中的规则:
$ iptables -L INPUT
您可以使用 –line-numbers 显示规则的行号:
$ iptables -L INPUT --line-numbers
该列表显示服务的名称。您可以使用 -n 选项来显示端口号:
$ iptables -L INPUT -n --line-numbers
上述规则将使列表更快,因为它可以防止 iptablesDNS解析和服务查找。
您可以像这样列出所有链的所有规则:
$ iptables -L -n --line-numbers
要获取每个规则处理的数据包数量,可以使用 -v 标志:
$ iptables -L -v
此外,您可以使用 -Z 标志将计数器重置为零。
现在我们可以向任何我们想要的链添加新规则,我们可以按特定顺序插入规则,我们可以列出任何链或所有链的规则,但是删除规则怎么样?
删除规则
您可以使用 -D 标志删除规则:
$ iptables -D INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT
此命令将删除您之前指定的 HTTP 规则。
在删除规则之前,只需列出规则规范以确保规则规范,然后将其删除。
您可以使用订单号删除规则,而不用编写规则规范。
$ iptables -D INPUT 2
您可以使用 -F 标志删除特定链中的所有规则,这意味着刷新所有规则。
$ iptables -F INPUT
如果您在使用 -F 标志时忘记提及链名称,则所有链规则将被删除。
替换规则
您可以使用 -R 标志将现有规则替换为您自己的规则:
$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT
此命令将用键入的规则替换 INPUT 链中的第一个规则。
列表具体表
要列出特定表,请使用 -t 标志和表名,如下所示:
$ iptables -L -t nat
这里我们列出nat表中的规则。
iptables 用户定义链
要创建用户定义的链,请使用 -N 标志。
$ iptables -N MY_CHAIN
另外,您可以使用 -E 标志重命名它。
$ iptables -E MY_CHAIN NEW_NAME
您可以使用 -X 标志删除用户定义的链。
$ iptables -X MY_CHAIN
如果使用 -X 标志时不提及链名称,它将删除所有用户定义的链。您无法删除 INPUT 和 OUTPUT 等内置链。
重定向到用户定义的链
您可以使用 -j 标志将数据包重定向到用户定义的链,例如内置链。
$ iptables -A INPUT -p icmp -j MY_CHAIN
上述规则会将所有 ICMP 流量重定向到链 MY_CHAIN。
设置链的默认策略
您可以使用 -P 标志来设置特定链的默认策略。默认策略可以是接受、拒绝和丢弃。
$ iptables -P INPUT DROP
因此,现在,输入链将丢弃任何传入的数据包,除非您编写规则允许任何传入流量。
同步洪泛
攻击者仅在未完成 TCP 握手的情况下发送 SYN 数据包,因此接收主机将有许多打开的连接,并且您的服务器变得太忙而无法响应其他客户端。
我们可以使用iptables防火墙的限制模块来保护我们免受SYN洪水攻击。
$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT
这里我们只指定每秒 10 个 SYN 数据包。您可以根据您的网络需求调整该值。
如果这会限制您的网络,您可以使用 SYN cookies。
同步 Cookie
In
/etc/sysctl.conf
文件并添加这一行:
net.ipv4.tcp_syncookies = 1
然后保存并重新加载。
$ sysctl -p
丢弃无效状态数据包
INVALID 状态数据包是不属于任何连接的数据包,您将丢弃它们。
$ iptables -A INPUT -m state --state INVALID -j DROP
此规则将丢弃所有传入的无效状态数据包。
丢弃碎片数据包
碎片数据包是大的畸形数据包的碎片,您应该编写规则来丢弃它们。
-f 标志告诉 iptables 防火墙选择所有片段。因此,如果您不使用 iptables 作为路由器,则可以丢弃碎片数据包。
$ iptables -A INPUT -f -j DROP
保存 iptables 规则
如果重新启动服务器,您将丢失您编写的所有规则,那么如何保留它们呢?
如果您使用的是 CentOS 或 Red Hat,则可以使用 iptables-save 命令保存所有规则。
iptables-save > /etc/sysconfig/iptables
在 CentOS 7 上,您可以像这样保存规则:
$ service iptables save
您可以仅保存特定的表,例如过滤表:
$ iptables-save -t filter
另外,您可以使用 iptables-restore 来恢复规则。
在基于 Debian 的发行版上,您可以使用 iptables-persistent 包来保存和恢复规则。
首先,安装它:
$ apt-get install iptables-persistent
然后您可以保存和恢复规则:
$ netfilter-persistent save
$ netfilter-persistent reload
我希望您发现 iptables 防火墙很简单。继续回来。
谢谢。