Linux 防火墙

基础知识

安全技术:
  • IDS:Intrusion Detection Systems,入侵检测系统

  • IPS:Intrusion Prevention System,入侵防御系统

  • FireWall:防火墙

防火墙概念

防火墙是作用与内网和外网之间,根据定义的策略来过滤流量的软件或者硬件。

防火墙分类

可以根据作用范围和实现逻辑分类

根据作用范围分类
  • 主机防火墙:针对于单个主机进行防护。

  • 网络防火墙:处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网

根据实现逻辑分类
  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。

  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

linux的防火墙:netfilter

netfilter组件是集成在内核中的,采用模块化设计的,工作在内核空间。

netfilter的钩子函数

钩子函数:hook(勾子) function。是系统预留的一些函数,可以允许外部用户调用钩子函数。可以通过一些工具来向这五个钩子函数中写入规则
netfilter在五个位置放了五个不同的钩子函数,

  • INPUT

  • OUTPUT

  • FORWARD

  • PREROUTING

  • POSTROUTING

image

netfilter的报文流向
  • 到本机的某进程:PREROUTING –> INPUT

  • 由本机转发的:PREROUTING –> FORWARD –> POSTROUTING

  • 由本机某进程发出的:OUTPUT –> POSTROUTING
    image

PREROUTTING:报文的总进口  POSTROUTING:报文的总出口 

linux防火墙的管理工具

  • iptables:用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包

  • firewalld:CentOS7提供的,就是基于iptables的二次开发

  • nettable:CentOS8提供的

iptables的相关概念

  • iptables由五表、五链和一些规则组成。

  • iptables中的五链对应netfilter的五个钩子函数。

优先级从高到低: security -->raw-->mangle-->nat-->filter 
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理  链:多条规则就形成了一条链  表:把具有相同功能的规则的集合叫做”表” 
五表:
  • filter:负责过滤功能,防火墙;内核模块:iptables_filter

  • nat:network address translation,网络地址转换功能;内核模块:iptable_nat

  • mangle:拆解报文,做出修改,并重新封装 的功能;iptable_mangle

  • raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度

  • security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现

表和链的关系

表是具有相同功能的链的集合。

# 查看对应链上的规则都在哪些表中:iptables -vnL -t table_name  PREROUTING 的规则可以存在于:raw表,mangle表,nat表。  INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。  FORWARD 的规则可以存在于:mangle表,filter表。  OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。  POSTROUTING 的规则可以存在于:mangle表,nat表。 

iptables中的规则

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理。

在实际的使用过程中,往往是通过”表”作为操作入口,对规则进行定义的
查看iptables的规则:
#查看iptables表的规则: iptables -t 表名 -L  #查看指定表的指定链中的规则: iptables -t 表名 -v -L 
#例如:查看filter表的所有规则 [root@CentOS8 ~]# iptables -t filter -L  -t:指定表的类型: -L:list,列出所有规则 -v:显示详细信息 -n:number,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址。 
不指定表名,默认使用的是filter这张表。 
#使用 -v 选项显示的详细信息 # pkts:对应规则匹配到的报文的个数。 # bytes:对应匹配到的报文包的大小总和。 # target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。 # prot:表示规则对应的协议,是否只针对某些协议应用此规则。 # opt:表示规则对应的选项。 #in:表示数据包由哪个接口(网卡)流入,即从哪个网卡来。 # out:表示数据包将由哪个接口(网卡)流出,即到哪个网卡去。 # source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。 # destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段 
#范例:查看filter表中的INPUT链的所有规则 root@CentOS8 ~]# iptables -t filter --line-numbers -vnL INPUT    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)    num   pkts bytes target     prot opt in     out    source    destination  # -–line-numbers:显示规则的编号 # policy表示当前链的默认策略 # packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。 # bytes表示当前链默认策略匹配到的所有包的大小总和。 

管理iptables的规则

增加规则:
#范例:拒绝10.0.0.11主机的报文 [root@CentOS8 ~]# iptables  -t filter  -I INPUT -s 10.0.0.11 -j DROP  [root@CentOS8 ~]# iptables -t filter  -L    Chain INPUT (policy ACCEPT)    target     prot opt source               destination    DROP       all  --  10.0.0.11            anywhere  # -I:insert, 插入,要指明插入至的规则编号,默认为第一条 # -j:targetname [per-target-options] 指定规则的处理动作 # -s:为source之意,表示源地址。 # -A: 表示在链的尾部追加规则,-I表示在链的首部插入规则  注意: # 1.如果报文已经被前面的规则匹配到,iptables则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。   # 2.可以在添加规则时,指定新增规则的编号,将规则添加到指定的位置 [root@CentOS8 ~]# iptables  -t filter  -I INPUT 2 -s 10.0.0.11 -j DROP  # -I INPUT 2:表示在2这个位置插入这条规则 
删除规则:
  • 方法一:根据规则的编号去删除规则

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

# 范例:删除filter表中的INPUT链上面的第一条规则 [root@CentOS8 ~]# iptables -t filter -D INPUT  1  # -D选项表示删除指定链中的某条规则,-D INPUT 1表示删除INPUT链中的第1条规则 
# 范例:删除filter表中,INPUT链上,源地址是10.0.0.11,处理动作是DROP的这条规则  [root@CentOS8 ~]# iptables -t filter  -D  INPUT -s 10.0.0.11 -j DROP 
清除所有规则
  • 清除指定链中的所有规则:iptables -t 表名 -F 链名

  • 清除指定表中的所有规则: iptables -F

#范例:清除filter表中,INPUT链上的所有规则  [root@CentOS8 ~]# iptables -t filter -F INPUT 
修改链的默认策略
# 例如:修改filter表中的INPT链的默认策略为DROP [root@CentOS8 ~]# iptables -t filter -P INPUT   DROP  # 当链中没有任何规则时,防火墙会按照默认动作处理报文 
白名单和黑名单
  • 白名单:只有指定的特定主机可以访问,其它全拒绝

  • 黑名单:只有指定的特定主机拒绝访问,其它全允许,默认方式

保存规则:

默认所做的操作是临时生效的,重启失效

#CentOS6把保存iptables规则: service iptables saeve #将规则覆盖保存至/etc/sysconfig/iptables文件中  CentOS 7,8 方法一: iptables-save > /PATH/TO/SOME_RULES_FILE iptables-restore < /PATH/FROM/SOME_RULES_FILE(在rc.local中加入这条命令) #iptables-restore:加载规则 #将规则存在一个文件,通过开机自动加载这个文件来实现。  方法二: 安装iptables.service 因为安装这个软件以后,它的/etc/sysconfig/iptables这个文件带有他自己默认的规则,通过: iptables-save > /etc/sysconfig/iptables来覆盖它默认的规则。从而实现规则的的保存。 

iptables的匹配条件

  • 基本匹配条件:直接能用的条件

  • 扩展匹配条件:需要调用对应的扩展模块

iptables的基本匹配条件
  • 源地址
  • 目标地址
  • 网卡名称
  • 协议类型
源地址和目标地址

使用-s选项来指定源地址,可以是网段或者是一台具体的主机。多个地址或者网段用逗号隔开。
使用-d选项来指定目标地址,可以是网段或者是一台具体的主机

不指定任何目标地址,则目标地址默认为0.0.0.0/0,同理,如果我们不指定源地址,源地址默认为0.0.0.0/0,0.0.0.0/0表示所有IP  只能表示离散的地址(单个地址逗号隔开),不能表示一个连续的地址(例如10.0.0.11-10.0.0.19) 
#范例:来自10.0.0.11这个设备的数据表都丢弃 [root@CentOS8 ~]# iptables -t filter -I INPUT -s 10.0.0.11 -d 10.0.0.10 -j DROP 
网卡名称

有多块网卡时,指定从那块网卡流入或者流出。

-i: 本机有多个网卡时,我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机  -o: 当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出  #-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。 
协议类型

匹配不同协议类型的数据包

使用-p参数来匹配指定的协议类型。 
#例如: 匹配到来自10.0.0.11这个设备的tcp数据包就拒绝 [root@CentOS8 ~]# iptables -t filter  -I INPUT  -s 10.0.0.11 -d 10.0.0.10 -p tcp -j REJECT 
#centos6中,-p选项支持如下协议类型: tcp, udp, udplite, icmp, esp, ah, sctp  #centos7中,-p选项支持如下协议类型: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh  #当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。 
扩展匹配条件

需要调用指定的扩展模块才能使用的匹配条件。

扩展匹配条件分为:

  • 隐式扩展:和协议名称一样的模块,使用-p执行协议类型的时候,会自动分配一个同名的模块。

  • 显示扩展:需要使用 -m 参数手动指定模板才能使用

隐式扩展

和协议同名的扩展模块:只需要使用-p选项指定协议,会自动调用同名的扩展模块。

  • tcp

  • udp

  • icmp

tcp 协议的扩展选项:

[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围 #[!] 表示可以取反  [!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围 
#范例:拒绝外来报文的目标端口为本机的22号端口 [root@CentOS8 html]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j  DROP  #注意 1.-m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件  2.使用 -p 指定报文协议,但是没有使用 -m 指定扩展模块时,会默认使用和协议名称相同的模块  3.连续的端口表示方法: num1:num2 

udp 协议的扩展选项:

[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围  [!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围 

icmp 协议的扩展选项:

ICMP协议:Internet Control Message Protocol,翻译为互联网控制报文协议,它主要用于探测网络上的主机是否可用,目标是否可达,网络是否通畅,路由是否可用等 
[!] --icmp-type {type[/code]|typename}  type/code  0/0   echo-reply icmp应答  8/0   echo-request icmp请求  使用 –icmp-type 表示根据具体的type与code去匹配对应的icmp报文  ping回应报文,它的type为0,code也为0  ping请求报文对应的type为8,code为0 
#范例:禁止所有icmp类型的报文进入本机 [root@CentOS8 ~]# iptables -t filter  -I INPUT  -p icmp -j REJECT 
#范例:实现能ping通别人,但是不想让别人ping通我们 [root@CentOS8 ~]# iptables -t filter  -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT  –icmp-type 8/0 表示icmp报文的type为8,code为0才会被匹配到,也就是只有ping请求类型的报文才能被匹配到  我们之所以能够ping通别人,是因为别人回应我们的报文的icmp type为0,code也为0,所以无法被上述规则匹配到,所以我们可以看到别人回应我们的信息 
显式扩展模块
  • multiport:可以指定离散的端口号,使用逗号隔开

  • iprange:指定一个连续的ip地址范围

  • mac

  • string:匹配含有指定字符串的报文

  • time:匹配指定时间段的报文

  • connlimit

  • limit

  • state

iprange扩展模块:

两个扩展匹配条件:  –src-range:  –dst-range  #例如: [root@CentOS8 html]# iptables -t filter  -I INPUT -m iprange --src-range 10.0.0.10-10.0.0.13 -j DROP 

string模块:

常用扩展匹配条件:  –algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。  –string:指定需要匹配的字符串 
#例如: #含有hello1这个字符串的报文就丢弃掉 [root@CentOS8 html]# iptables -t filter  -I INPUT -m  string --algo bm --string "hello1" -j DROP  #范例:禁止访问谷歌 iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm  --string "google" -j REJECT 

time模块:根据将报文到达的时间与指定的时间范围进行匹配
(注意:CentOS 8 此模块有问题)

#常用扩展匹配条件如下: –timestart:用于指定时间范围的开始时间,不可取反  –timestop:用于指定时间范围的结束时间,不可取反  –weekdays:用于指定”星期几”,可取反  –monthdays:用于指定”几号”,可取反  –datestart:用于指定日期范围的开始日期,不可取反  –datestop:用于指定日期范围的结束时间,不可取反 
#范例:每天早上9点到下午6点不能看网页 [root@CentOS8 html]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT 

connlimit扩展模块:限制每个IP地址同时链接到server端的链接数量

–connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。  –connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制 
#范例:限制每个ip地址(客户端)只能开启两个ssh连接到service iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 

state扩展模块:用来识别报文是主动发出去的还是被动接收的。

state连接的概念:两台机器能进行正常的通信就算建立了连接。 

state连接的状态:

NEW:连接中的第一个包,状态就是NEW,  ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。  RELATED:有关系的报文  INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID  UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接 
#范例:实现只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙  [root@centos8 ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT   [root@centos8 ~]#iptables -A INPUT -m state --state NEW -j REJECT 

iptables自定义链

target相关概念

target:iptables中的动作,报文被规则匹配到以后,target能是一个”动作”,target也能是一个”自定义链”,当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理

自定义链:用来解决多条规则的情况下,方便我们对不用服务的规则进行管理。

自定义链并不能直接使用,而是需要被默认链引用才能够使用 
创建自定义链

使用 -N 选项可以创建自定义链。

自定义链并不能直接使用,而是需要被默认链引用才能够使用

#范例:创建一个叫做IN_WEB的自定义链 [root@CentOS8 ~]# iptables -t filter  -N IN_WEB  [root@CentOS8 ~]# iptables -vL -t filter  Chain INPUT (policy ACCEPT 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination  Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination  Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination  Chain IN_WEB (0 references)  pkts bytes target     prot opt in     out     source               destination   #自定义链的引用计数为0 (0 references),也就是说,这条自定义链还没有被任何默认链所引用,所以,即使IN_WEB中配置了规则,也不会生效 

在自定义链中配置规则

#范例:实现别的主机不能ping通本机 [root@CentOS8 ~]# iptables -t filter  -I IN_WEB -p icmp --icmp-type 8/0 -j REJECT   #因为没有在默认链里面引用自定义规则,所以配置的规则不生效。 
引用自定义的规则
[root@CentOS8 ~]# iptables -t filter  -I INPUT -j IN_WEB  #自定义链在哪里创建,应该被哪条默认链引用,取决于实际的工作场景,因为此处示例的规则是匹配入站报文,所以在INPUT链中引用自定义链  #IN_WEB链的引用计数已经变为1,表示这条自定义链已经被引用了1次,自定义链还可以引用其他的自定义链 
修改自定义的链名

-E”选项可以修改自定义链名

删除自定的链

”-X”选项可以删除自定义链,但是删除自定义链时,需要满足两个条件:

1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。

2、自定义链中没有任何规则,即自定义链为空。

商匡云商
Logo
注册新帐户
对比商品
  • 合计 (0)
对比
0
购物车