删除规则

我们可以使用 -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 标志时忘记提及链名称,则所有链规则都将被删除。

链策略

过滤表中的每个链都有一个策略。
该策略是 iptables 采取的默认操作。

策略可以是 DROP、REJECT 和 ACCEPT。

ACCEPT 策略允许数据包通过防火墙。
DROP 策略在不通知客户端的情况下丢弃数据包。
REJECT 策略也会丢弃数据包并通知发送方。

从安全角度来看,我们应该丢弃所有到达主机的数据包,只接受来自可信来源的数据包。

替换规则

我们可以使用 -R 标志用我们自己的规则替换(replace)现有规则:

$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT

此命令将用输入的规则替换 INPUT 链中的第一条规则。

丢弃 INVALID 状态数据包

INVALID 状态数据包是不属于任何连接的数据包,我们将丢弃它们。

$ iptables -A INPUT -m state --state INVALID -j DROP

此规则将丢弃所有传入的无效状态数据包。

列出 iptables 规则

我们可以使用 -L 标志列出链中的规则:

$ iptables -L INPUT

我们可以使用 -line-numbers 显示规则的行号:

$ iptables -L INPUT --line-numbers

该列表显示服务的名称。
我们可以使用 -n 选项显示端口号:

$ iptables -L INPUT -n --line-numbers

上述规则将使列表更快,因为它阻止了 iptables 进行 DNS 解析和服务查找。

我们可以像这样列出所有链的所有规则:

$ iptables -L -n --line-numbers

要获取每个规则处理的数据包数量,我们可以使用 -v 标志:

$ iptables -L -v

此外,我们可以使用 -Z 标志将计数器重置为零。

现在我们可以向我们想要的任何链添加新规则,我们可以按特定顺序插入规则,我们可以列出任何链或者所有链的规则,但是删除规则呢?

设置链的默认策略

我们可以使用 -P 标志为特定链设置默认策略。
默认策略可以是 ACCEPT、REJECT 和 DROP。

$ iptables -P INPUT DROP

所以现在,输入链将丢弃任何数据包,除非我们编写规则以允许任何传入流量。

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 框架上。

防火墙类型

有两种类型的防火墙:

无状态防火墙自己处理每个数据包,这意味着它看不到同一连接的其他数据包。

状态防火墙这种类型的防火墙关心通过它的所有数据包,因此它知道连接的状态。
它可以更好地控制流量。

Netfilter 包含表。
这些表包含链,链包含单独的规则。

如果数据包匹配任何规则,iptables 会将规则操作应用于该数据包。

操作可以是:接受、拒绝、忽略或者将数据包传递给其他规则以进行更多处理。

Netfilter 可以使用 IP 地址和端口号处理传入或者传出流量。

iptables 命令管理和配置 Netfilter。

在开始编写防火墙命令之前,我们需要稍微了解一下防火墙结构,以便我们可以轻松编写防火墙规则。

列出特定表

要列出特定表,请使用带有表名的 -t 标志,如下所示:

$ iptables -L -t nat

这里我们列出了 nat 表中的规则。

添加iptables规则

我们可以使用 iptables 命令添加新规则,如下所示:

$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT

让我们把这个命令分成几部分,这样我们就可以了解它的一切。

-A 表示我们正在添加(Add)新规则。
默认情况下,除非我们指定另一个表,否则 iptables 会将所有新规则添加到过滤器表中。

-i 标志指定将应用规则的设备。
如果你没有指定设备,iptables 将把规则应用到所有传入的流量,而不管设备是什么。

-p 标志指定要处理的数据包协议,在我们的例子中是 TCP。

-dport 标志指定目标端口,即 80。

-d 指定目标 IP 地址,即 1.2.3.4.
如果未指定目标 IP 地址,则无论 IP 地址如何,该规则都将应用于 eth1 上的所有传入流量。

-j 指定要执行的操作或者 JUMP 操作。
在这里,我们使用接受策略接受数据包。

上述规则允许传入的 HTTP 流量在端口 80 上。

允许传出流量怎么样?

$ iptables -A OUTPUT -o eth1 -p tcp --sport 80 -j ACCEPT

我们可以使用 -A 标志向 OUTPUT 链添加规则。

-o 标志用于用于传出流量的设备。

-sport 标志指定源端口。

我们可以使用诸如 http 或者 https 之类的服务名称,而不是 Sport 或者 dport 上的数字端口号。
所有服务名称都在 /etc/services 文件中。

我们应该使用服务名称而不是端口号,这样可以更轻松地阅读规则。

丢弃碎片包

零碎的数据包是大的畸形数据包的碎片,我们应该编写规则来丢弃它们。

-f 标志告诉 iptables 防火墙选择所有片段。
因此,如果我们不使用 iptables 作为路由器,则可以丢弃碎片数据包。

$ iptables -A INPUT -f -j DROP

重定向到用户定义的链

我们可以使用 -j 标志将数据包重定向到用户定义的链,如内置链。

$ iptables -A INPUT -p icmp -j MY_CHAIN

上述规则会将所有 ICMP 流量重定向到链 MY_CHAIN。

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 防火墙表

Netfilter 有三个表,可以携带规则进行处理。

iptables 过滤表是处理流量的主要表。

第二个是 nat 表,它处理 NAT 规则。

第三个表是用于重整数据包的重整表。

iptables 用户定义链

要创建用户定义的链,请使用 -N 标志。

$ iptables -N MY_CHAIN

此外,我们可以使用 -E 标志重命名它。

$ iptables -E MY_CHAIN NEW_NAME

我们可以使用 -X 标志删除用户定义的链。

$ iptables -X MY_CHAIN

如果在使用 -X 标志时不提及链名称,它将删除所有用户定义的链。
我们不能删除像 INPUT 和 OUTPUT 这样的内置链。

SYN Flooding

攻击者只发送 SYN 数据包,而没有完成 TCP 握手,因此,接收主机将有许多打开的连接,并且服务器变得太忙而无法响应其他客户端。

我们可以使用 iptables 防火墙的限制模块来保护我们免受 SYN 泛洪。

$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT

这里我们只指定每秒 10 个 SYN 数据包。
我们可以根据网络需要调整此值。

如果这会限制网络,我们可以使用 SYN cookie。

SYN Cookies

/etc/sysctl.conf

文件并添加这一行:

net.ipv4.tcp_syncookies = 1

然后保存并重新加载。

$ sysctl -p

保存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 规则的容器。

过滤器表包含 FORWARD、INPUT 和 OUTPUT 链。
我们可以创建一个自定义链来保存规则。

如果数据包到达主机,iptables 将通过 INPUT 链规则处理它。

如果数据包要去另一个主机,这意味着 OUTPUT 链规则将处理它。

iptables 使用 FORWARD 链来处理已访问主机但目的地为另一台主机的数据包。

日期:2020-07-15 11:16:32 来源:oir作者:oir