防火墙简介

来源:互联网 发布:淘宝卖家上传宝贝软件 编辑:程序博客网 时间:2024/06/07 12:52

  • 防火墙简介
    • 前言
      • 防火墙的概念
      • 网络层防火墙
      • 代理服务型防火墙
    • Iptables的基本认识
    • Iptables的组成
    • Iptables的使用
      • CHAIN
      • RULE
      • 匹配条件
        • 基本匹配
        • 扩展匹配
        • 规则处理
        • 保存规则的方式
    • Firewalld
      • Firewalld zone分类
      • 预定义服务
      • Firewalld配置
      • firewall-cmd 命令选项
      • firewall-cmd 命令示例

防火墙简介

 

这里写图片描述

 

前言

 

防火墙的概念

  防火墙(Firewall)是工作在网络边缘(主机边缘),对进出网络数据包基于一定的规则检查,并在匹配某规则时由规则定义进行处理功能的组件。

  防火墙类型根据工作的层次的不同来划分,常见的防火墙工作在OSI第三层,即网络成防火墙,工作OSI第七层称为应用层防火墙,或者代理服务器(代理网关)。

网络层防火墙

  网络层防火墙又称包过滤防火墙,在网络层对数据包进行过滤,过滤的依据是系统内设置的过滤规则,被称为访问控制列表(ACL),通过检车数据流中的每一个数据的源地址,目的地址,所用端口号和协议状态等条件,或他们的组合来确定是否允许该数据包通过。优点:对用户来说透明,处理速度快且易于维护。缺点:一旦黑客吐蕃防火墙,就可以轻易地伪造数据包的源地址,目的地址和IP的端口号,即“IP地址伪造”。

代理服务型防火墙

  代理服务型防火墙将所有跨越防火墙的网络通信链路分为两段。当代理服务器接收到用户对某个站点的访问请求后会检查该请求是否符合控制跪着。如果规则允许,则代理服务器会替代用户去那个站点取回所需的信息,转发给用户。内外网用户的访问都是通过代理服务器来实现对的。从而起到了格力防火墙内外计算机系统的作用。特点:在应用对数据进行检查,比较安全。但是会增加防火墙的负载。

 

  现实生产环境中所使用的防火墙一般都是两者相结合。即先检查网络数据,通过之后再送到应用层检查。

按照分类可以分为:

  • 主机防火墙:服务范围为当前主机
  • 网络防火墙:服务范围为防火墙一侧的局域网
  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一部分能基于软件实现。
  • 软件防火墙:运用于通用硬件平台之上的防火墙的应用软件

 

Iptables的基本认识

  Netfilter组件称为内核空间,它被集成在Linux内核中。netfilter是一种内核中用于扩展各种网络服务的结构化底层框架。它是在内核中选取五个位置放了五个 hook function,而这五个 hook function 向用户开放,用户可以通过一个工具(iptables)向其写规则。

  Netfilter 主要由信息过滤表组成,包含了控制IP包处理的规则集。根据规则所处理的IP包的类型,规则被分组放在链中,从而使内核对来自某些元源和前往某些目的地或具有某些协议类型的信息包进行处理,如完成数据包的处理、控制和过滤等。

  Iptables也称为用户空间,是一个工作在用户层用来写规则的工具,写好的规则被送往netfilter。这些规则告诉内核中的netfilter组件如何去处理信息包。

 

Iptables的组成

iptables有四个表和五个链以及一些规则组成:

四个表:

表名 功能 filter 过滤规则表,该表根据管理员预定义的一组规则过滤符合条件的数据包 nat 地址转换规则表,用于nat功能(端口映射,地址映射等) mangle 修改数据标记位规则表,用于对特定数据包的修改 raw 跟踪数据规则表,有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

 
五个链:

链名 功能 INPUT 数据包进入路由表之前 OUTPUT 通过路由表后目的地为本机 FORWOARD 通过路由表后,目的地不为本机 PRERROUTING 由本机产生,向外转发 POSTROUTING 发送到网卡接口之前

 
数据包过滤匹配流程图

这里写图片描述

 

Iptables的使用

语法:

iptables [-t 表名] <-A|-I|-D|-R> 链名[规则编号][-i|-o 网卡名称] [-p 协议类型] [-s 源IP地址|源子网] [-sport 源端口号] [-d 目标IP地址|目标子网] [-dport 目标端口号]<-j 动作>

CHAIN

命令 对链进行操作 -N --new,新建一条链 -X --delete,删除一条用户自定义链(空链) -F --flush,清空一条链,默认清空表中所有链 -P --policy,定义链的默认处理策略(ACCEPT、DROP、REJECT) -E --rename,重命名自定义的未被引用的链(计数器为0)

 

RULE

命令 对规则进行操作 -L list,列出规则(常用组合-vnL)   -n:--numeric 以数字格式显示地址和端口   -v:--verbose 详细信息,-vv,-vvv   -x:--exact 显示计数器的精确值    --line-numbers 显示链上的规则的编号 -A --append 追加,在链的最后加一条规则 -I --insert 插入一条规则,默认第一个,一般使用-I CHAIN NUM 给规则加一个编号。 -R --replace 替换某条规则,规则被替换并不会改变顺序,必须要指定替换的跪着编号:-R CHAIN NUM -Z --zero 清空计数器,iptables中那个每条规则默认有两个计数器,用于记录本条规则所匹配到的数据包的个数和本条规则所匹配到的数据包的总大小 -S --selected 以iptables-save 命令的格式显示链上的规则

 

匹配条件:

基本匹配

基本匹配:netfilter 自带的匹配规则

命令 功能 -s –src,–source 匹配数据包的源地址 -d –dst,————destination 匹配数据包的目标地址 -i    –in-interface name 指定数据包的流入接口(逻辑接口),只能用于PREROUTING、INPUT和FORWARD -o –out-interface name 限制报文流出的接口,只能用于OUTPUT、FORWARD和POSTROUTING

 

扩展匹配

扩展匹配:对某一种功能的扩展,经由扩展模块引入的匹配机制

  • 隐式扩展:对某一种协议扩展
      iptables -p(--protocol) (tcp|udp|icmp|icmpv6|ah|esp|sctp|mh|all)做协议匹配

 
  TCP
   TCP隐含指明了 -m tcp 有专有选项

命令 功能 --source-port,--sport port[:port] 匹配保温中TCP首部源端口,可以是端口范围 --dport 指定目的端口 --tcp-flages (SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)指定TCP的标志位,需要两个标志位列表,如:SYN,ACK,FIN,RST,SYN第一个列表表示要检查的位,第二个列表表示第一个列表中出现的位必须为1,未出现的必须为0 --syn 只允许新连接,相当于--tcp-flags syn,fin,sck,rst,syn

 

  UDP
   UDP隐含指明了 -m udp 有专有选项

命令 功能 --sport 指定源端口,匹配报文中UDP首部的源端口,可以是范围 --dport 指定目标端口,匹配报文中UDP首部目标端口,可以是范围

 
  ICMP
   ICMP隐含指明了 -m icmp 有专有选项

命令 功能 --icmp-type echo-request,8(ping 出去,请求回应)echo-reply,0(给予回应)

 

  • 显式扩展:额外附加的更多的匹配跪着,功能性的扩展

使用帮助:
CentOS 6:man iptables
CentOS 7:man iptables-extensions
 

1.multiport扩展

以离散方式定义多端口匹配,最多指定15个端口
--source-ports,--sports port[,port|,port:port] 指定多个源端口

--destination-ports,--dports port[,port|,port:port] 指定多个目标端口

--ports port[,port|,port:port] 多个源或目标端口

示例:

从源地址172.16.0.0/16到目标地址172.16.100.10通过的tcp协议的数据包,只开放20,22,80端口允许

[root@CentOS7 ~]$iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT

 
2.iprange扩展

指明连续的(但一般不是整个网络) ip地址范围
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围

示例:

从源地址172.18.100.5-172.18.100.10这个范围内的IP,到目的地址172.16.100.10通过80端口的数据包都丢弃

[root@CentOS7 ~]$iptables -A INPUT -d 172.18.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.18.100.10 -j DROP

 
3. mac扩展

指明源MAC地址
适用于: PREROUTING, FORWARD, INPUT chains

--mac-source XX:XX:XX:XX:XX:XX

示例:

只允许源地址为172.16.0.9,MAC地址为00:0c:29:0e:4d:7c的数据包访问

[root@CentOS7 ~]$iptables -A INPUT -s 172.18.0.9 -m mac --macsource 00:0c:29:0e:4d:7c -j ACCEPT[root@CentOS7 ~]$iptables -A INPUT -s 172.18.0.9 -j REJECT

 
4.string扩展

对报文中的应用层数据做字符串模式匹配检测

--algo {bm|kmp}:字符串匹配检测算法
  bm: Boyer-Moore
  kmp: Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
--string pattern:要检测的字符串模式
--hex-string pattern:要检测字符串模式, 16进制格式

示例:

源地址172.18.25.15通过源端口20发出的数据包中,含有“google”字符就拒绝

[root@CentOS7 ~]$iptables -A OUTPUT -s 172.18.25.15 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT

 
5.time扩展

根据将报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期开始

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期结束

--timestart hh:mm[:ss] 时间开始

--timestop hh:mm[:ss] 时间结束

--monthdays day[,day...] 每个月的几号

--weekdays day[,day...] 星期几

--kerneltz:内核时区,不建议使用, CentOS7系统默认为UTC

注意: centos6 不支持kerneltz , –localtz指定本地时区(默认)

示例:

源地址172.18.0.0/16到目标地址172.18.25.15通过80端口的数据包,在每周六和周日的14:30到18:30进行丢弃操作

[root@CentOS7 ~]$iptables -A INPUT -s 172.18.0.0/16 -d 172.18.25.15 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

 
6.connlimit扩展

根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击

--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用

示例:

目的地址172.18.25.15端口22,每个IP的连接数超过2,对数据包拒绝

[root@CentOS7 ~]$iptables -A INPUT -d 172.18.25.15 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

 
7.limit扩展

基于收发报文的速率做匹配
令牌桶过滤器
--limit rate[/second|/minute|/hour|/day] 根据速率定义规则
--limit-burst number 最多匹配多少数据包

示例:

发送到目的地址172.18.25.15的ping请求回应的数据包,每分钟3个封包,最多5个,超过就拒绝

[root@CentOS7 ~]$iptables -I INPUT -d 172.18.25.15 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT [root@CentOS7 ~]$iptables -I INPUT 2 -p icmp -j REJECT

 
8.state扩展

conntrack机制:追踪本机上的请求和响应之间的关系。根据“连接追踪机制”去检查连接的状态,较耗资源。

-m state --state <NEW|ESTABLISHED|RELATED|INVALID|UNTRACKED>

状态有如下几种:

名称 状态 NEW 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 RELATED 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系 INVALID 无效的连接,如flag标记不正确 UNTRACKED 未进行追踪的连接,如raw表中关闭追踪

 

示例:

允许172.18.25.15通过20和80端口建立新的连接,并保持已有连接的通信

[root@CentOS7 ~]$iptables -A INPUT -d 172.18.25.15 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT[root@CentOS7 ~]$iptables -A OUTPUT -s 172.18.25.15 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack

调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max

不同的协议的连接追踪时长
/proc/sys/net/netfilter/

注意: CentOS7 需要加载模块: modprobe nf_conntrack

iptables 的链接跟踪表最大容量为 /proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时

解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216

(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n

 

规则处理

规则 处理动作 DROP 丢弃 REJECT 拒绝 ACCEPT 接受 RETURN 返回主链继续匹配 REDIRECT 端口重定向 MASQUERADE 地址伪装 DNAT 目标地址转换 SNAT 源地址转换 MARK 打标签 LOG 将访问记录下来

 
注意:

规则的检查次序:规则在链接上的持续即为其检查时候的生效次序,因为,优化的法则如下:
1.同类规则(同一应用),匹配范围小的放前面,用于特殊处理;
2.不同类的规则(访问不同应用),匹配范围大的放在前面;
3.应该将那些可由一条规则描述的多个规则合并为一;
4.设置默认策略。

 

保存规则的方式

CentOS 6:

service iptables saveiptables-save > /etc/sysconfig/iptablesiptables-save >/PATH/TO/FILE

CentOS 7:

iptables-save >/PATH/TO/FILEiptables -S >/PATH/TO/FILE

自动生效规则文件中的规则:

1.iptables 命令保存在脚本文件中,让脚本文件开机自动运行/etc/rc.d/rc.local;
2.用规则文件保存规则,开机自动重载命令 /etc/rc.d/rc.local 定义

恢复iptables规则命令

iptables-restore < /PATH/TO/FILE

 
 

Firewalld

  firewalld是CentOS 7.0新推出的管理netfilter的工具,firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能。firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则

归入zone顺序:

  • 先根据数据包中源地址,将其纳为某个zone
  • 纳为网络接口所属zone
  • 纳入默认zone,默认为public zone,管理员可以改为其它zone

网卡默认属于public zone,lo网络接口属于trusted zone

 

Firewalld zone分类

zone名称 默认配置 trusted  允许所有流量 home 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量 internal 和home相同 work 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量 public 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone external 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。 dmz 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量 block 拒绝除和传出流量相关的所有传入流量 drop 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

 

预定义服务

服务名称 配置 ssh Local SSH server. Traffic to 22/tcp dhcpv6-client Local DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network ipp-client Local IPP printing. Traffic to 631/udp. samba-client Local Windows file and print sharing client. Traffic to 137/udp and 138/udp. mdns Multicast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the 224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses.

 

Firewalld配置

查看预定义服务列表

firewall-cmd --get-services

/usr/lib/firewalld/services/*.xml预定义服务的配置
三种配置方法

  • firewall-config (firewall-config包)图形工具
  • firewall-cmd (firewalld包)命令行工具
  • /etc/firewalld 配置文件,一般不建议

 

firewall-cmd 命令选项

命令 功能 –get-zones 列出所有可用区域 –get-default-zone 查询默认区域 –set-default-zone=< ZONE > 设置默认区域 –get-active-zones 列出当前正使用的区域 –add-source=< CIDR >[–zone=< ZONE >] 添加源地址的流量到指定区域,如果无–zone= 选项,使用默认区域 –remove-source=< CIDR > [–zone=< ZONE >] 从指定区域中删除源地址的流量,如果无–zone= 选项,使用默认区域 –add-interface=< INTERFACE >[–zone=< ZONE >] 添加来自于指定接口的流量到特定区域,如果无–zone= 选项,使用默认区域 –change-interface=< INTERFACE >[–zone=< ZONE >] 改变指定接口至新的区域,如果无–zone= 选项,使用默认区域 –list-all [–zone=< ZONE >] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无–zone= 选项,使用默认区域 –add-service=< SERVICE > [–zone=< ZONE >] 允许服务的流量通过,如果无–zone= 选项,使用默认区域 –add-port=[–zone=< ZONE >] 允许指定端口和协议的流量,如果无–zone= 选项,使用默认区域 –remove-service=< SERVICE > [–zone=< ZONE >] 从区域中删除指定服务,禁止该服务流量,如果无–zone= 选项,使用默认区域 –remove-port=[–zone=< ZONE >] 从区域中删除指定端口和协议,禁止该端口的流量,如果无–zone= 选项,使用默认区域 –reload 删除当前运行时配置,应用加载永久配置

 

firewall-cmd 命令示例

查看默认zone

firewall-cmd --get-default-zone

默认zone设为dmz

firewall-cmd --set-default-zone=dmz

在internal zone中增加源地址192.168.0.0/24的永久规则

firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24

在internal zone中增加协议mysql的永久规则

firewall-cmd --permanent –zone=internal --addservice=mysql

加载新规则以生效

firewall-cmd --reload
原创粉丝点击