zhcn 技术 手机 25+ 个最常见的 iptables 命令和示例

25+ 个最常见的 iptables 命令和示例

如果您使用 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 呢?毕竟,还有一些不错的替代命令行防火墙实用程序,例如ufwfirewalld 。您还可以使用独立的 Linux 防火墙,它更易于使用并提供更多功能。

那么,是什么让 iptables 在配置防火墙时如此有吸引力呢?以下是使用它的一些原因:

  • 它提供了开箱即用的极大灵活性。可以在数据包级别设置规则。
  • 一旦您了解了它的工作原理,它就相对容易使用。
  • 以简单的方式阻止不需要的流量。
  • 将数据包重定向到备用 IP 地址。
  • 保护您的系统免受拒绝服务 (DoS) 攻击。

更!

理解iptables架构与Netfilter的关系

要正确理解 iptables,您需要了解它的架构。首先,您将对各个 iptables 组件有一个清晰的了解。然后,一旦您了解了每一项,就可以使用它们来创建防火墙规则。

当我们谈论 iptables 时,Netfilter 也会发挥作用。您可以将 Netfilter 视为 iptables 的老大哥。它建立在 iptables 之上,并提供了一组更好的功能来管理防火墙。然而,实现良好防火墙功能的一种方法是使用 iptables。

iptables 是 Netfilter 内核级挂钩的命令行接口。这些钩子可以与 Linux 网络堆栈交互并影响最深层次的数据包。

所以 iptables 架构如下所示:

IPtables数据包流
IPtables数据包流

桌子

iptables 架构从表开始。这些表负责组织规则。每个表格都根据您做出的决策类型进行分类。更简单地说,表通过附加处理包的特定方法,从整体上简化了包的处理。

iptables 提供的各种表包括:

  • 过滤表:指定数据包过滤决策类型。简单来说,它决定包裹是否到达目的地。
  • NAT 表:指定地址转换决策的类型。这里,数据包路由是基于NAT网络来确定的。例如,如果包无法到达 NAT,它将被跳过并尝试查找非 NAT 网络。
  • Mangle 表:管理包的特殊处理需求。例如,您可以将其配置为更改数据包标头信息,例如 TTL 值。
  • 原始表:原始表允许您热情地操纵 iptables 防火墙的状态方面。该表允许您在 Linux 内核开始跟踪状态之前根据数据包的“状态”路由数据包。这主要用于标记数据包,无论连接跟踪系统是否处理它们。如果数据包未被跟踪,则会将其设置为 NOTRACK 目标。
IP表
IP表

而“表”内有一条“链”。

这些链在路由的各个阶段处理深度数据包检查。例如,您可以在到达端口或网络接口时对其进行检查。这样,就可以在将包发布到系统进程之前做出决定。

除了桌子之外,还提供不同的链条。这些包括:

  • PREROUTING 链:这里,规则处理刚刚到达网络接口的数据包。
  • INPUT 链: INPUT 链中描述的规则处理传入连接的行为。一旦完成,它就会被传递到本地进程。
  • OUTPUT 链: OUTPUT 链处理进程生成的数据包。
  • FORWARD 链: FORWARD 链管理不是发往本地系统的数据包。这是其他目标系统(例如路由器)的载体。
  • POSTROUTING 链:最后是 POSTROUTING 链,它处理即将通过网络接口退出的数据包。
iptables链
iptables链

并非每张桌子上都提供所有连锁店。例如,FORWARD 链只能用在 mangle、过滤器和安全表中。类似地,POSTROUTING 链可以与 mangle 和 nat (SNAT) 一起使用。只有 OUTPUT 链可用于所有表。

目标

现在,我们有了一个“目标”。当包裹到达时,将其在链中移动以查看哪个规则描述最适合。如果它与规则描述匹配,它将根据规则执行相关操作,并移动到目标以确定数据包的命运。

在许多情况下,数据包不符合任何描述或规则集。这就是默认策略 Target 发挥作用的地方。

目标可以是 ACCEPT、DROP 和 REJECT。这些是决定数据包命运的终止目标。

  • ACCEPT:接受数据包。
  • DROP:丢弃数据包,使发送方不知道系统是否存在。
  • REJECT:拒绝数据包。

还有非终端目标,主要用于存储有关数据包的信息。

最常见的 iptables 命令和示例

在开始运行 iptables 命令之前,请确保满足以下条件:

  • 具有运行命令的管理权限。如果该命令由于管理员权限而失败,请通过在命令前面加上sudo命令来重新运行该命令。
  • 本文不是关于如何在 Ubuntu 上配置 iptables 的教程
  • 使用适用于 IPv4 的iptables命令。如果您使用 IPv6,则应该使用ip6tables
25+ 个最常见的 iptables 命令和示例
25+ 个最常见的 iptables 命令和示例

检查 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

将打开以下窗口。按<是>并输入。

iptables-持久性
iptables-持久性

由于我们使用的是 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

接下来,检查您的网络防火墙以及它如何帮助阻止攻击。

如果您使用 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 呢?毕竟,还有一些不错的替代命令行防火墙实用程序,例如ufwfirewalld 。您还可以使用独立的 Linux 防火墙,它更易于使用并提供更多功能。

那么,是什么让 iptables 在配置防火墙时如此有吸引力呢?以下是使用它的一些原因:

  • 它提供了开箱即用的极大灵活性。可以在数据包级别设置规则。
  • 一旦您了解了它的工作原理,它就相对容易使用。
  • 以简单的方式阻止不需要的流量。
  • 将数据包重定向到备用 IP 地址。
  • 保护您的系统免受拒绝服务 (DoS) 攻击。

更!

理解iptables架构与Netfilter的关系

要正确理解 iptables,您需要了解它的架构。首先,您将对各个 iptables 组件有一个清晰的了解。然后,一旦您了解了每一项,就可以使用它们来创建防火墙规则。

当我们谈论 iptables 时,Netfilter 也会发挥作用。您可以将 Netfilter 视为 iptables 的老大哥。它建立在 iptables 之上,并提供了一组更好的功能来管理防火墙。然而,实现良好防火墙功能的一种方法是使用 iptables。

iptables 是 Netfilter 内核级挂钩的命令行接口。这些钩子可以与 Linux 网络堆栈交互并影响最深层次的数据包。

所以 iptables 架构如下所示:

IPtables数据包流
IPtables数据包流

桌子

iptables 架构从表开始。这些表负责组织规则。每个表格都根据您做出的决策类型进行分类。更简单地说,表通过附加处理包的特定方法,从整体上简化了包的处理。

iptables 提供的各种表包括:

  • 过滤表:指定数据包过滤决策类型。简单来说,它决定包裹是否到达目的地。
  • NAT 表:指定地址转换决策的类型。这里,数据包路由是基于NAT网络来确定的。例如,如果包无法到达 NAT,它将被跳过并尝试查找非 NAT 网络。
  • Mangle 表:管理包的特殊处理需求。例如,您可以将其配置为更改数据包标头信息,例如 TTL 值。
  • 原始表:原始表允许您热情地操纵 iptables 防火墙的状态方面。该表允许您在 Linux 内核开始跟踪状态之前根据数据包的“状态”路由数据包。这主要用于标记数据包,无论连接跟踪系统是否处理它们。如果数据包未被跟踪,则会将其设置为 NOTRACK 目标。
IP表
IP表

而“表”内有一条“链”。

这些链在路由的各个阶段处理深度数据包检查。例如,您可以在到达端口或网络接口时对其进行检查。这样,就可以在将包发布到系统进程之前做出决定。

除了桌子之外,还提供不同的链条。这些包括:

  • PREROUTING 链:这里,规则处理刚刚到达网络接口的数据包。
  • INPUT 链: INPUT 链中描述的规则处理传入连接的行为。一旦完成,它就会被传递到本地进程。
  • OUTPUT 链: OUTPUT 链处理进程生成的数据包。
  • FORWARD 链: FORWARD 链管理不是发往本地系统的数据包。这是其他目标系统(例如路由器)的载体。
  • POSTROUTING 链:最后是 POSTROUTING 链,它处理即将通过网络接口退出的数据包。
iptables链
iptables链

并非每张桌子上都提供所有连锁店。例如,FORWARD 链只能用在 mangle、过滤器和安全表中。类似地,POSTROUTING 链可以与 mangle 和 nat (SNAT) 一起使用。只有 OUTPUT 链可用于所有表。

目标

现在,我们有了一个“目标”。当包裹到达时,将其在链中移动以查看哪个规则描述最适合。如果它与规则描述匹配,它将根据规则执行相关操作,并移动到目标以确定数据包的命运。

在许多情况下,数据包不符合任何描述或规则集。这就是默认策略 Target 发挥作用的地方。

目标可以是 ACCEPT、DROP 和 REJECT。这些是决定数据包命运的终止目标。

  • ACCEPT:接受数据包。
  • DROP:丢弃数据包,使发送方不知道系统是否存在。
  • REJECT:拒绝数据包。

还有非终端目标,主要用于存储有关数据包的信息。

最常见的 iptables 命令和示例

在开始运行 iptables 命令之前,请确保满足以下条件:

  • 具有运行命令的管理权限。如果该命令由于管理员权限而失败,请通过在命令前面加上sudo命令来重新运行该命令。
  • 本文不是关于如何在 Ubuntu 上配置 iptables 的教程
  • 使用适用于 IPv4 的iptables命令。如果您使用 IPv6,则应该使用ip6tables
25+ 个最常见的 iptables 命令和示例
25+ 个最常见的 iptables 命令和示例

检查 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

将打开以下窗口。按<是>并输入。

iptables-持久性
iptables-持久性

由于我们使用的是 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

接下来,检查您的网络防火墙以及它如何帮助阻止攻击。