Linux中的Iptables介绍


iptables

1. 概述

Iptables 是一个用于配置 Linux 内核防火墙的用户空间工具。它能够对进出服务器的网络数据包进行过滤、修改和转发等操作,是构建安全的 Linux 网络环境的关键组件。它通过一系列规则来决定如何处理数据包,这些规则可以基于源 IP 地址、目标 IP 地址、端口号、协议类型等多种条件。

2. 工作原理

  • 表(Tables)

    • Iptables 包含了 4 个主要的表,分别是filter,nat,mangleraw
      • filter 表:这是最常用的表,主要用于过滤数据包,决定是否允许数据包通过(ACCEPT)、丢弃数据包(DROP)或者拒绝数据包(REJECT)。例如,你可以设置规则允许来自特定 IP 地址范围的 HTTP 流量(端口 80)通过,而丢弃其他未知来源的 HTTP 流量。
      • nat 表:主要用于网络地址转换(NAT)操作。例如,在一个使用私有 IP 地址的局域网中,通过nat表可以将内部私有 IP 地址转换为外部公共 IP 地址,使得内部网络中的主机能够访问互联网。它包括源 NAT(SNAT)和目的 NAT(DNAT)。SNAT用于修改数据包的源 IP 地址,通常在共享上网场景中使用;DNAT用于修改数据包的目的 IP 地址,比如将外部访问服务器的某个公共 IP 地址的流量转发到内部不同服务器的私有 IP 地址上。
      • mangle 表:这个表可以对数据包进行修改,如修改数据包的 TTL(生存时间)值、改变数据包的服务类型(TOS)等。例如,在一些对网络质量有特殊要求的环境中,可以通过mangle表调整数据包的优先级。
      • raw 表:用于配置一些在连接跟踪之前的规则。它可以用于处理一些特殊的数据包,避免它们被连接跟踪机制处理,提高性能或者满足特殊的安全需求。
  • 链(Chains)

    • 每个表都包含了若干个链,链是规则的集合。主要的链有INPUT,OUTPUT,FORWARD

      等。

      • INPUT 链:用于处理进入本机的数据包。例如,当外部主机尝试访问本地服务器上的服务(如 SSH 服务)时,数据包会经过INPUT链,在这里可以设置规则决定是否允许该访问。
      • OUTPUT 链:处理从本机发出的数据包。比如,当本地服务器向外部发送一个 HTTP 请求时,数据包会经过OUTPUT链,在这里可以限制服务器主动发起的连接类型等。
      • FORWARD 链:用于处理经过本机但目的不是本机的数据包,通常在路由器或者网关设备上使用。例如,在一个充当路由器的 Linux 服务器上,内部网络主机发往外部网络的数据包会经过FORWARD链,在这里可以进行转发规则的设置。
  • 规则(Rules)

    • 规则定义了如何处理数据包。一条规则通常包含匹配条件和动作。匹配条件可以是源 IP 地址、目标 IP 地址、端口号、协议类型等诸多因素。动作则是对匹配的数据包采取的操作,如ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝并返回错误信息)、SNAT(源地址转换)、DNAT(目的地址转换)等。例如,下面是一条简单的规则:
      • iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT,这条规则的意思是在INPUT链中添加(-A)一条规则,匹配源 IP 地址来自192.168.1.0/24网段、协议为 TCP(-p tcp)并且目标端口为 80(--dport 80)的数据包,然后采取的动作(-j)是接受(ACCEPT)这些数据包。

3. 数据包处理流程与规则匹配顺序

  • 当一个数据包进入 Linux 系统时,它会按照特定的顺序经过 Iptables 的规则链进行处理。首先,数据包会经过raw表,这里的规则主要用于决定是否对数据包进行连接跟踪。然后,根据数据包的流向,它会进入mangle表,在这里可以对数据包进行标记、修改 TTL 等操作。接着是nat表,用于进行网络地址转换。最后是filter表,决定数据包是被接受还是被丢弃
  • 规则的匹配是按照在链中的顺序进行的。一旦找到匹配的规则,就会执行相应的动作,并且不再继续匹配该链中的后续规则。例如,在INPUT链中,如果第一条规则就匹配并接受了一个数据包,那么就不会再检查INPUT链中的其他规则来处理这个数据包。

4. 常用的匹配条件

  • 基于 IP 地址的匹配
    • 可以使用-s(源 IP 地址)和-d(目标 IP 地址)选项来指定 IP 地址范围。例如,iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT会接受来自192.168.0.0 - 192.168.255.255这个网段的数据包。还可以使用具体的 IP 地址,如iptables -A INPUT -s 10.0.0.1 -j DROP会丢弃来自10.0.0.1这个 IP 地址的数据包。
  • 基于端口的匹配
    • 对于 TCP 和 UDP 协议,可以使用--dport(目标端口)和--sport(源端口)选项。例如,iptables -A INPUT -p tcp --dport 22 -j ACCEPT会接受目标端口为 22(SSH 服务)的 TCP 数据包。同时,也可以指定端口范围,如iptables -A INPUT -p udp --dport 1024:65535 -j ACCEPT会接受目标端口在1024 - 65535之间的 UDP 数据包。
  • 基于协议的匹配
    • 使用-p选项来指定协议,如 TCP、UDP、ICMP 等。例如,iptables -A INPUT -p icmp -j ACCEPT会接受所有 ICMP 协议的数据包,这通常用于允许网络中的主机响应 ping 请求。

5. 动作类型

  • ACCEPT
    • 这个动作表示允许数据包通过,让数据包继续在网络中传输。例如,当你想要允许本地服务器的 Web 服务(端口 80)接收外部访问时,就可以设置规则使用ACCEPT动作来允许 TCP 协议、目标端口为 80 的数据包进入。
  • DROP
    • DROP动作会直接丢弃数据包,并且不会向发送方返回任何信息。这在安全性方面比较有用,例如,当你检测到某个恶意 IP 地址频繁尝试访问服务器时,可以使用DROP动作来阻止其数据包进入,这样恶意攻击者就无法得知其访问被拒绝是因为防火墙的原因。
  • REJECT
    • DROP不同,REJECT动作会丢弃数据包并且向发送方返回一个错误信息,告知发送方连接被拒绝。例如,在某些需要友好地拒绝外部访问的情况下,可以使用REJECT
  • LOG
    • LOG动作主要用于记录数据包的信息。当数据包匹配到带有LOG动作的规则时,Iptables 会将数据包的相关信息(如源 IP 地址、目标 IP 地址、协议等)记录到系统日志(通常是/var/log/messages或者/var/log/kern.log)中。这有助于管理员分析网络流量和检测潜在的安全问题。例如,iptables -A INPUT -p tcp --dport 80 -j LOG会记录所有访问本地 Web 服务端口的 TCP 数据包的信息。

6. 基本命令

# 查看规则
iptables -L -v -n -t <table>
#    说明
#    -L:列出规则。
#    -v:详细输出。
#    -n:数字形式显示地址和端口。
#    -t <table>:指定表,默认为 filter。

# 添加规则
iptables -A <chain> -p <protocol> --dport <port> -j <action>
#    说明
#    -A <chain>:追加规则到指定链。
#    -p <protocol>:指定协议(如 tcp, udp)。
#    --dport <port>:指定目的端口。
#    -j <action>:指定动作(如 ACCEPT, DROP, REJECT)。

# 删除规则
iptables -D <chain> <rule-number>
# 	 说明
#    <rule-number>:规则编号,从 1 开始。

# 删除所有规则
iptables -F -t <table>

7. 高级功能

  • 连接跟踪(conntrack)模块
    • Iptables 通过连接跟踪模块来跟踪网络连接的状态。这使得它能够根据连接的不同阶段(如 NEW、ESTABLISHED、RELATED)来制定规则。例如,在处理 TCP 连接时,对于一个新建立的连接(NEW),可以设置比较严格的规则进行检查;而对于已经建立的连接(ESTABLISHED),则可以相对宽松地允许数据包通过。一个典型的规则是允许已经建立的 TCP 连接的数据包通过,如iptables -A INPUT -m conntrack -p tcp --ctstate ESTABLISHED -j ACCEPT。这个规则使用了-m conntrack来调用连接跟踪模块,--ctstate ESTABLISHED指定只接受状态为已建立连接的 TCP 数据包。
  • IPsets 模块
    • IPsets 是 Iptables 的一个强大的扩展,它允许管理员将多个 IP 地址或端口等对象组合成一个集合,然后在 Iptables 规则中使用这个集合。例如,你可以创建一个包含多个恶意 IP 地址的 IPset 集合,然后在 Iptables 规则中使用这个集合来一次性丢弃来自这些恶意 IP 地址的数据包。创建一个 IPset 可以使用ipset命令,如ipset create blacklist hash:ip用于创建一个名为blacklist的 IPset,类型为hash:ip(用于存储 IP 地址)。然后可以将 IP 地址添加到这个集合中,如ipset add blacklist 192.168.1.100。在 Iptables 规则中可以这样使用:iptables -A INPUT -m set -j DROP --match - set blacklist src,这条规则会丢弃来自blacklist集合中 IP 地址的数据包。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值