Linux防火墙
-
- 一、概述
- 二、iptables
-
- 2.1、规则链与策略
- 2.2、工作流程
- 2.3、命令格式
- 2.4、命令参数
- 2.5、匹配标准
- 2.6、常用案例
-
- 2.6.1、检查是否安装iptables
- 2.6.2、(可选)安装iptables-persistent
- 2.6.3、查看当前规则
- 2.6.4、设置默认策略
- 2.6.5、允许特定流量
- 2.6.6、允许特定IP地址
- 2.6.7、删除规则
- 2.6.8、保存规则
- 2.6.9、还原规则
- 2.6.10、清空所有规则
- 2.6.11、查看特定链的规则
- 2.6.12、记录日志
- 2.6.13、限制连接速率
- 2.6.14、查看规则详细信息
- 2.6.15、保存和恢复规则
- 2.6.16、使用systemctl管理服务
- 2.6.17、禁止访问22端口
- 2.6.18、禁止某IP访问
- 2.6.19、禁止网段连入
- 2.6.20、允许指定网段连入
- 2.6.21、指定多个端口
- 2.6.22、匹配ICMP类型(禁止被ping)
- 2.6.23、匹配网络状态(TCP/IP连接状态)
- 2.6.24、限制并发及速率
- 2.6.25、限制并发及速率防火墙规则的保存与恢复
- 三、firewalld
一、概述
防火墙虽然有软件或硬件之分但是主要功能还是依据策略对外部请求进行过滤
,成为公网与内网之间的保护屏障,防火墙会监督每一个数据包并判断是否有相应的匹配策略规则,知道满足其中一条策略规则为止,而防火墙规则策略可以是基于来源地址、请求动作或协议来定制的,最终仅让合法的用户请求流入到内网中,其余的均被丢弃
。
在红帽RHEL7系统中firewalld服务
取代了iptables服务
,但依然可以使用iptables命令来管理内核的netfilter。其实Iptables服务Firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙规则功能的“防火墙管理工具”,将定义好的规则交由内核中的netfilter
即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的。
二、iptables
iptables命令用于创建数据过滤与NAT规则,主流的Linux系统都会默认启用iptables命令,但其参数较多且规则策略相对比较复杂。
2.1、规则链与策略
在iptables命令中设置数据过滤或处理数据包的策略叫做规则
,将多个规则合成一个链。
举例来说:小区门卫有两条的规则,将这两个规则可以合成一个规则链:
-遇到外来车辆需要登记。
-严禁快递小哥进入社区。
但是光有策略还不能保证社区的安全,我们需要告诉门卫(iptables)这个策略(规则链)是作用于哪里的,并赋予安保人员可能的操作有这些,如:“允许”,“登记”,“拒绝”,“不理他”,对应到ptables命令中则常见的控制类型有:
- ACCEPT:允许通过
- LOG:记录日志信息,然后传给下一条规则继续匹配.
- REJECT:拒绝通过,必要时会给出提示,
- DROP:直接丢弃,不给出任何回应
其中REJECT
和DROP
的操作都是将数据包拒绝,但REJECT会再回复一条“您的信息我已收到,但被扔掉了”。
而规则链则依据处理数据包的位置不同而进行分类:
- PREROUTING:在进行路由选择前处理数据包
- INPUT:处理入站的数据包
- OUTPUT:处理出站的数据包
- FORWARD:处理转发的数据包
- POSTROUTING:在进行路由选择后处理数据包
Iptables中的规则表
是用于容纳规则链
,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)
规则表的先后顺序:raw→mangle-→nat→filter
规则链的先后顺序:
- 入站顺序:PREROUTING→INPUT
- 出站顺序:OUTPUT→POSTROUTING
- 转发顺序:PREROUTING→FORWARD→POSTROUTING
还有三点注意事项:
- 没有指定规则表则默认指filter表。
- 不指定规则链则指表内所有的规则链。
- 在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。
FILTER表:
filter表 | 主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。filter表是iptables默认使用的表。这个表定义了三个链(chains)。企业工作场景:主机防火墙 |
---|---|
INPUT | 负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包 |
FORWARD | 负责转发流经主机的数据包。起转发的作用,和Nat关系很大。 |
OUTPUT | 处理所有有源地址是本机地址的数据包。通俗的将,就是处理从主机发出去的数据包。 |
NAT表:
nat表 | 负责网络地址转换,即来源与目的的ip地址和port的转换。应用:和主机本身无关。一般用于局域网共享上网或者特殊的端口转换服务相关。 NAT功能一般企业工作场景: 1.用于做企业路由(zebra)或网关(iptables),共享上完(postrouting)。 2.做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务。 3.web,单个端口的映射,直接映射80端口。 这个表定义了三个链,nat功能就相当于网络的acl控制,和网络交换机acl类似。 |
---|
MANGLE表:
mangle表 | 负责修改数据包中特殊的路由标记,如TTL、TOS、MARK等。这个表定义了五个链(chains) |
---|---|
INPUT | |
FORWARD | |
OUTPUT | |
PREROUTING | |
POSTROUTING |
RAW表:
raw表 | raw 表是 iptables 中用于处理特殊类型的数据包的表,它可以决定是否对数据包进行连接跟踪(connection tracking),即是否记录数据包的状态信息。连接跟踪是一种消耗资源的操作,如果我们想要提高性能或者避免某些问题,我们可以使用 raw 表来让某些数据包跳过连接跟踪。raw 表只包含两个链:PREROUTING 和 OUTPUT。raw 表是 iptables 中优先级最高的表,它会在其他任何表之前执行。这个表定义了2个链。 |
---|---|
PREROUTING | |
OUTPUT |
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。
所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
我们现在用的比较多个功能有3个:
- filter 定义允许或者不允许的
- .nat 定义地址转换的
- .mangle功能:修改报文原数据
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
小扩展:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
2.2、工作流程
iptables 是属于用户空间的东西,他的作用是定义规则。这些规则由处于内核态的netfilter
来读取并执行。而放在内核态的地方,必须要指定放入内核态的位置,即必须是 TCP/IP
的协议栈经过的地方。 linux 中一共有 5 个位置:
- 数据包从内核态流入用户态 input链
- 数据包从用户态流入内核态 output链
- 在内核态中:从一个接口流入另一个接口 forward链
- 进入本机的网络接口 prerouting
- 流出本机的网络接口 postrouting
chain遍历优先级:
6. 收到目的地为本机的包: prerouting -> input
7. 收到目的地为其他主机的包:prerouting -> forword -> postrouting
8. 本机产生的包:output -> postrouting
如果收到一个目的地为本机的包:首先会经过 prerouting 链上的 raw、mangle、nat 表;然后再经过 input 链上 mangle、filter、security、nat 表。最终到达本机的某个 socket
2.3、命令格式
iptables命令用于管理防火墙的规则策略,格式为:
iptables [-t table] COMMAND [chain] [CRETIRIA] [-j ACTION]
-t table 表名:可选3个 filter nat mangle
COMMAND 选项:定义如何对规则进行管理
chain 链名:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA 条件:指定匹配标准
-j ACTION 控制类型:指定如何进行处理
比如:
不允许172.16.0.0/16的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
2.4、命令参数
常用参数:
参数 | 作用 |
---|---|
-P |
设置默认策略:iptables -P INPUT (DROP | ACCEPT) |
-F |
清空规则链 |
-L |
查看规则链 |
-A |
在规则链的末尾加入新规则 |
-I num |
在规则链的头部加入新规则 |
-D num |
删除某一条规则 |
-s |
匹配来源地址IP/MASK,加叹号!表示除这个IP外 |
-d |
匹配目标地址 |
-i 网卡名称 |
匹配从这快网卡流入的数据 |
-o 网卡名称 |
匹配从这块网卡流出的数据 |
-p |
匹配协议,如tcp,upd,icmp |
-dport num |
匹配目标端口号 |
-sport num |
匹配来源端口号 |
2.4.1、链管理命令(立即生效)
-P:等价于--policy
设置默认策略的(设定默认门是关着的还是开着的)
# 默认策略一般只有两种:
iptables -P INPUT (DROP|ACCEPT) #默认是关的/默认是开的
#比如:
iptables -P INPUT DROP
#这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
-F:等价于--flush
,清空规则链的(注意每个链的管理权限)
iptables -t nat -F PREROUTING #清空nat表的PREROUTING链
iptables -t nat -F #清空nat表的所有链
-N:等价于--new
,支持用户新建一个链
iptables -N inbound_tcp_web
#表示附在tcp表上用于检查web的
-X:等价于--delete-chain
用于删除用户自定义的空链
iptables -X inbound_tcp_web
#使用方法跟-N相同,但是在删除之前必须要将里面的链给清空
-E:等价于--rename-chain
用来给用户自定义的链重命名
iptables -E oldname newname
-Z:等价于--zero
清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
iptables -Z
2.4.2、规则管理命令
-A:追加,在当前链的最后新增一个规则
iptables -A chain firewall-rule
# 允许22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-I num:插入,把当前规则插入为第几条
# 如果-I后面没有指定具体的规则链位置,那么它默认会将新规则插入到规则链的开头
iptables -A chain firewall-rule
# 允许22端口
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
-R num:Replays替换/修改第几条规则
# 允许22端口
iptables -R INPUT 3