零基础快速了解掌握Linux防火墙-Iptables

一、 Iptables概述

Iptables 是一个用户空间程序,可以用于设置和管理 Linux 操作系统的内核级防火墙。它通过表、链和 规则组成,可以灵活地根据不同的需求进行配置。

iptables 具有以下特点:

Iptables 作为内核级别的防火墙,具有高效、稳定、安全等优点。

Iptables 的表、链、规则结构非常灵活,可适应各种不同的网络环境和应用场景。

Iptables 相对于其他防火墙工具而言比较容易学习和掌握,并且拓展性非常强。

二、 Iptables 组成

Iptables 的核心是由表(table)、链(chain)和规则(rule)三部分组成的。

表(Table)

在 iptables 中,表是一个规则的集合,每个表都包含若干个链和一些相关的规则。常用的五种 table 如 下:

  • raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。
  • mangle表:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING。
  • nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链, OUTPUT、PREROUTING、POSTROUTING。
  • filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、 FORWARD、OUTPUT。

表之间的优先级

数据包到达防火墙时,规则表之间的优先顺序 raw > mangle > nat > filter

链(Chain)

在 iptables 中,链是一个规则的集合,每个链都包含一些相关联的规则。

  • INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规 则。
  • PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,用来修改目的地址,如 DNAT。
  • POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,用来修改源地址,如 SNAT。

链表对应关系

数据包过滤的匹配流程

  • 入站

入站数据包从A网络发到B网络,首先发到防火墙,先后顺序经过有PREROUTING链的三个表(raw、 mangle、nat),如果都是放通状态的会经过路由选择,然后根据目的地址一层一层往上送,经过有 INPUT的两个表(mangle、filter),一直送到应用程序。

  • 转发

目的地不是本机,数据包先从A网络过滤,经过PREROUTING链,看是否是自己的目的地址,如果是外网 到内网需要用nat转换成内网IP,找到内网用户,经过FORWARD链进行过滤,允许放通的到达 POSTROUING链,再把内网地址转换成公网,这样数据包才能回去;如果是内网往外网发顺序就是反过 来。

  • 出站

从本机的应用程序发出来, 经过路由选择,让路由知道从哪里发,先后顺序经过有OUTPUT链的四个表 (raw、mangle、nat、filter),都放通后到达POSTROUING链的两个表(mangle、nat),如果没有 什么转换地址,就出站。

  • 总结

当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送 出去。

如果数据包是进入本机的,数据包就会沿着图向上移动,到达INPUT链。数据包到达INPUT链后, 任何 进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后发送出去。

如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达 POSTROUTING链输出。

规则匹配策略

自上而下进行顺序匹配,匹配到即停止,不会再去查看下面的规则,然后根据允许或者丢弃或者拒绝等 规则进行数据包的处理!!!

三、 Iptables防火墙配置

iptables命令

语法 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

注意:链名必须大写;控制类型必须大写

|----|-----------------------------|
| 选项 | 作用 |
| -t | 指定表名(raw、mangle、nat、filter) |
| -j | 指定控制类型 |

常用管理选项

常用控制类型

匹配条件

命令操作

添加新的规则

java 复制代码
##-A 在filter表的INPUT链末行添加拒绝icmp的规则
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
##-I 不指定行,是在指定链首行插入规则(允许tcp 22端口)
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
##-I 指定行,是在指定链的指定行上插入规则
[root@localhost ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT

查看规则

java 复制代码
##查看指定表的规则(不加链名显示所有链的所有规则)
[root@localhost ~]# iptables -t filter -L
##-nL 以数字形式显示
[root@localhost ~]# iptables -t filter -nL
##-nvL 以数字形式显示,并显示详细信息
[root@localhost ~]# iptables -t filter -nvL
                                          
##--line-numbers 显示规则序号(指定链名,就显示指定链的规则)
[root@localhost ~]# iptables -t filter -nvL INPUT --line-numbers
编号 包数量 大小 规则 协议 选项 入站网卡 出站网卡 源地址 目的地址 
条件
num   pkts bytes target     prot opt in     out     source               
destination   


1        2   168 ACCEPT     icmp -- *     *       192.168.1.250       
 0.0.0.0/0           
2        9   844 REJECT     icmp -- *     *       0.0.0.0/0           
 0.0.0.0/0           reject-with icmp-port-unreachable
3        9  2041 ACCEPT     tcp  -- *     *       192.168.1.250       
 0.0.0.0/0           tcp dpt:22
4      346 24461 ACCEPT     tcp  -- *     *       192.168.1.252       
 0.0.0.0/0           tcp dpt:22
5       31  2548 REJECT     tcp  -- *     *       0.0.0.0/0           
 0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable
      

删除规则

注意

若规则列表中期多条相同的规则时,按内容匹配只删除的序号最小的一条

按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错 按内容匹配删数时,确保规则存在, 否则报错

java 复制代码
##根据规则序号删
[root@localhost ~]# iptables -D INPUT 3
##根据规则内容删(相当于操作一遍创建指定规则的步骤加上-D选项删除)
[root@localhost ~]#iptables -D INPUT -p icmp -j REJECT
##有相同的规则会删除第一个
[root@localhost ~]#iptables -nL
[root@localhost ~]#iptables -D INPUT -p tcp --dport 22 -j ACCEPT

清空规则

**注意

-F仅仅是清空链中的规则,并不影响-Р设置的默认规则,默认规则需要手动进行修改**

**-P设置了默认规则为DROP后,使用-F一定要小心,因为iptables的修改是立刻生效的! 防止把允许远程连

接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决**

如果不写表名和链名,默认清空filter表中所有链里的所有规则

java 复制代码
##清空指定链中所有规则
[root@localhost ~]# iptables -F OUTPUT
##不指定链名默认清空所有规则
[root@localhost ~]# iptables -F

修改规则

java 复制代码
##-R 修改已有的规则
[root@localhost ~]# iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
##-P 修改默认策略(修改为丢弃转发数据包)
[root@localhost ~]# iptables -P FORWARD DROP

四、 规则的匹配

1、通用匹配

可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件。

java 复制代码
##(使用!取反)不是icmp协议的其他数据包全部接受
##虽然不是icmp包都接受,但是没有指定icmp包的规则,所以icmp包默认还是接受的
[root@localhost ~]# iptables -A INPUT ! -p icmp -j ACCEPT
##将指定主机192.168.116.20的数据包丢弃
[root@localhost ~]# iptables -A INPUT -s 192.168.116.20 -j DROP
##拒绝指定网段的数据包从ens33网卡进入
[root@localhost ~]# iptables -I INPUT -i ens33 -s 192.168.110.0/24 -j REJECT

2、隐含匹配

某些条件,如端口、TCP标记、ICMP类型,隐含要求以特定的协议匹配作为前提。

  • 协议端口匹配

--sport 和 --dsport 必须配合 -p 指定协议使用!!!

详细用法

java 复制代码
##允许tcp的20和21端口通过(即允许ftp数据包)
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
##丢弃192.168.11.0网段转发的tcp 24000到24500 端口的数据包
[root@localhost ~]# iptables -I FORWARD -d 192.168.11.0/24 -p tcp --dport 
24000:24500 -j DROP

tcp标记匹配 [了解]

--tcp-flags 配合 -p tcp 使用,指定tcp标记(SYN、ACK、RST、URG、PSH、FIN)

java 复制代码
##丢弃SYN请求包,允许其他指定的数据包
[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -j 
ACCEPT
##SYN,RST,ACK SYN 前面指定包范围,空格后再指定
##表明前面指定的里面,除了这空格后面的SYN,其他都放行
##tcp三次握手第一次接受SYN,拒绝其他,第二次发送SYN和ACK
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 --tcp-flags 
SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
[root@localhost ~]# iptables -I OUTPUT -p tcp --dport 22 --tcp-flags 
SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

ICMP类型匹配

--icmp-type 配合 -p icmp 使用,指定icmp类型(字符串或数字代码)

icmp类型可用iptables -p icmp -h 查看帮助信息

java 复制代码
##丢弃icmp请求包(使别人不能ping通本机,但本机默认情况可以ping通别人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
##丢弃icmp回显包(本机发送ping请求,但是别人回显的包被本机丢弃,默认情况下本机不能ping通别
人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j DROP
##当ping不通时,允许显示目标不可达
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

3、显式匹配

要求以 -m (扩展模块)的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。

多端口匹配

-m multiport --sport 源端口列表

-m multiport --dport 目的端口列表

java 复制代码
##允许tcp的20,21,22,53端口
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,22,53 
-j ACCEPT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 
20,21,22,53
##允许udp的53,67,68端口
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j 
ACCEPT

ip范围匹配

-m iprange --src-range 源IP范围

-m iprange --dst-range 目的IP范围

java 复制代码
##禁止转发源ip范围是192.168.10.100-192.168.10.200的udp数据包
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 
192.168.10.100-192.168.10.200 -j DROP
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DROP       udp  --  0.0.0.0/0            0.0.0.0/0            source IP range 
192.168.1.1-192.168.1.10 
##禁止发送目的ip范围是192.168.10.100-192.168.10.200的udp数据包
[root@localhost ~]# iptables -A INPUT -p udp -m iprange --dst-range 
192.168.10.100-192.168.10.200 -j DROP

mac地址匹配【了解】

-m mac --mac-source 源MAC地址

状态匹配【了解】

-m state --state 连接状态

常见的连接状态

java 复制代码
##第一个包我只看22端口的包(-p tcp是隐含匹配,可以省略-m tcp)
[root@localhost ~]# iptables -I INPUT -m state --state NEW -m tcp -p tcp --
dport 22 -j ACCEPT
##允许放通tcp和udp的这些端口号
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 
443,80,22,21,20,53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53 -j 
ACCEPT
##使已建立连接的包以及该链接相关的包允许通过
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state 
ESTABLISHED,RELATED -j ACCEPT
##默认策略设为drop,以上所有配置就成了一个tcp相关包的白名单,通过第一步的检测后允许相关包
通过
[root@localhost ~]# iptables -P INPUT DROP

五、Iptables配置NAT地址转换

1、 配置SNAT

应用场景

局域网主机共享转换的公网ip接入internet公网(内 --> 外)

模拟实验环境

私网客户端一台、网关服务器一台(设置iptables防火墙)、外网web服务端(有httpd服务) 三台都需要关闭默认防火墙firewalld和selinux 准备私网客户端:设置网卡网段为192.168.1.0/24;ip设为192.168.1.1;网关设为 192.168.1.254。 准备网关服务器:一个网卡设为192.168.1.0/24网段,并设置ip为192.168.1.254;另一个网卡设为 10.0.0.0/8网段,并设置ip为10.0.0.100;添加路由转发功能;下载 iptables-services 并开始 iptables之后做防护墙策略。 准备外网web服务端:设置网卡网段为10.0.0.0/8;ip设为10.0.0.1;下载并开启httpd服务。

转换为固定公网ip

java 复制代码
iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to 转换的公网地址
iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to-source 转换的公
网地址范围(如10.0.0.1-10.0.0.10)
注:每一个做转换的公网ip,一般可以支持内网100~200台主机。
java 复制代码
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 
-j SNAT --to 10.0.0.100
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 
-j SNAT --to-source 10.0.0.1 10.0.0.10

转换为非固定的公网ip(动态)

iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j MASQUERADE

java 复制代码
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j 
MASQUERADE

2、配置DNAT

应用场景

在internet公网中发布位于企业局域网的服务器(外 --> 内)

模拟实验环境

网客户端一台(有httpd服务)、网关服务器一台(设置iptables防火墙)、外网web服务端 三台都需要关闭默认防火墙firewalld和selinux 可参考上个模拟场景,再为私网主机增设httpd服务使之成为私网web服务端,将原来的外网主机当做客户 端。 为私网主机添加httpd服务并启用

转换为私网ip

iptables -t nat -A PREROUTING -i 连接外部网络的接口名称 -d 外部接口IP地址 -p tcp - -dport 发布的端口号 -j DNAT --to-destination 服务器内部网络地址:服务实际端口号

java 复制代码
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.100 -p 
tcp --dport 80 -j DNAT --to-destination 192.168.1.2

六、iptables防火墙策略的备份和恢复

iptables的配置存放在/etc/sysconfig/iptables 文件中,我们对iptables所做的策略修改,虽然会立刻生 效,但是并没有保存下来,当我们重启iptables防火墙时,会读取配置文件中设置的策略,我们之前修改 过的策略便失效了。所以需要对修改的iptables策略进行备份和恢复。

iptables-save > 备份文件 将修改的iptables策略导入到备份文件中

iptables-restore < /opt/iptables.bak 将备份文件中的策略还原到配置文件中

systemctl restart iptables.service 重启服务生效

java 复制代码
##查看配置文件中的默认策略
[root@localhost opt]#cat /etc/sysconfig/iptables-config
##使用iptables -nL查看修改过的策略
[root@localhost opt]#iptables -nL
##对自定义的iptables策略做备份(将命令导入一个备份文件iptables.bak)
[root@localhost opt]# iptables-save > /opt/iptables.bak
[root@localhost opt]# cd /opt
[root@localhost opt]# cat iptables.bak
##重启服务(用作模拟未保留修改的策略),再查看发现策略又恢复成了配置文件中的默认策略
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
##将备份文件中的策略恢复到配置文件中,再重启服务就还原成功了
[root@localhost opt]# iptables-restore < /opt/iptables.bak
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
相关推荐
树℡独5 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
嵩山小老虎5 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模6 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324476 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler6 小时前
buildroot System configuration
java·服务器·数据库
津津有味道6 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.7 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
Genie cloud7 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
一只自律的鸡7 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)8 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考