linux下iptables命令应用及配置规则

本文内容从两个角度讲解iptables命令的应用,

  • 先梳理概念,
  • 理解后,我们从iptables的命令出发,讲解不同的应用,从而更好的理解iptables命令是什么有什么用怎么用

一.概念梳理

iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。

以下对iptables的规则使用做了总结性梳理:

iptables首先需要了解的:

1)规则概念
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作是添加,修改和删除等规则。
其中:
匹配(match):符合指定的条件,比如指定的 IP 地址和端口。
丢弃(drop):当一个包到达时,简单地丢弃,不做其它任何处理。
接受(accept):和丢弃相反,接受这个包,让这个包通过。
拒绝(reject):和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
目标(target):指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
跳转(jump):和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
规则(rule):一个或多个匹配及其对应的目标。

2)iptables和netfilter的关系:
Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。

3)iptables的规则表和链
表(tables):提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains):是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

“四表五链”其实是对用户设置规则的管理,是看待用户设置的规则的两个维度。举个例子,看图中深蓝色箭头的数据流向,数据包要到达用户层,需要经过PREROUTING链(路由前链),INPUT链(输入链),在这个链路中存放着用户设置的规则,这些规则根据功能不同又会被分组存放在RAW表、Mangle表和NAT表中。当数据包抵达PREROUTING链时,netfilter程序会依次从RAW表、Mangle表和NAT表中取出针对PREROUTING链的用户规则并执行相应操作;同理,INPUT链上的规则也会被分组存放在Mangle表和Filter表中,netfilter程序会依次从这两个表中取出针对INPUT链设置的用户规则并执行相应操作。(特别强调,转发的数据包不经过 OUTPUT 链)


其他链同理。

这里需要强调的一点是FORWARD链,它是转发链,也就是说只有在网卡个数>=2的系统中才具有的功能:开启系统转发功能后,当网络层发现数据包并非发给本机时会从另一网卡转发出去。中间经过FORWARD链,FORWARD链上的规则由Filter表、Mangle表读取操作。所以对于单网卡的系统中,上图应更改为:

https://blog.csdn.net/qq_29344757/article/details/81128150

Iptables采用“表”和“链”的分层结构,在Linux中现在是四张表五个链。下面罗列一下这四张表和五个链(注意一定要明白这些表和链的关系及作用)。

规则表:
1)filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4)Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

规则链:

1)INPUT——进来的数据包应用此规则链中的策略
2)OUTPUT——外出的数据包应用此规则链中的策略
3)FORWARD——转发数据包时应用此规则链中的策略
4)PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5)POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

**管理和设置iptables规则: **


4)iptables传输数据包的过程

1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

整理自: http://www.weixuecn.cn/article/11315.html

二.iptables的增删改查

iptables规则的修改可以类比于数据表的增删改查,-I-insert-A-append-D-delete-R-update -L-list or read-F-flush

1.查看规则

1.1 iptables -t 表名 -L

查看对应表的所有规则,-t 指定操作的表, 可省略-t,默认操作filter-L表示列出规则

1.2 iptables -t 表名 -L 链名

查看指定表的指定链中的规则

1.3 iptables -t 表名 -v -L

查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL

1.4 iptables -t 表名 -n -L

表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址

1.5 iptables --line-numbers -t 表名 -L

表示查看表的所有规则,并且显示规则的序号,--line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为--line,注意,简写后仍然是两条横杠,仍然是长选项

1.6 iptables -t 表名 -v -x -L

表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值。

实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。

iptables --line -t filter -nvxL

当然,也可以只查看某张表中的某条链,此处以filter表的INPUT链为例

iptables --line -t filter -nvxL INPUT

2.增加规则

2.1 iptables -t filter -I INPUT -s 192.168.1.146 -j DROP

命令解析:

  • -t filter 操作filter表,也可以不指定,默认filter
  • -I INPUT 将规则插入到INPUT链中,-I 表示insert rule
  • -s 192.168.1.146 匹配源ip 192.168.1.146,-s 表示source
  • -j DROP 规则动作对应为DROP,即丢弃报文,不响应信息,-j target

命令解读:操作filter表向INPUT链中插入规则,具体source 为192.168.1.146,动作为DROP.

此时我们在自己的测试机限制了146主机的访问,在146上ping测试机,ping不通。

接着我们看看通过append方式追加规则,是否生效。

执行命令:

#  iptables  -t  filter  -A  INPUT  -s  192.168.1.146  -j  ACCEPT

# -A 表示追加,append

可以在146的主机上对测试主机进行ping命令,发现ping不通,

原因分析:

1.进入 INPUT 链中的报文依次的规则处理中,由于刚开始我们用的 -I,即插入最前面的命令,而 -A 表示追加到后面,而匹配规则中,报文值匹配前面的规则,后面的就不再进行匹配,导致,追加 ACCEPT 并没有生效。

此时,我们尝试再次通过 -I命令添加规则,看看效果怎样。

执行命令:

#  iptables  -t  filter  -I  INPUT  -s  192.168.1.146  -j  ACCEPT

再次通过ping命令,146 ping 测试机成功。

通过--line命令查看规则:

# iptables  --line -vnL

iptables详解(3):iptables规则管理

我们也可以在添加规则时,指定新增规则的编号,这样我们就能在任意位置插入规则了,我们只要把刚才的命令稍作修改即可,如下。

iptables详解(3):iptables规则管理

仍然使用-I选项进行插入规则操作,-I INPUT 2表示在INPUT链中新增规则,新增的规则的编号为2。

规则的顺序很重要。

如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了,就以上图为例,报文先被第一条规则匹配到了,于是当前报文被"放行"了,因为报文已经被放行了,所以,即使上图中的第二条规则即使能够匹配到刚才"放行"的报文,也没有机会再对刚才的报文进行丢弃操作了。这就是iptables的工作机制。

3.删除规则

如果我们想要删除filter表中INPUT中的一条规则,该怎么做呢?

有两种办法:

  • 方法一:根据规则的编号去删除规则
  • 方法二:根据具体的匹配条件与动作删除规则

3.1 通过序号删除

先看看方法一,先查看一下filter表中INPUT链中的规则

iptables详解(3):iptables规则管理

假如我们想要删除上图中的第3条规则,则可以使用如下命令。

iptables详解(3):iptables规则管理

上例中,使用了-t选项指定了要操作的表(没错,省略-t默认表示操作filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则。

3.2 通过具体规则删除

我们也可以根据具体的匹配条件与动作去删除规则,比如,删除下图中源地址为192.168.1.146,动作为ACCEPT的规则,于是,删除规则的命令如下。

iptables详解(3):iptables规则管理

上图中,删除对应规则时,仍然使用-D选项,-D INPUT表示删除INPUT链中的规则,剩下的选项与我们添加规则时一毛一样,-s表示以对应的源地址作为匹配条件,-j ACCEPT表示对应的动作为接受,所以,上述命令表示删除INPUT链中源地址为192.168.1.146,动作为ACCEPT的规则。

提示

而删除指定表中某条链中的所有规则的命令,我们在一开始就使用到了,就是"iptables -t 表名 -F 链名"

-F选项为flush之意,即冲刷指定的链,即删除指定链中的所有规则,但是注意,此操作相当于删除操作,在没有保存iptables规则的情况下,请慎用。

其实,-F选项不仅仅能清空指定链上的规则,其实它还能清空整个表中所有链上的规则,不指定链名,只指定表名即可删除表中的所有规则,命令如下

iptables -t 表名 -F

不过再次强调,在没有保存iptables规则时,请勿随便清空链或者表中的规则,除非你明白你在干什么。

4.更改规则

怎样修改某条规则中的动作呢?比如,我想把如下规则中的动作从DROP改为REJECT,改怎么办呢?

iptables详解(3):iptables规则管理

我们可以使用-R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行),示例命令如下

iptables详解(3):iptables规则管理

上例中,-R选项表示修改指定的链,使用-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT,注意:上例中, -s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定)。

如果上例中的命令没有使用-s指定对应规则中原本的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为0.0.0.0/0(此IP表示匹配所有网段的IP地址),而此时,-j对应的动作又为REJECT,所以在执行上述命令时如果没有指明规则原本的源地址,那么所有IP的请求都被拒绝了(因为没有指定原本的源地址,当前规则的源地址自动变为0.0.0.0/0),如果你正在使用ssh远程到服务器上进行iptables设置,那么你的ssh请求也将会被阻断。

既然使用-R选项修改规则时,必须指明规则原本的匹配条件,那么我们则可以理解为,只能通过-R选项修改规则对应的动作了,所以我觉得,如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则,这样更好,当然,如果你只是为了修改某条规则的动作,那么使用-R选项时,不要忘了指明规则原本对应的匹配条件。

DROP vs REJECT

好了,上例中,我们已经将规则中的动作从DROP改为了REJECT,那么DROP与REJECT有什么不同呢?从字面上理解,DROP表示丢弃,REJECT表示拒绝,REJECT表达的意思好像更坚决一点,我们再次从146主机上向156主机上发起ping请求,看看与之前动作为DROP时有什么不同。

iptables详解(3):iptables规则管理

如上图所示,当156主机中的iptables规则对应的动作为REJECT时,从146上进行ping操作时,直接就提示"目标不可达",并没有像之前那样卡在那里,看来,REJECT比DROP更加"干脆"。

修改指定链的默认策略

其实,我们还可以修改指定链的"默认策略",没错,就是下图中标注的默认策略。

iptables详解(3):iptables规则管理

每张表的每条链中,都有自己的默认策略,我们也可以理解为默认"动作"。

当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,我们可以修改指定链的默认策略,使用如下命令即可。

iptables详解(3):iptables规则管理

使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。

更多case详点此链接

5.保存规则

用户修改iptables规则后,下次重启iptables或服务器,此次的修改并不会生效,所以想永久保存,得执行相关save持久化操作。

ubuntu | centos iptables操作

ubuntu

安装iptables:

sudo apt-get install iptables 

首先,保存现有的规则:

iptables-save > /etc/iptables.rules

然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:

#!/bin/bash
iptables-restore < /etc/iptables.rules

这样,每次系统重启后iptables规则都会被自动加载。
注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

cent OS

我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。

从现在开始,最好养成及时保存规则的好习惯。

centos7中,已经不再使用init风格的脚本启动服务,而是使用unit文件,所以,在centos7中已经不能再使用类似service iptables start这样的命令了,所以service iptables save也无法执行,同时,在centos7中,使用firewall替代了原来的iptables service,不过不用担心,我们只要通过yum源安装iptables与iptables-services即可(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装),在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。

此处给出centos7中配置iptables-service的步骤

#配置好yum源以后安装iptables-service
# yum install -y iptables-services
#停止firewalld
# systemctl stop firewalld
#禁止firewalld自动启动
# systemctl disable firewalld
#启动iptables
# systemctl start iptables
#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
# systemctl enable iptables

上述配置过程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables规则了。

其他通用方法

还可以使用另一种方法保存iptables规则,就是使用iptables-save命令

使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以"保存后的格式"输出到屏幕上。

所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。

iptables-save > /etc/sysconfig/iptables

我们也可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。

使用iptables-restore命令可以从指定文件中重载规则,示例如下

iptables-restore < /etc/sysconfig/iptables

再次提醒:重载规则时,现有规则将会被覆盖。

整理自:朱双印博客,www.zsythink.net

三.帮助文档

iptables v1.6.1

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain		Append to chain
  					# 追加规则
  
  --check   -C chain		Check for the existence of a rule
  --delete  -D chain		Delete matching rule from chain
  --delete  -D chain rulenum
				Delete rule rulenum (1 = first) from chain
				# 删除链中规则,通过序号删除
				
  --insert  -I chain [rulenum]
				Insert in chain as rulenum (default 1=first)
				# insert new rule into specific chain
				
  --replace -R chain rulenum
				Replace rule rulenum (1 = first) in chain
				# 更改规则,update rule
				
  --list    -L [chain [rulenum]]
				List the rules in a chain or all chains
				# 列出规则 规则=匹配+动作
				
  --list-rules -S [chain [rulenum]]
				Print the rules in a chain or all chains
  --flush   -F [chain]		Delete all rules in  chain or all chains
  				# 删除规则
  				
  --zero    -Z [chain [rulenum]]
				Zero counters in chain or all chains
  --new     -N chain		Create a new user-defined chain
  --delete-chain
            -X [chain]		Delete a user-defined chain
  --policy  -P chain target
				Change policy on chain to target
				# 指定链上规则,更改
				
  --rename-chain
            -E old-chain new-chain
				Change chain name, (moving any references)
Options:
    --ipv4	-4		Nothing (line is ignored by ip6tables-restore)
    --ipv6	-6		Error (line is ignored by iptables-restore)
[!] --protocol	-p proto	protocol: by number or name, eg. `tcp'
				# 指定匹配协议
[!] --source	-s address[/mask][...]
				source specification
				# 指定 source ip      如果有感叹号,表示除某IP之外的
				
[!] --destination -d address[/mask][...]
				destination specification
				# 指定 destination ip
				
	--sport		# 指定源端口
    
    --dport		# 指定目标端口
				
[!] --in-interface -i input name[+]
				network interface name ([+] for wildcard)
 --jump	-j target
				target for rule (may load target extension)
				# 指定相应动作,ACCEPT DROP RETURN, ETC
				
  --goto      -g chain
                              jump to chain with no return
  --match	-m match
				extended match (may load extension)
  --numeric	-n		numeric output of addresses and ports
  # source/dest 不解析成如anywhere,而是 ip/port, 或者网段
  
[!] --out-interface -o output name[+]
				network interface name ([+] for wildcard)
  --table	-t table	table to manipulate (default: `filter')
  # 指定操作的表,filter | nat | mangle | raw 
  
  --verbose	-v		verbose mode
  # 显示更多信息,如pkts,bytes,source,destination,etc
  
  --wait	-w [seconds]	maximum wait to acquire xtables lock before give up
  --wait-interval -W [usecs]	wait time to try to acquire xtables lock
				default is 1 second
  --line-numbers		print line numbers when listing
  # 显示规则编号 1,2,3,4,直接--line ubuntu也可以识别
  
  --exact	-x		expand numbers (display exact values)
  # 显示为具体的bytes大小,扩展
  
[!] --fragment	-f		match second or further fragments only
  --modprobe=<command>		try to insert modules using this command
  --set-counters PKTS BYTES	set the counter during insert/append

   -i 网卡名称     匹配从这块网卡流入的数据

   -o 网卡名称     匹配从这块网卡流出的数据

[!] --version	-V		print package version.

iptables详解:https://blog.csdn.net/u011537073/article/details/82685586

posted on 2021-01-23 14:46  进击的davis  阅读(1591)  评论(0编辑  收藏  举报

导航