25+ 最常见的 iptables 命令,附带示例

如果您使用Linux,您有很多选项来保护您的设备。它附带了iptables,一个命令行防火墙工具,提供灵活性和优秀的保护。

然而,由于它是一个命令行工具,它需要一定的学习曲线。

因此,如果您是系统管理员或Linux学习者,您来对地方了,因为我们将介绍常见的iptables命令和示例。

什么是iptables?

iptables是一种基于软件的Linux内建工具。firewall它允许Linux用户创建或定义直接和间接影响互联网流量的策略。

这意味着您可以使用iptables创建规则,通过端口、源IP address、网络接口等来阻止或允许流量。

一旦您定义了规则,所有流量都需要经过它。因此,例如,对于每个新连接,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。但是,您也可以使用standalone Linux firewall来帮助您保护系统。

为什么需要使用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值。
  • Raw表:Raw表使您能够在iptables防火墙的有状态方面进行认真的工作。使用该表,您可以在Linux内核开始跟踪其状态之前,根据数据包的“状态”来路由数据包。它主要用于标记数据包,无论连接跟踪系统是否处理它们。如果数据包未被跟踪,则设置为NOTRACK目标。

然后,在“表”内部我们有“链”。

这些链在数据包的不同阶段进行深度包检查。例如,当数据包到达端口或网络接口时,您可以对其进行检查。这样,在将数据包释放给系统进程之前可以做出决策。

就像表一样,您还可以获得不同的链。包括:

  • PREROUTING链:在这里,规则处理刚到达的网络接口的数据包。
  • INPUT链:输入链中的规则处理传入连接行为。完成后,它们将传递给本地进程。
  • OUTPUT链:输出链处理进程生成的数据包。
  • FORWARD链:FORWARD链管理不适用于本地系统的数据包。它是其他目标系统的载体,例如router
  • POSTROUTING链:最后,我们有POSTROUTING链,它处理即将通过网络接口离开的数据包。

并非所有的链都在每个表中都可用。例如,FORWARD链仅在mangle、filter和security表中可用。同样,POSTROUTING链仅在mangle和nat(SNAT)中可用。只有OUTPUT链在所有表中都可用。

目标

现在,我们有一个“目标”。一旦一个包裹到达,它通过一系列的链路来确定哪个规则描述最符合。如果它符合某个规则的描述,它会根据该规则执行相应的操作,然后将它移动到目标位置-决定包裹的命运。

在许多情况下,一个包裹不会符合任何描述或规则集。这就是默认策略目标的用武之地。

目标可以是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

上述输出包含了大量信息。然而,它也暗示了一个未激活的防火墙。这是因为目前所有的链路都被设置为ACCEPT并且没有规则。

你需要开始添加规则以激活防火墙。

向链路添加规则

当你添加一个规则时,它总是附加到链路的末尾。因此,你必须使用-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  -i  - p  - s  --dport  -j 

保存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-presistent包。

要执行此操作,请运行以下命令。

$ 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

在特定端口上启用流量

您可以在特定端口上启用流量的ACCEPT或REJECT。

例如,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命令。

显示仅输入或输出链规则
要仅显示输入链规则,请运行以下命令。

 $ sudo iptables -L INPUT -n -v --line-numbers  
 #ouput
 
链输入(策略接受0个数据包,0字节)

num pkts字节目标协议选项,in out源目的地

1 0 0 接受tcp - * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

2 0 0 接受tcp - * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

3 0 0 接受tcp - * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443

4 0 0 拒绝tcp - * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392拒绝-使用icmp端口不可达 

类似地,如果要仅查看输出链规则,请运行:

 $ sudo iptables -L OUTPUT -n -v --line-numbers  
 #output

链输出(策略接受0个数据包,0字节)

num pkts字节目标协议选项,in out源目的地

1 0 0 接受全部- * 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

链输入(策略接受)

num target协议选项源目的地

1接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:22

2接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:80

3接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:443

4拒绝tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:392拒绝-使用icmp端口不可达 

如果要在2和3之间插入规则,请运行以下命令。

 $ sudo iptables -I INPUT 3 -s 252.32.1.2 -j DROP  

现在,检查更新后的规则。

 #output

链输入(策略接受)

num target协议选项源目的地

1接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:22

2接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:80

3删除所有-252.32.1.2 0.0.0.0/0

4接受tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:443

5拒绝tcp-0.0.0.0/0 0.0.0.0/0 tcp dpt:392拒绝-使用icmp端口不可达 

阻止传入流量但允许传出流量

您需要输入以下命令以阻止所有传入流量。

$ 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

注意:将“a.b.c.d”更改为您首选的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

允许特定网络的Rsync

如果您使用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 yaoweibin.com

#输出

yaoweibin.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

接下来,查看a network firewall and how it helps stop attacks

类似文章