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
我们也可以在添加规则时,指定新增规则的编号,这样我们就能在任意位置插入规则了,我们只要把刚才的命令稍作修改即可,如下。
仍然使用-I选项进行插入规则操作,-I INPUT 2表示在INPUT链中新增规则,新增的规则的编号为2。
规则的顺序很重要。
如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了,就以上图为例,报文先被第一条规则匹配到了,于是当前报文被"放行"了,因为报文已经被放行了,所以,即使上图中的第二条规则即使能够匹配到刚才"放行"的报文,也没有机会再对刚才的报文进行丢弃操作了。这就是iptables的工作机制。
3.删除规则
如果我们想要删除filter表中INPUT中的一条规则,该怎么做呢?
有两种办法:
- 方法一:根据规则的编号去删除规则
- 方法二:根据具体的匹配条件与动作删除规则
3.1 通过序号删除
先看看方法一,先查看一下filter表中INPUT链中的规则
假如我们想要删除上图中的第3条规则,则可以使用如下命令。
上例中,使用了-t
选项指定了要操作的表(没错,省略-t默认表示操作filter表),使用-D
选项表示删除指定链中的某条规则,-D INPUT 3
表示删除INPUT链中的第3条规则。
3.2 通过具体规则删除
我们也可以根据具体的匹配条件与动作去删除规则,比如,删除下图中源地址为192.168.1.146,动作为ACCEPT的规则,于是,删除规则的命令如下。
上图中,删除对应规则时,仍然使用-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,改怎么办呢?
我们可以使用-R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行),示例命令如下
上例中,-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时有什么不同。
如上图所示,当156主机中的iptables规则对应的动作为REJECT时,从146上进行ping操作时,直接就提示"目标不可达",并没有像之前那样卡在那里,看来,REJECT比DROP更加"干脆"。
修改指定链的默认策略
其实,我们还可以修改指定链的"默认策略",没错,就是下图中标注的默认策略。
每张表的每条链中,都有自己的默认策略,我们也可以理解为默认"动作"。
当报文没有被链中的任何规则匹配到时,或者,当链中没有任何规则时,防火墙会按照默认动作处理报文,我们可以修改指定链的默认策略,使用如下命令即可。
使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP。
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程