iptables、四表五链、用例及练习

本文详细介绍了Linux防火墙iptables的工作原理,包括其构成的四表五链,规则的添加、修改与过滤操作,以及各类协议和动作的支持。涵盖了实战用例和练习,帮助读者理解并掌握iptables的配置和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一:什么是防火墙

1、什么是防火墙

2、防火墙分类

  3、防火墙的原理

4、防火墙是通过什么过滤网络    

5、什么是表

6、什么是链

7、链的使用场景

8、表和链之间的关系

9、iptables语法格式

10、表和链之间是怎么实现网络过滤的

11、支持过滤的协议有哪些

12、支持过滤的动作

14、Iptables的模块

1、用例及练习

2、用例2


一:什么是防火墙

1、什么是防火墙

防止别人恶意入侵服务器的软件。

2、防火墙分类

从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。
    主机防火墙:针对于单个主机进行防护。
    网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
    网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。


从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
    硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
    软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

  3、防火墙的原理

通过iptables规则操作netfilter系统安全框架,从而实现对网络的安全过滤。

详细描述:
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。


Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能

所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。

4、防火墙是通过什么过滤网络    

防火墙是通过四表五链来过滤网络的。

iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。

5、什么是表

    表是具备某些具体功能的防火墙安全过滤规则。

“四表”是指 iptables 的功能,默认的 iptables规则表有 
filter 表(过滤规则表)防火墙
nat 表(地址转换规则表)network address translation网络地址转换功能;内核模块:iptable_nat
mangle(修改数据标记位规则表)、拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw(跟踪数据表规则表):关闭nat表上启用的连接追踪机制;iptable_raw

filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。
nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。
mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。
raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。


6、什么是链

    链是将表的过滤规则放置在具体的位置去执行。

“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:
INPUT(入站数据过滤)、
OUTPUT(出站数据过滤)、
FORWARD(转发数据过滤)、
PREROUTING(路由前过滤)、
POSTROUTING(路由后过滤)

防火墙规则需要写入到这些具体的数据链中。

 Linux 防火墙的过滤框架如下:

Linux命令

 如果是外部主机发送数据包给防火墙本机,数据将会经过 PREROUTING 链与 INPUT 链;如果是防火墙本机发送数据包到外部主机,数据将会经过 OUTPUT 链与 POSTROUTING 链;如果防火墙作为路由负责转发数据,则数据将经过 PREROUTING 链、FORWARD 链以及 POSTROUTING 链。
 

7、链的使用场景

流入:PREROUTING   --->   INPUT
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	
	流出:POSTROUTING  <---   OUTPUT
	<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	
	流经:PREROUTING  --->  FORWARD  --->  POSTROUTING
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 报文流向经过的链

到B网络某进程的报文:PREROUTING –> INPUT

由B网络的某进程发出报文:OUTPUT –> POSTROUTING

由B网络转发的报文:PREROUTING –> FORWARD –> POSTROUTING

 

8、表和链之间的关系


	filter : INPUT   -->  FORWARD  -->  OUTPUT
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	
	nat : PREROUTING  --> INPUT  -->  OUTPUT  -->  POSTROUTING
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	
	mangle : PREROUTING --> INPUT  --> FORWARD  --> OUTPUT  --> POSTROUTING
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	
	raw : PREROUTING  -->   OUTPUT
	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

9、iptables语法格式


iptables 命令的基本语法格式如下:

[root@liangxu ~]# iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

各参数的含义为:

-t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
COMMAND:子命令,定义对规则的管理。
chain:指明链表。
CRETIRIA:匹配参数。
ACTION:触发动作。
 

10、表和链之间是怎么实现网络过滤的

    格式:iptables -t 表名 选项 链名称 条件  动作

    -t:                   指定操作的表
    -A, --append        追加一条规则到链中
    -D, --delete        删除链中的规则
    -I, --insert        插入一条规则,插入到顶部
    -R, --replace        修改
    -L, --list            列出当前的规则
    -S, --list-rules    列出所有的规则
    -F, --flush            清空
    -Z, --zero            清空计数器(  包数量 、包大小)
    -X, --delete-chain    删除一个自定义链
    -P, --policy        指定链的默认策略  
    
    -n                    不反解
    -v                    查询更详细
    --line--number         iptables规则编号
    -p                    指定协议
    -j                    指定动作
    

参数:
	-s 源地址
	-d 目标地址
	
	--sport	源地址的端口
	--dport 目标地址的端口
	--to-ports 转发的端口

	iptables匹配规则是从上到下进行匹配的



    [root@web01 ~]# iptables -F
    [root@web01 ~]# iptables -L
    [root@master ~]# iptables -L -v -n -t nat --line-number

11、支持过滤的协议有哪些

    TCP/UDP 
    ICMP    ping协议
    ALL        所有的协议

12、支持过滤的动作

常用:

ACCEPT        将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
REJECT         拦阻该数据包,并传送数据包通知对方。
DROP         丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT    将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。


iptables 命令触发动作及各自的功能

触发动作	功 能
ACCEPT		允许数据包通过
DROP		丢弃数据包、不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,超时才会有反应。
REJECT		拒绝数据包通过、必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
DNAT		目标地址转换
SNAT		源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE	地址欺骗、是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
REDIRECT	重定向、在本机做端口映射
LOG			将数据包信息记录 syslog 曰志在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

14、Iptables的模块

multiport模块
	
		可以指定多个端口。
		
		--dports 


iprange模块
	
	匹配多个IP或者网段
	
	--src-range from[-to]:	源地址范围
    --dst-range from[-to]:	目标地址范围

string模块
	匹配数据包中包含那些字符串
        --string pattern	# 指定要匹配的字符串
        --algo {bm|kmp}		# 匹配的查询算法


time模块
	根据时间匹配报文(使用的时间是UTC)。
		--timestart hh:mm[:ss]		#  开始时间
       	--timestop hh:mm[:ss]		# 结束时间
		--monthdays day[,day...]	# 指定一个月的某一天
		--weekdays day[,day...]		# 指定周 还是  周天 

icmp模块
	--icmp-type {type[/code]|typename}
		echo-request  (8) 请求 
		echo-reply    (0) 回应


connlimit模块
       --connlimit-upto n		#  如果现有连接数小于或等于  n  则 匹配
       --connlimit-above n		#  如果现有连接数大于n 则匹配


limit模块

	# 针对 报文速率 进行限制。 秒、分钟、小时、天。
       --limit rate[/second|/minute|/hour|/day] # 报文数量
       --limit-burst number  # 报文数量(默认:5)

1、用例及练习

练习1:请说明,禁止访问B网络该怎么实现

	表:filter
	链:INPUT
iptables -t filter  -I INPUT  -s 10.10.10.10  -p ALL -j DROP

练习2:实现禁止访问本机
	iptables -t filter  -I INPUT  -p ALL -j DROP
	
	
练习3:禁止ping本机
	[root@web01 ~]# iptables -t filter -I INPUT -p icmp -j REJECT


练习3:只允许访问192.168.230.7的22端口
	iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT 
	iptables -t filter -A INPUT -p tcp -j DROP
	
练习4:只允许192.168.230.61访问192.168.230.7的80端口
	iptables -t filter -I INPUT -p tcp -s 192.168.230.61 --dport 80 -j ACCEPT
	iptables -t filter -A INPUT -p tcp --dport 80 -j DROP

练习5:要求访问192.168.230.7的8080端口转发至80端口,且只允许192.168.230.61访问192.168.230.7的8080端口
	
	iptables -t nat -I PREROUTING -p tcp -s 192.168.230.61 --dport 8080 -j REDIRECT --to-port 80
	iptables -t filter -I INPUT -p tcp --dport 8080 -s 192.168.230.61 -j ACCEPT 
	iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT 

	[root@web01 ~]# iptables -t filter -R INPUT 2 -p tcp --dport 8080 -s 192.168.230.61 -j ACCEPT 


Iptables的模块,对应联系

1、 multiport模块
	
		可以指定多个端口。		
		--dports 
	
练习6:只允许访问80, 443, 8080这三个端口,使用一条iptables规则

	iptables -t filter -I INPUT -p tcp -m multiport --dports 80,443,8080,22 -j ACCEPT
	iptabels -t filter -A INPUT -p tcp -j DROP

练习7:只允许192.168.230.61访问192.168.230.7的80和443端口
	iptables -t filter -I INPUT -p tcp -s 192.168.230.61 -m multiport --dports 80,443-j ACCEPT
	iptabels -t filter -A INPUT -p tcp -j DROP

2、 iprange模块
	
	匹配多个IP或者网段
	
	--src-range from[-to]:	源地址范围
    --dst-range from[-to]:	目标地址范围
	
练习8:禁止192.168.230.0/24网段的机器访问

	iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.230.1-192.168.230.254 -j DROP

练习9:只允许192.168.230.0/24网段的机器访问192.168.230.7的80端口
	
	iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.230.1-192.168.230.254 --dport 80 -j ACCEPT
	iptables -t filter -A INPUT -p tcp -j DROP

4、string模块
	匹配数据包中包含那些字符串
        --string pattern	# 指定要匹配的字符串
        --algo {bm|kmp}		# 匹配的查询算法

练习10 : 当数据包中包含 hello 字符的,全部不允许访问

	[root@web01 hello]# yum install httpd -y
	[root@web01 hello]# systemctl start httpd
	[root@web01 ~]# echo "hello world" > /var/www/html/1.html
	[root@web01 ~]# echo "你好 world" > /var/www/html/2.html

	[root@web01 hello]# iptables -t filter -I OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP
	
练习11:当数据包中包含 China 字符的,全部允许访问,其他的不允许。
	 iptables -t filter -I OUTPUT -p tcp -m string --string "China" --algo kmp -j ACCEPT
 	 iptables -t filter -A OUTPUT -p tcp   -j DROP

5、time模块
	根据时间匹配报文(使用的时间是UTC)。
		--timestart hh:mm[:ss]		#  开始时间
       	--timestop hh:mm[:ss]		# 结束时间
		--monthdays day[,day...]	# 指定一个月的某一天
		--weekdays day[,day...]		# 指定周 还是  周天 
练习12:要求早上8:30 —— 10:30之间不允许访问
	[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 6:30  --timestop 9:30 -j DROP

练习13:要求早上7:30 - 9:30 和 14:30 - 17:30之间不能访问,其他时段可以。
	[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 23:30 --timestop 1:30  -j DROP
	[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 6:30 --timestop 9:30  -j DROP

6、icmp模块
	--icmp-type {type[/code]|typename}
		echo-request  (8) 请求 
		echo-reply    (0) 回应

练习14:要求别人无法ping本机,但是本机可以ping别人
	[root@web01 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP

练习15:要求本机可以ping百度,只有192.168.230.61可以ping本机
	iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
	iptabels -t filter -I INPUT -p icmp -s 192.168.230.61 -j ACCEPT
	iptables -t filter -A INPUT -p icmp -j DROP

7、connlimit模块
       --connlimit-upto n		#  如果现有连接数小于或等于  n  则 匹配
       --connlimit-above n		#  如果现有连接数大于n 则匹配

练习16:只允许有2台机器同时链接本机
    yum install telnet* -y
    systemctl start telnet.socket
    
    iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-upto 2 -j ACCEPT
    iptables -t filter -A INPUT -p tcp -j DROP

练习17:只允许有1台机器同时链接本机
	yum install telnet* -y
    systemctl start telnet.socket
    
    iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-upto 1 -j ACCEPT
    iptables -t filter -A INPUT -p tcp -j DROP
   
8、limit模块

	# 针对 报文速率 进行限制。 秒、分钟、小时、天。
       --limit rate[/second|/minute|/hour|/day] # 报文数量
       --limit-burst number  # 报文数量(默认:5)

	# 1.限速:限制传输的带宽在500k左右(500 * 1000 = 500000 / 1500 = 333 包)
	[root@web01 ~]# iptables -t filter -I INPUT 1 -p tcp -m limit --limit 9000/s -j ACCEPT
	[root@web01 ~]# iptables -t filter -A INPUT -p tcp -j DROP
	
	# 2.允许10个数据报文快速通过,超过的数据报文  1/m
	[root@web01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 10  --limit 1/m -j ACCEPT
	[root@web01 ~]# iptables -t filter -A INPUT -p tcp -j DROP
	
	# 3.限制每分钟接收10个icmp的数据报文,
    [root@web01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/m -j ACCEPT
    [root@web01 ~]# iptables -t filter -A INPUT -p icmp -j DROP

# 案例
    对所有的地址开放本机的tcp(80、22、8080-9090)端口的访问
    允许对所有的地址开放本机的基于ICMP协议的数据包访问
    其他未被允许的端口禁止访问
    
        iptables -t filter -I INPUT -p tcp -m multiport  --dport 80,22,8080:9090  -j ACCEPT
        iptables -t filter -I INPUT -p icmp -j ACCEPT
        iptables -t filter -A INPUT -j DROP

用例2

规则的查看与清除
使用 iptables 命令可以对具体的规则进行查看、添加、修改和删除

1) 查看规则
对规则的查看需要使用如下命令:

[root@liangxu ~]# iptables -nvL

各参数的含义为:

-L 表示查看当前表的所有规则,默认查看的是 filter 表,如果要查看 nat 表,可以加上 -t nat 参数。
-n 表示不对 IP 地址进行反查,加上这个参数显示速度将会加快。
-v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。

【例 1】查看规则。 首先需要使用 su 命令,切换当前用户到 root 用户。然后在终端页面输入命令如下:

[root@liangxu ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
复制代码
2) 添加规则

添加规则有两个参数分别是 -A 和 -I。其中 -A 是添加到规则的末尾;-I 可以插入到指定位置,没有指定位置的话默认插入到规则的首部。

【例 2】查看当前规则。首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入命令如下:

[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination        
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

【例 3】添加一条规则到尾部。 首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:

[root@liangxu ~]# iptables -A INPUT -s 192.168.1.5 -j DROP
[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination        
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
6    DROP       all  --  192.168.1.5          0.0.0.0/0    

3) 修改规则

在修改规则时需要使用-R参数。 
【例 4】把添加在第 6 行规则的 DROP 修改为 ACCEPT。首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:

[root@liangxu ~]# iptables -R INPUT 6 -s 194.168.1.5 -j ACCEPT
[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination        
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
6    ACCEPT     all  --  194.168.1.5          0.0.0.0/0   

对比发现,第 6 行规则的 target 已修改为 ACCEPT。

4) 删除规则

删除规则有两种方法,但都必须使用 -D 参数。 
【例 5】删除添加的第 6 行的规则。首先需要使用su命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:

[root@liangxu ~]# iptables -D INPUT 6 -s 194.168.1.5 -j ACCEPT

或

[root@liangxu ~]# iptables -D INPUT 6

注意,有时需要删除的规则较长,删除时需要写一大串的代码,这样比较容易写错,这时可以先使用 -line-number 找出该条规则的行号,再通过行号删除规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值