简介
Iptables 是一个用户空间的实用程序,用于管理 Linux 内核上的防火墙规则。它是一个强大的安全工具,通过阻止不需要的网络流量、允许预期的流量、将数据包重定向到其他 TCP/UDP 端口以及防御 DDoS 攻击等方式来保护你的系统安全。
本教程的目标是手把手教你如何在 Linux 服务器上安装和配置 Iptables 防火墙。
准备工作
服务器准备
必要前提:
- 一个充满求知欲的大脑。
- 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。
我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。
注册链接: https://rainyun.ivwv.site
创建雨云服务器
以下步骤仅供参考,请根据实际需求选择配置。
- 点击 云产品 → 云服务器 → 立即购买。
- 选择距离你较近的区域,以保证低延迟。
- 按照自己需求选择配置,选择Ubuntu 22.04 版本,按照自己需求是否预装Docker。
- 最后按照提示进行购买。
- 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
- 我们使用
PowerShell
进行SSH
远程连接到服务器,Win+R
打开运行窗口,输入powershell
后点击确定。
- 输入
ssh root@你的服务器IP
例如ssh root@154.9.227.239
回车后,首次需要输入yes
,再次回车后即可登录服务器。
- 到此为止,我们的云服务器就远程连接上了。
安装和配置步骤
Iptables for Ubuntu / Debian
如果你正在运行 Ubuntu/Debian 服务器,请运行以下命令来安装 Iptables:
sudo apt update
sudo apt install iptables
安装完成后,你可以使用以下命令确认 Iptables 是否已安装:
iptables --version
或者
iptables -V
注意:
由于 Ubuntu 22.04 中 nf_table
已经取代 iptables
作为默认的防火墙后端系统。
当定义和部署防火墙规则时,Nftables 在灵活性和性能方面提供了许多好处,特别是对于同时使用 IPv4 和 Ipv6 的系统。传统的 Iptables 实用程序现在配置 nftables 内核后端,而新的 nft 用户空间工具允许创建更多当前 Iptables 不支持的灵活规则。
Iptables For RHEL / CentOS Stream / Fedora Rocky / AlmaLinux
如果你正在运行现代 RHEL 系统或 Red Hat 衍生系统,请按照以下步骤操作。
首先,更新软件包:
sudo dnf update
接下来,使用以下命令安装 iptables:
sudo dnf install iptables-services
成功安装后,验证 iptables 是否已安装:
rpm -qa | grep -i iptables-services
然后启动并启用 Iptables,以便在重新启动时启动:
sudo systemctl start iptables
sudo systemctl enable iptables
最后,确认 iptables 正在运行:
sudo systemctl status iptables
探索 Iptables 链规则
从高层次来看,Iptables 由多个表组成,这些表包含多个链。
链是一组内置或用户定义的规则。
规则包含标准和一个目标,这些标准和目标决定如何处理传入和传出的数据包。
如果匹配了标准,则会根据目标上指定的值执行操作。如果没有匹配,则会移动到下一个规则。
简而言之,Iptables 采用以下结构:
Iptables → 表 → 链 → 规则。
Iptables 提供以下显著的内置表。
FILTER 表
这是默认表,提供以下内置链:
INPUT - 适用于进入本地服务器的数据包。
OUTPUT - 适用于出站数据包。这些是本地生成的数据包,正从服务器发出。
FORWARD - 这是用于路由到服务器上的另一个 NIC(网络接口卡)的数据包的规则。它适用于通过服务器路由的数据包。
NAT 表
这是一个用于旨在启动与系统的新连接的数据包的表。
PREROUTING – 一旦数据包访问系统,就会更改入站数据包。
POSTROUTNG - 路由后更改数据包。在这种情况下,当数据包出站时会发生数据包转换。
OUTPUT - 这是一个用于更改本地生成的数据包的链。
MANGLE 表
这是一个用于专门的数据包更改的表。它包含以下五个链:
INPUT - 更改以主机为目标的传入网络数据包。
OUTPUT - 更改本地生成的网络数据包,然后将其从主机发送出去。
FORWARD — 更改通过主机路由的网络数据包。
PREROUTING — 更改传入的网络数据包,然后将其路由。
POSTROUTING — 更改数据包,然后再将其从系统发送出去。
Iptables 目标值
当数据包与规则匹配时,它会被分配以下目标值之一:
ACCEPT: 允许数据包进入系统。
DROP: 阻止数据包进入系统。
RETURN: 阻止数据包通过链,而是指示其返回到先前的链。
现在让我们重点介绍一些用于管理防火墙规则的有用且广泛使用的 iptables 命令。
列出 Iptables 防火墙规则
要列出所有可用的防火墙规则,请运行以下命令:
sudo iptables -L -n -v
执行命令后,你将获得类似于下面的输出。值得注意的是,由于你从头开始,因此你不会在终端上看到任何用户定义的规则。
让我们看一下命令选项:
L
或-list
:列出所有链中的所有防火墙规则。n
或-numeric
:显示地址和端口的数字输出。v
或-verbose
:打印详细输出。
要查看特定表的规则,请传递 -t
选项,后跟表的名称。例如,要检查 NAT
表中定义的规则,请运行以下命令:
sudo iptables -L -v -n -t nat
要检查 filter
表中定义的规则,请执行以下命令:
sudo iptables -L -v -n -t filter
对于 mangle
表,运行:
sudo iptables -L -v -n -t mangle
如何定义 Iptables 规则链
创建 Iptables 规则只是意味着将新规则附加到链中。为此,你需要像这样在 iptables 命令之后传递 -A
标志(Append
):
sudo iptables -A <chain> -i <interface> -p <protocol (tcp/udp)> -s <source> --dport <port no.> -j <target>
A (append)
标志指示 iptables 你正在向链添加新规则。以下是一些与追加选项一起使用的选项:p (protocol)
- 此选项指定将进行筛选过程的网络协议。示例包括 TCP 和 UDP 等。i (interface)
指的是将发生数据包过滤的物理网络接口。例如,eth0、enp0s3、ens33 等。s (source)
- 这是流量来自的 IP 地址或 FQDN(完全限定域名)。-dport (--destination-port )
- 这代表目标端口。它匹配连接的目标端口。j (target)
- 这是规则的目标。它指定如果数据包匹配规则将采取的操作。目标可以是内置目标(例如 ACCEPT、DROP、RETURN)或用户定义的链,它确定如何处理数据包。
如果未使用带有 iptables
命令的 -t
标志,则它将使用默认的 filter
表类型。
在 Iptables 上阻止 IP 地址
如果你检测到来自 IP 地址的不寻常或可疑行为,你可以使用以下命令阻止它,其中 xxx.xxx.xxx.xxx
是远程主机的 IP 地址。
sudo iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
此外,你可以使用 -p
选项指定协议,例如 TCP。
例如,要阻止来自 IP 173.82.232.55
的 TCP 流量,请运行以下命令:
sudo iptables -A INPUT -p tcp -s 173.82.232.55 -j DROP
在 Iptables 上取消阻止 IP 地址
要取消阻止来自 IP 地址的流量,请传递 -D
或 --delete
选项,如下所示。如果你在阻止来自远程主机的流量时指定了协议,请记住在命令中再次指定它。
sudo iptables -D INPUT -p tcp -s 173.82.232.55 -j DROP
在 Iptables 上打开端口
要在 Iptables 中允许或打开单个端口,请运行以下命令,其中 xxxx
是端口号。
sudo iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
例如,要允许默认的 MySQL 端口 3306,请运行以下命令:
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
要确认规则已应用,请按如下所示列出 Iptables 规则。
sudo iptables -L
要在一个命令中打开多个端口,请按如下所示列出以逗号分隔的端口。
sudo iptables -A INPUT -p tcp -m multiport --dports 22,80,443,3389 -j ACCEPT
在 Iptables 中允许特定端口上的网络子网
有时,你可能希望允许特定端口上的某些连接到特定的网络子网。假设你希望将传入的 SSH 连接限制为仅限于 192.168.40.0/24
子网。
你可以使用以下命令实现此目的:
sudo iptables -A INPUT -p tcp -d 192.168.40.0/24 --dport 22 -j ACCEPT
要允许与同一网络范围的出站 SSH 连接,请运行以下命令:
sudo iptables -A OUTPUT -p tcp -d 192.168.40.0/24 --dport 22 -j ACCEPT
在 Iptables 上阻止端口
要阻止或丢弃来自特定端口的传入数据包,请使用以下语法,其中 xxxx
是端口号。
sudo iptables -A INPUT -p tcp --dport xxxx -j DROP
例如,要阻止端口 80 上的传入 Web 流量,请运行以下命令:
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
要在特定网络接口上阻止端口,请传递 -i
标志,如下面的语法所示。
sudo iptables -A INPUT -i interface-name -p tcp --dport xxxx -j DROP
在以下示例中,端口 80 上的传入 Web 流量在 ens33
网络接口上被阻止。
sudo iptables -A INPUT -i ens33 -p tcp --dport 80 -j DROP
要阻止出站端口,请将 INPUT
选项替换为 OUTPUT
参数,如下面的语法所示。
sudo iptables -A OUTPUT -p tcp --dport xxxx -j DROP
例如,要阻止 FTP 端口 21 上的出站流量,请运行以下命令:
sudo iptables -A OUTPUT -p tcp --dport 21 -j DROP
要仅阻止特定 IP 地址(例如 172.16.10.10
)的端口,请运行以下命令:
sudo iptables -A OUTPUT -p tcp -d 172.16.10.10 --dport 25 -j DROP
在 Iptables 上阻止传入 Ping 请求
出于安全原因,你可能希望阻止来自僵尸网络、黑客或可能对你的系统进行一些侦察以确定你的系统是否可访问的恶意个人的传入 ping 请求。
你可以使用以下命令阻止传入的 ping 请求。-i
标志指定网络接口。在这种情况下,它是 ens33
。
sudo iptables -A INPUT -p icmp -i ens33 -j DROP
在 Iptables 上阻止来自特定 MAC 地址的访问
你可以通过使用 --mac-source
选项后跟其 mac 地址来阻止远程系统的 mac 地址,从而限制对你的系统的访问,如下所示。
sudo iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
清除 Iptables 防火墙规则
要从头开始,请使用以下命令删除或清除所有防火墙链或规则。
sudo iptables -F
要清除特定表的防火墙规则,请使用 -t
选项指定表,如下所示。在下面的示例中,我们正在清除 NAT
和 MANGLE
筛选器的防火墙规则。
sudo iptables -t nat -F
sudo iptables -t mangle -F
保存 Iptables 防火墙规则
要保存你已定义的链规则,并使其在重新启动后仍然存在,请使用 iptables-save
命令,如下所示。在此示例中,我们将防火墙规则保存在主目录中的 iptables.rules
文件中。
sudo iptables-save > ~/iptables.rules
从文件还原 Iptables 防火墙规则
如果你希望从先前创建的文件中还原防火墙规则,请使用 iptables-restore
命令。该命令采用以下格式。
sudo iptables-restore < ~/iptables.rules
结尾
Iptables 是一个强大的安全工具,通过一组控制网络数据包路由方式的网络流量管理选项来保护你的 Linux 系统。这使你可以自主管理 Linux 服务器上的流量。有关 Iptables 的更多信息,请查看官方文档。
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site