Linux防火墙

Linux防火墙

一、iptables

1.1 概述

使用man命令查看帮助:

微信截图_20250409100733

​ 这些工具在 Red Hat Enterprise Linux 中已被弃用。它们仅处于维护状态,不会接收新功能。新的配置应使用 nft(8) 工具。现有配置应尽可能迁移到 nft(8)。详情请参阅:https://red.ht/nft_your_tables。此外,还有 iptables-translate(8)ip6tables-translate(8) 工具可协助完成迁移。

iptablesip6tables 被用于设置、维护和检查 Linux 内核中 IPv4 和 IPv6 数据包过滤规则的表。可以定义多个不同的表。每个表包含许多内置链,也可以包含用户定义的链。

​ 每条链是一组可以匹配一组数据包的规则。每条规则指定如何处理匹配的数据包。这称为“目标”(target),目标可以是跳转到同一表中的用户定义链。

TARGETS(动作):

image-20250409103626663

​ 防火墙规则指定了数据包的匹配条件和目标。如果数据包不符合条件,则会检查链中的下一条规则;如果符合条件,则根据目标的值决定下一步处理。目标可以是用户定义链的名称,也可以是 iptables-extensions(8) 中描述的目标之一,或者是特殊值 ACCEPTDROPRETURN

  • ACCEPT:允许数据包通过。
  • DROP:丢弃数据包。
  • RETURN:停止遍历当前链,并恢复到上一个(调用)链中的下一条规则。

如果到达内置链的末尾,或者在内置链中匹配了目标为 RETURN 的规则,链策略指定的目标将决定数据包的命运。

TABLES(表):

image-20250409102448332

目前有五个独立的表(任何时候存在哪些表取决于内核配置选项和当前加载的模块)。

-t, --table 表 此选项指定命令应操作的数据包匹配表。如果内核配置了自动模块加载功能,将尝试为该表加载适当的模块(如果尚未加载)。

这些表包括:

filter 表 这是默认表(如果未传递 -t 选项)。它包含以下内置链:

  • INPUT:用于处理发往本地套接字的数据包。
  • FORWARD:用于处理通过设备路由的数据包。
  • OUTPUT:用于处理本地生成的数据包。

nat 表 当遇到创建新连接的数据包时,将查询此表。它包含四个内置链:

  • PREROUTING:用于在数据包进入时立即进行修改。
  • INPUT:用于修改发往本地套接字的数据包。
  • OUTPUT:用于在路由前修改本地生成的数据包。
  • POSTROUTING:用于在数据包即将发送时修改。 自内核 3.7 起支持 IPv6 NAT。

mangle 表 用于特殊的数据包修改操作。

  • 在内核 2.4.17 之前,它有两个内置链:PREROUTINGOUTPUT,分别在路由前对进入的数据包或本地生成的数据包进行修改。
  • 自内核 2.4.18 起,还支持 INPUT(进入设备的数据包)、FORWARD(通过设备路由的数据包)和 POSTROUTING(即将发送的数据包)。

raw 表 主要用于配置不进行连接跟踪的规则(结合 NOTRACK 目标)。

  • 它在 netfilter 钩子的高优先级处注册,因此优先于 ip_conntrack 或其他 IP 表。
  • 提供以下内置链:PREROUTING(适用于任何网络接口到达的数据包)和 OUTPUT(适用于本地进程生成的数据包)。

security 表 用于强制访问控制(MAC)网络规则,例如由 SECMARKCONNSECMARK 目标启用的规则。

  • 强制访问控制由 Linux 安全模块(如 SELinux)实现。
  • 它在 filter 表 之后调用,因此允许过滤表中的自由访问控制(DAC)规则优先生效。
  • 提供以下内置链:INPUT(进入设备的数据包)、OUTPUT(路由前本地生成的数据包)和 FORWARD(通过设备路由的数据包)。

1.2 使用方法

iptables [-t 表名] 命令 [链名] [规则] [-j 动作]

命令概述:

参数/命令 描述
-A, --append 将规则追加到选定链的末尾。当源或目标解析为多个地址时,会为每种地址组合添加规则。
-C, --check 检查选定链中是否存在与规则匹配的条目。不修改配置,仅通过退出代码指示结果。
-D, --delete 删除选定链中的规则,可以指定规则编号或规则匹配。
-I, --insert 将规则插入到选定链中指定位置,默认插入到链头部。
-R, --replace 替换选定链中的规则,规则编号从1开始。源或目标解析为多个地址时命令会失败。
-L, --list 列出选定链中的所有规则,如果未指定链,则列出所有链。可结合 -Z 原子列出和清零规则。
-S, --list-rules 打印选定链中的所有规则,如果未指定链,则打印所有链规则。
-F, --flush 清空选定链中的所有规则,如果未指定链,则清空表中的所有链。
-Z, --zero 清零链或规则中的计数器,可与 -L 选项结合以清零前查看计数器。
-N, --new-chain 创建一个新的用户定义链,名称不能与现有目标冲突。
-X, --delete-chain 删除指定的链,需确保链无引用且为空。未指定链时,会删除表中所有空链。
-P, --policy 为内置链设置默认策略,目标必须为 ACCEPTDROP
-E, --rename-chain 重命名用户定义链,对表结构无影响。
-h 显示简要命令语法说明。
-4, --ipv4 允许在一个规则文件中使用 IPv4 和 IPv6 规则;在 ip6tables-restore 中插入时会被忽略,其他情况下会报错。
-6, --ipv6 允许在一个规则文件中使用 IPv4 和 IPv6 规则;在 iptables-restore 中插入时会被忽略,其他情况下会报错。
[!] -p, --protocol 指定规则或数据包的协议。支持 tcp, udp, icmp, esp 等协议,也可使用数字值或 /etc/protocols 中的协议名称。"!" 可反转匹配条件。
[!] -s, --source 指定源地址,可是网络名、主机名、IP 地址或 IP 地址/掩码。多个地址会展开为多条规则。"!" 反转匹配条件。
[!] -d, --destination 指定目标地址,与 -s 参数的语法类似。"!" 反转匹配条件。
-m, --match 指定匹配条件模块,用于测试特定属性,模块按命令行中给出的顺序逐个评估,短路机制加速处理。
-j, --jump 指定规则的目标动作,可以是用户定义链、内置目标(如 ACCEPT, DROP),或扩展模块的目标。
-g, --goto 指定继续处理用户定义链,RETURN 将跳回调用它的链,而非当前链继续处理。
[!] -i, --in-interface 指定入站接口名,"!" 可反转匹配条件,接口名以 "+" 结尾时匹配所有以此为前缀的接口。
[!] -o, --out-interface 指定出站接口名,其他行为与 -i 参数类似。
[!] -f, --fragment 匹配 IPv4 的非首片数据包。"!" 可匹配首片或未分片的数据包,仅支持 IPv4。
-c, --set-counters 初始化规则的计数器,适用于 INSERT, APPEND, REPLACE 操作。
-v, --verbose 输出详细信息。列出命令会显示接口名、规则选项和 TOS 掩码,计数器会显示精确或带单位的值。可以指定多次来获得更详细的调试信息。
-V, --version 显示程序版本和使用的内核 API。
-w, --wait [seconds] 等待 xtables 锁以防止程序并发运行。可以无限等待或指定秒数来获得锁。
-n, --numeric 以数字格式显示 IP 地址和端口号,而非主机名或服务名。
-x, --exact 展开计数器,显示数据包和字节的确切值,而非四舍五入的单位值(如 K, M, G)。此选项仅对 -L 命令有效。
--line-numbers 列出规则时,在每条规则前添加对应的行号,方便定位规则位置。
--modprobe=command 在添加或插入规则时,用指定命令加载必要模块(如目标模块或扩展模块)。

禁用自带的firewalld,改用iptables

[root@localhost ~]# systemctl disable firewalld --now   #禁用firewalld
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #放行22号端口,避免远程连不上
[root@localhost ~]# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT	#运行自己访问自己
[root@localhost ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT	#允许已建立和相关的连接继续访问(不加上curl等程序不能正常访问外网)
[root@localhost ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT	#放开DNS服务 否则ping等很多命令用不了
[root@localhost ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT	#放开DNS服务 否则ping等很多命令用不了
[root@localhost ~]# iptables -P INPUT DROP    #设置默认拒绝其它所有进站流量
[root@localhost ~]# iptables -P FORWARD DROP    #禁止转发
[root@localhost ~]# iptables -P OUTPUT ACCEPT    #允许它访问外网

规则保存:

默认重启之后规则会自动被清空,所以需要先保存之后开机再从文件当中加载。

[root@localhost ~]# iptables-save > /etc/iptables.rules		#保存规则到文件
[root@localhost ~]# iptables-restore < /etc/iptables.rules		#从文件中加载规则

1.3 链(Chain)

在 文档中未对链做好的总结,以下做总结方便理解:

五链是数据包处理的核心机制,分别对应不同的网络流量阶段。以下是每条链的用途、典型场景及配置示例:


1.3.1. INPUT 链

  • 作用:处理进入本机的数据包(目标地址是本机 IP)。

  • 典型场景:开放本地服务端口(如 SSH、HTTP)。

  • 示例

    # 允许所有本地回环流量
    iptables -A INPUT -i lo -j ACCEPT
    
    # 允许已建立的连接和相关的流量
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    # 开放 SSH(22 端口)
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    
    # 默认拒绝其他所有入站流量(需放在最后)
    iptables -P INPUT DROP
    

1.3.2. OUTPUT 链

  • 作用:处理从本机发出的数据包(源地址是本机 IP)。

  • 典型场景:限制本机对外访问(如禁止访问某些网站)。

  • 示例

    # 允许所有本地回环流量
    iptables -A OUTPUT -i lo -j ACCEPT
    
    # 允许已建立的连接和相关的流量
    iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    # 允许访问外部 HTTP/HTTPS
    iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
    iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
    
    # 默认拒绝其他所有出站流量(需放在最后)
    iptables -P OUTPUT DROP
    

3. FORWARD 链

作用:处理经过本机转发的数据包(本机作为路由器)。

  • 典型场景:配置 NAT 或防火墙规则控制内网与外网的通信。

  • 示例

    # 启用 IP 转发(内核参数)
    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
    sysctl -p
    
    # 允许内网到外网的转发(假设 eth0 是wan接口,eth1 是lan接口)
    iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
    iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    # 默认拒绝所有转发流量(需放在最后)
    iptables -P FORWARD DROP
    

4. PREROUTING 链

  • 作用:在路由决策之前处理数据包(修改目标地址或端口)。

  • 典型场景:DNAT(端口转发)、透明代理。

  • 示例

    # 将外部访问宿主机的 8080 端口转发到内网虚拟机的 80 端口
    iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
    
    # 修改数据包的目标地址(DNAT)
    iptables -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
    

5. POSTROUTING 链

  • 作用:在路由决策之后处理数据包(修改源地址或端口)。

  • 典型场景:SNAT(源地址转换,如 NAT 上网)。

  • 示例

    # 启用 NAT(假设 eth0 是外网接口)
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    # 对特定内网网段进行 SNAT
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.202.202.202
    

规则链的协作流程

  1. 数据包进入本机
    PREROUTINGINPUT → 本机进程处理。
  2. 数据包从本机发出
    本机进程生成 → OUTPUTPOSTROUTING → 外部网络。
  3. 数据包经过本机转发
    PREROUTINGFORWARDPOSTROUTING → 目标网络。

1.4 常见案例

1.4.1 查看规则

iptables <-t 表名> -vnL:不加表名就默认是filter表。

image-20250409140228986

# 查看那nat表规则
iptables -t nat -vnL

# 查看FORWARD链规则
iptables -L FORWARD -n -v

1.4.2 添加规则

1.4.2.1 开放端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT		#开放3306端口
[root@localhost ~]# iptables -A INPUT -s 10.1.1.2 -p tcp --dport 56 -j ACCEPT 	#开放10.1.1.2进站访问56端口

image-20250409135908754

1.4.2.2 删除策略

iptables [-t 表名] -D [链] [Index]

Index是规则从上往下数,是第几条它的Index就是对应的序号。

比如我们删除1.3.2.1上添加的两条规则。

image-20250409141234887

[root@localhost ~]# iptables -t filter -D INPUT 7
[root@localhost ~]# iptables -t filter -D INPUT 6

image-20250409141435266

1.4.3 端口转发

绘图1

如图,需求为让PC:172.173.10.71访问172.173.10.71上的222端口转跳到内部192.168.122.10上的22号端口。

在转跳服务器上即中间的服务器操作:

[root@kvm ~]# iptables -t nat -A PREROUTING -d 172.173.10.71 -p tcp --dport 222 -j DNAT --to-destination 192.168.122.2:22
[root@kvm ~]# iptables -t nat -A POSTROUTING -p tcp -d 192.168.122.2 --dport 22 -j SNAT --to-source 172.173.10.71

查看:

image-20250411124258644

在PC上测试:

image-20250409145418558

posted @ 2025-04-14 14:13  国杰响当当  阅读(98)  评论(0)    收藏  举报