如果您使用 Linux,您有多种选择来保护您的设备。它配备了 iptables,这是一种命令行防火墙实用程序,可提供灵活性和卓越的保护。
然而,由于它是一个命令行实用程序,因此需要一些学习。
因此,如果您是系统管理员或 Linux 学习者,这是说明常见 iptables 命令的好方法。
什么是 iptables?
iptables 是一个基于软件的 Linux 内置防火墙。 Linux 用户可以创建或定义直接或间接影响互联网流量的策略。
这意味着您可以使用 iptables 创建规则来阻止或允许流量通过端口、源 IP 地址、网络接口等。
一旦定义了规则,所有流量都必须通过它。例如,对于每个新连接,iptables 都会检查与该连接匹配的预定义规则。如果存在,则该规则将应用于连接。但是,如果没有关联的适用规则,则执行默认规则。
要使用iptables,需要使用以下命令:
$ iptables -L -n -v 这里的参数是:
- -L 列出所有规则。
- -n 提高数值输出的性能。
- -v 以详细格式显示输出。
运行不带参数的iptables 命令会返回以下输出:
iptables v1.8.7 (nf_tables): no command specified
Try `iptables -h' or 'iptables --help' for more information.如果出现诸如未找到命令“iptables”之类的错误,则需要安装它。
要在 Linux 发行版上安装 iptables,请运行以下命令:
$ sudo apt-get install iptables我的 Linux 发行版已经预安装了它,因此它返回:
#output
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
iptables is already the newest version (1.8.7-1ubuntu5).
iptables set to manually installed.
0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.什么是防火墙?
防火墙是系统、网络和个人计算机最基本的保护形式。它可以基于硬件或基于软件,并依赖规则才能正常运行。
大多数防火墙都是高度可定制的,允许您创建或编辑规则。例如,来自 Internet 的数据包使用端口进入您的系统,因此基于端口的扫描有助于将其过滤掉。除此之外,您还可以通过源 IP 地址或网络接口来允许或阻止服务。
如果您使用的是 Linux,则可以访问内置的 iptables。但是,您也可以使用独立的 Linux 防火墙来帮助保护您的系统。
为什么防火墙配置需要 iptables?
但为什么首先要使用 iptables 呢?毕竟,还有一些不错的替代命令行防火墙实用程序,例如ufw和firewalld 。您还可以使用独立的 Linux 防火墙,它更易于使用并提供更多功能。
那么,是什么让 iptables 在配置防火墙时如此有吸引力呢?以下是使用它的一些原因:
- 它提供了开箱即用的极大灵活性。可以在数据包级别设置规则。
- 一旦您了解了它的工作原理,它就相对容易使用。
- 以简单的方式阻止不需要的流量。
- 将数据包重定向到备用 IP 地址。
- 保护您的系统免受拒绝服务 (DoS) 攻击。
更!
理解iptables架构与Netfilter的关系
要正确理解 iptables,您需要了解它的架构。首先,您将对各个 iptables 组件有一个清晰的了解。然后,一旦您了解了每一项,就可以使用它们来创建防火墙规则。
当我们谈论 iptables 时,Netfilter 也会发挥作用。您可以将 Netfilter 视为 iptables 的老大哥。它建立在 iptables 之上,并提供了一组更好的功能来管理防火墙。然而,实现良好防火墙功能的一种方法是使用 iptables。
iptables 是 Netfilter 内核级挂钩的命令行接口。这些钩子可以与 Linux 网络堆栈交互并影响最深层次的数据包。
所以 iptables 架构如下所示:

桌子
iptables 架构从表开始。这些表负责组织规则。每个表格都根据您做出的决策类型进行分类。更简单地说,表通过附加处理包的特定方法,从整体上简化了包的处理。
iptables 提供的各种表包括:
- 过滤表:指定数据包过滤决策类型。简单来说,它决定包裹是否到达目的地。
- NAT 表:指定地址转换决策的类型。这里,数据包路由是基于NAT网络来确定的。例如,如果包无法到达 NAT,它将被跳过并尝试查找非 NAT 网络。
- Mangle 表:管理包的特殊处理需求。例如,您可以将其配置为更改数据包标头信息,例如 TTL 值。
- 原始表:原始表允许您热情地操纵 iptables 防火墙的状态方面。该表允许您在 Linux 内核开始跟踪状态之前根据数据包的“状态”路由数据包。这主要用于标记数据包,无论连接跟踪系统是否处理它们。如果数据包未被跟踪,则会将其设置为 NOTRACK 目标。

链
而“表”内有一条“链”。
这些链在路由的各个阶段处理深度数据包检查。例如,您可以在到达端口或网络接口时对其进行检查。这样,就可以在将包发布到系统进程之前做出决定。
除了桌子之外,还提供不同的链条。这些包括:
- PREROUTING 链:这里,规则处理刚刚到达网络接口的数据包。
- INPUT 链: INPUT 链中描述的规则处理传入连接的行为。一旦完成,它就会被传递到本地进程。
- OUTPUT 链: OUTPUT 链处理进程生成的数据包。
- FORWARD 链: FORWARD 链管理不是发往本地系统的数据包。这是其他目标系统(例如路由器)的载体。
- POSTROUTING 链:最后是 POSTROUTING 链,它处理即将通过网络接口退出的数据包。

并非每张桌子上都提供所有连锁店。例如,FORWARD 链只能用在 mangle、过滤器和安全表中。类似地,POSTROUTING 链可以与 mangle 和 nat (SNAT) 一起使用。只有 OUTPUT 链可用于所有表。
目标
现在,我们有了一个“目标”。当包裹到达时,将其在链中移动以查看哪个规则描述最适合。如果它与规则描述匹配,它将根据规则执行相关操作,并移动到目标以确定数据包的命运。
在许多情况下,数据包不符合任何描述或规则集。这就是默认策略 Target 发挥作用的地方。
目标可以是 ACCEPT、DROP 和 REJECT。这些是决定数据包命运的终止目标。
- ACCEPT:接受数据包。
- DROP:丢弃数据包,使发送方不知道系统是否存在。
- REJECT:拒绝数据包。
还有非终端目标,主要用于存储有关数据包的信息。
最常见的 iptables 命令和示例
在开始运行 iptables 命令之前,请确保满足以下条件:
- 具有运行命令的管理权限。如果该命令由于管理员权限而失败,请通过在命令前面加上
sudo命令来重新运行该命令。 - 本文不是关于如何在 Ubuntu 上配置 iptables 的教程。
- 使用适用于 IPv4 的iptables命令。如果您使用 IPv6,则应该使用ip6tables 。

检查 iptables 状态
要检查当前 iptables 状态,您需要运行以下命令:
$ iptables -L -n -v #output
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination上面的输出包含很多信息。然而,这也表明防火墙处于非活动状态。这是因为目前所有链都设置为接受并且没有规则。
要激活防火墙,您需要开始添加规则。
向链添加规则
添加规则总是将规则添加到链中。因此,您必须使用-A(追加)选项。其语法为:
$ sudo iptables - A但是,当我运行它时,我得到以下返回:
iptables v1.8.7 (nf_tables): option "-A" requires an argument
Try `iptables -h' or 'iptables --help' for more information.可用于添加规则的参数有:
- – i:代表接口。这里可以提到添加规则的接口。您可以指定 ppp0、eth0 等。
- – p:协议的缩写。这里我们指的是使用网络协议过滤加壳的规则。例如,您可以指定 ICMP、TCP、UDP 等。如果您希望规则适用于所有协议,请指定“all”作为参数值。
- – s:后跟一个源参数,指定流量的来源(IP 地址或主机名)。
- – dport: dport 表示目的端口,指定数据包到达的端口号。
- -j:最后有一个 TARGET 参数,可以是 TARGET 名称、ACCEPT、DROP 或 RETURN。
按以下顺序编写命令也很重要:
$ sudo iptables -A <chain-name> -i <interface-name> - p <protocool-name> - s <source> --dport <port no.> -j <target>保存对 iptables 的更改
添加规则后,您可以使用iptables -save命令保存它们。
$ sudo iptables -save输出是:
nitt@logan99:~$ sudo iptables-save
# Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Sun May 14 13:37:34 2023手动保留规则
默认情况下,iptables 不保存规则。因此,重新启动计算机将删除所有规则。为了避免重新配置 iptables,您应该使用以下命令:
对于 IPv4 规则,创建以下命令:
$ sudo iptables-save > /etc/iptables/rules.v4对于 IPv6 规则,请编写以下命令:
$ sudo iptables-save > /etc/iptables/rules.v6自动保留规则
要使规则在重新启动后持续存在并自动执行,您需要安装iptables-previous软件包。
为此,请运行以下命令:
$ sudo apt-get install iptables-persistent将打开以下窗口。按<是>并输入。

由于我们使用的是 IPv4 表,因此仅显示 IPv4 规则。如果您使用 IPv6,则会出现相关窗口。
注意:该包仅加载保存的 iptables 规则。因此,每次更改 iptables 时,都需要像这样保存: iptables -save命令。
重启后重新加载规则
保存规则后,您需要使用以下命令恢复它们:
$ sudo iptables-restore < /etc/iptables/rules.v4和
$ sudo iptables-restore < /etc/iptables/rules.v6在本地主机上启用流量/启用环回
要启用本地主机上的流量,请使用以下命令:
$ sudo iptables -A INPUT -i lo -j ACCEPT其中lo表示所有本地主机通信的环回接口。
同样,您也可以通过环回接口发送数据包。
$ sudo iptables -A OUTPUT -o lo -j ACCEPT要查看规则如何更改,请运行iptables -L -n -V 。
#output
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination启用特定端口上的流量
您可以在特定端口上启用接受或拒绝流量。
例如,SSL、HTTP 和 SSH 端口对于应用程序的正常运行非常重要。您可以通过端口号添加一条规则来接受数据包,并验证该规则是否按预期工作。
对于 SSL,请运行以下命令:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT对于 HTTPS,运行以下命令:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT允许 eth0 接口上的所有 HTTPS 流量。
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT对于 SSH,请运行以下命令:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT此外,要接受 eth0 接口上的所有传入 SSH 流量,请运行以下命令:
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT另一个示例是在自定义应用程序的特定端口上启用端口流量。假设端口 233。
要在该端口上打开连接,请运行:
$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT同样,您还可以使用 REJECT 目标选项禁用特定端口上的连接。
让我们阻止端口 392 上的所有连接。
$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT要进行检查,请运行iptables -L -n -v命令。
#output
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:233
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0删除现有规则
要删除现有规则,需要运行以下命令:
$ iptables -F或者
$ iptables --flush注意:如果不保存规则,它们将永久丢失,并且无法使用iptables -restore恢复。
删除包含行号的规则
要删除特定规则,您需要获取编号规则的列表。
$ sudo iptables -L --line-numbers #output
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
2 ACCEPT tcp -- anywhere anywhere tcp dpt:http
3 ACCEPT tcp -- anywhere anywhere tcp dpt:https
4 ACCEPT tcp -- anywhere anywhere tcp dpt:233
5 REJECT tcp -- anywhere anywhere tcp dpt:392 reject-with icmp-port-unreachable如果要删除 INPUT 链中的第 4 条规则,请运行以下命令:
$ sudo iptables -D INPUT 4假设您再次运行iptables -n -v -L命令。
#output
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable仅显示 INPUT 或 OUTPUT 链规则
要仅显示 INPUT 链规则,请运行以下命令:
$ sudo iptables -L INPUT -n -v --line-numbers #ouput
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
4 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable同样,如果您只想查看 OUTPUT 链规则,请运行:
$ sudo iptables -L OUTPUT -n -v --line-numbers #output
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0启动/停止/重新启动防火墙
如果您使用的是 RHEL/Fedora Linux 或 CentOS,您可以运行命令来启动/停止或重新启动防火墙。
$ service iptables stop
$ service iptables start
$ service iptables restart您还可以使用systemctl命令。
但是,它在 Ubuntu 上不起作用。
在特定位置插入规则
如果要在特定位置插入规则,需要使用以下命令:
我们先来看看规则。
$ sudo iptables -L INPUT -n --line-numbers #output
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
4 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable如果要插入 2 到 3 之间的规则,请运行以下命令:
$ sudo iptables -I INPUT 3 -s 252.32.1.2 -j DROP接下来,检查更新的规则。
#output
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3 DROP all -- 252.32.1.2 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
5 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable阻止传入流量但允许传出流量
要阻止所有传入流量,您需要输入以下命令:
$ iptables -P INPUT DROP
$ iptables -P FORWARD DROP
$ iptables -P OUTPUT ACCEPT
$ iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
$ iptables -L -v -n这样您就可以在 ping 或下载软件包时阻止未知的传入流量。
阻止特定 IP 地址
要阻止特定 IP 地址,请运行以下命令:
$ iptables -A INPUT -s 14.23.59.9 -J DROP您还可以定义一个变量来存储被阻止的 IP 地址并运行命令。
BLOCK_THE_IP = “a.b.c.d”然后运行:
$ iptables -A INPUT -s “BLOCK_THE_IP” -j DROP注意:将“abcd”更改为您所需的 IP 地址。
允许外部系统 ping
您可以允许外部用户 ping 您的服务器并发现您的网络。
$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$ sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT允许您的内部网络与外部网络通信
运行以下命令以允许从内部网络(假设为 eth0)访问外部网络(假设为 eth1)。
$ sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT允许出站 DNS
要允许 DNS 连接到您的服务器,请运行以下命令:
$ iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
$ iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT允许来自特定网络的 Rsycn
如果要使用 Rsync 命令并在特定网络上启用它,请运行以下命令:
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT阻塞端口
运行以下命令来阻止特定端口和传入请求。
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP阻止到特定 IP 地址的出站流量
您可以通过运行以下命令来阻止流向任何 IP 地址的流量:
$ host -t a .com#输出
.com 的地址是 172.66.40.93。
要阻止到特定 IP 地址的传出流量,请运行以下命令:
iptables -A OUTPUT -d 72.66.40.93 -j DROP同样,您还可以阻止 Instagram、Twitter 和 Facebook 等社交媒体平台。
通过运行以下命令查找您的社交媒体 IP 地址:
$ host -t a social-media-web-adrress.com例如,对于 Instagram:
$ host -t a www.instagram.com接下来,您需要找到特定社交媒体平台 IP 地址的 CIDR。
$ whois 185.89.219.11 | grep CIDR注意:您可能需要运行sudo apt-get install whois来安装 Whois 软件包。
现在按以下方式输入 CIDR 值:
$ iptables - A OUTPUT -p tcp -d CIDR-value -j DROP注意:请务必相应更改 CIDR 值。
允许或阻止 ICMP Ping 请求
要允许或阻止 ICMP ping 请求,请运行以下命令:
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
$ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP开放特定范围的端口
要打开一系列端口,请运行以下命令:
$ iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8933: 8500 -j ACCEPT查看NAT规则列表
要列出您的 NAT 规则,请运行以下命令:
$ sudo iptables -t nat -L -n -v或者
$ sudo iptables -t nat -v -L -n --line-number重置包裹计数器
检查当前 iptables 计数器:
$ sudo iptables -L -n -v要重置或清除计数器,请运行以下命令:
$ sudo iptables -Z
$ sudo iptables -L -n -v要仅重置 INPUT 链计数器,请运行以下命令:
$ iptables -Z INPUT要重置特定规则计数器,请运行以下命令:
$ iptables -z INPUT RULE-NUMBER将 RULE-NUMBER 更改为该特定规则。
最后一句话
iptables 是一个功能强大的防火墙命令行实用程序。您可以配置网络资源、数据包、接口以及几乎所有与您的特定场景相关的内容。
此外,iptables 还提供了许多选项。使用 man 命令检查主页以了解全局。
$ man iptables
$ man ip6tables接下来,检查您的网络防火墙以及它如何帮助阻止攻击。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

