Linux防火墙及安全策略的配置
防火墙配置
- 课程知识点
- iptables防火墙配置
- firewalld防火墙配置
- 技术目标
- 掌握iptables防火墙的配置方法
- 掌握firewalld防火墙的配置方法
- 课程内容
# systemctl stop firewalld
# systemctl disable firewalld
# yum install iptables-services
# systemctl start iptables.service
# systemctl status iptables.service
# iptables -L 查看filter表中的规则
一、iptables防火墙
1.1 iptables简介
早期的Linux系统采用过ipfwadm作为防火墙,但在2.2.0核心中被ipchains所取代。Linux 2.4版本发布后,netfilter/iptables信息包过滤系统正式使用。Netfilter/iptables IP数据包过滤系统实际由netfilter和iptables两个组件构成。Netfilter是集成在内核中的一部分,它的作用是定义、保存相应的规则。而iptables是一种工具,用以修改信息的过滤规则及其他配置。用户可以通过iptables来设置适合当前环境的规则,而这些规则会保存在内核空间中。
对于Linux服务器而言,采用netfilter/iptables数据包过滤系统,能够节约软件成本,并可以提供强大的数据包过滤控制功能,iptables是理想的防火墙解决方案。
五元组是通信术语。通常是指源IP地址,源端口,目的IP地址,目的端口和传输层协议
1.2 iptables规则表、链结构
四表五链
(1)默认的4个规则表
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标ip地址或端口
filter表:确定是否放行该数据包(过滤)
(2)默认的5种规则链:
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包
其中input、output链主要用在“主机型防火墙”中,主要针对服务器本机进行保护;
而FORWARD\POSTROUTING\PREROUTING多用在“网络型防火墙”中,如使用Linux防
火墙作为网关服务器,在公司内网与Ineternet之间进行安全控制。
1.3 iptables语法格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作]
1.3.1注意事项
不指定表名时,默认表示filter表
不指定链名时,默认表示该表内所有链
除非设置规则链的缺省策略,否则需要指定匹配条件
1.3.2 常用的管理选项
-A 在链尾追加一条新的规则
-I 在指定位置(或链首)插入一条新的规则
-P 设置指定链的默认策略
-L 列表查看各条规则信息
-D 删除指定位置或内容的规则-F:清空规则链内的所有规则
-h 查看iptables命令的使用帮助
1.3.3 条件匹配
(1) 通用匹配:
可直接使用。不依赖于其他的条件或扩展模块;
包括网络协议、IP地址、网络接口等匹配方式。
(2)协议匹配
使用“-p协议名”的形式;
协议名可使用在“letc/protocols”文件中定义的名称;
常用的协议包括tcp、 udp、icmp等。
(3)地址匹配
使用“-s源地址”、“-d目标地址”的形式;
地址可以是单个IP地址、网络地址(带掩码长度)。
(4)接口匹配
使用“-i网络接口名”、“-o网络接口名”的形式,分别对应接收、发送数据包的网络接口。
(5) 隐含条件匹配
一般以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等匹配方式。
• 端口匹配
使用“--sport源端口”、“--dport目标端口”的形式;
采用“端口1:端口2"”的形式可以指定一个范围的端口。
• TCP标记匹配
使用“--tcp-flags检查范围被设置的标记”的形式;
如“--tcp-flags sYN,RST,ACK SYN"表示检查SYN、RST、ACK这3个标记,只有SYN为1时满 足条件。
• ICMP类型匹配
使用“--icmp-type ICMP类型”的形式;
ICMP类型可以使用类型字符串或者对应的数值,例如Echo-Request、Echo-Reply。
(6)显式条件匹配
需要使用“-m扩展模块”的形式明确指定匹配方式。
• MAC地址匹配
使用“-m mac”结合“--mac-source MAC地址”的形式
• 多端口匹配
使用“-m multiport"”结合“--sports源端口列表”或者“--dports目标端口列表”的形式
多个端口之间使用逗号“,”分隔,连续的端口也可以使用冒号“:”分隔。
• IP地址范围匹配
使用“-m iprange”结合“--src-range源IP范围”或者--dst-range目标IP范围”的形式
以“-”符号连接起始P地址、结束IP地址
1.3.4 目标动作
ACCEPT:放行数据包
DROP:丢弃数据包
REJECT:拒绝数据包
SNAT:修改数据包的源地址信息
DNAT:修改数据包的目标地址信息
1.3.5 保存防火墙规则
保存规则集:# service iptables save
备份规则集:# iptables-save > /etc/iptables-save
恢复规则集:# iptables-restore < /etc/iptables-save
1.4 iptables基本配置案例
(1)查看的是fileter表中的信息,并显示行号
# iptables -L --line-number
# iptables -L INPUT --line-number
(2)没有-t 指定表名,默认清空fileter表中的信息
# iptables -F
(3)在链首追加一条规则
# iptables -t filter -I INPUT -d 192.168.181.151 -p tcp --dport 80 -j ACCEPT
(4) 在第一个位置插入一条规则
# iptables -I INPUT -s 192.168.10.1 -d 192.168.10.132 -p tcp --dport 22 -j ACCEPT
(5) 在第5条规则前插入一条规则
# iptables -t filter -I INPUT 5 -d 192.168.181.151 -p tcp --dport 22 -j REJECT
(6)删除INPUT链中的第一条规则
# iptables -D INPUT 1
(7)设置默认策略为拒绝所有连接
# iptables -P INPUT DROP
(8)设置默认策略为允许已建立的规则进行连接
# iptables -P INPUT ACCEPT
(9)查看帮助信息
# iptables -h
(10)查看iptables手册
# man iptables
(11)拒绝192.168.0.1访问web服务
# iptables -A INPUT -s 192.168.0.1 -p tcp --dport 80 -j REJECT
(12)拒绝192.168.0.0/24ping通服务器
# iptables -A INPUT -s 192.168.0.0/24 -p icmp -j REJECT
(13)允许192.168.1.0/24访问服务器的21与80端口
# iptables -A INPUT -s 192.168.1.0/24 -m multiport -p tcp --dports 21,80 -j ACCEPT
1.5 iptables网络配置案例
案例一:DNAT配置
DNAT:目标地址转换,通常指公有地址转换为私有地址,(外网数据发往内网的数据)
对应的链是prerouting(路由规则前的动作)
假如某公司需要Internet接入,由ISP分配IP地址202.112.113.112。采用iptables作为NAT服务器接入网络,内部采用192.168.1.0/24地址,外部采用202.112.113地址。为确保案例需要配置防火墙功能,要求内部web服务器192.168.1.100通过端口映射方式对外提供服务。如下图所示:
局域网内的web服务器192.168.1.100
Linux网关服务器:ens33:202.112.113.112 ens37:192.168.1.1
Inetrnet中的客户机:202.113.111
推荐实现步骤:
(1)确认已开启网关的路由转发功能
# sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/sysctl.conf
# sysctl -p
(2)添加使用DNAT策略的防火墙规则
# iptables -t nat -I PREROUTING -i eth0 -d 202.112.113.112 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100 --dport 80
案例二:SNAT配置
SNAT:源地址转换,通常指私有地址转换为公有地址,(内部数据发往外网的数据)对应的链是postrouting(路由规则后的动作)。
推荐实现步骤:
(1)确认已开启网关的路由转发功能
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/' /etc/sysctl.conf
sysctl -p
(2)添加使用SNAT策略的防火墙规则
# iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 172.16.100.20
二、firewalld防火墙
firewalld防火墙是CentOS7版本系统默认的防火墙管理工具,取代了之前的iptables防火墙,与iptables防火墙一样也属于典型的包过滤防火墙或称之为网络层防火墙,firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfilter这一强大的网络过滤子系统(属于内核态)以实现包过滤防火墙功能。firewalld防火墙最大的优点在于支持动态更新以及加入了防火墙的“Zone”概念,firewalld防火墙支持IPV4和IPV6地址。可以通过字符管理工具firewall-cmd和图形化管理工具firewall-config进行管理。
2.1 区域的概念
firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后要所数据包的源IP地址或传入的网络接口条件等将流量传入相应区域。每个区域都定义了自己打开或关闭的端口服务列表。其中默认区域为public区域,trusted区域默认允许所有流量通过,是一个特殊的区域。
区域名称 | 默认配置说明 |
Trusted | 允许所有的传入流量 |
Home | 允许与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝 |
Internal | 默认值时与home区域相同 |
Work | 允许与ssh、ipp-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝 |
Public | 允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。 |
External | 允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将经过此区域转发的IPv4地址传出流量进行地址伪装。 |
Dmz | 允许与ssh预定义服务匹配的传入流量,其余均拒绝。 |
Block | 拒绝所有传入流量 |
Drop | 丢弃所有传入流量 |
用户可以根据具体环境选择使用区域。管理员也可以对这些区域进行自定义,使其具有不同的设置规则。
在流量经过防火墙时,firewalld防火墙会对传入的每个数据包进行检查,如果此数据包的源地址关联到特定的区域,则会应用该区域的规则对此数据包进行处理,如果该源地址没有关联到任何区域,则将使用传入网络接口所在的区域规则进行处理。如果流量与不允许的端口、协议或者服务匹配,则防火墙拒绝传入流量。
2.2 字符管理工具
firewall-cmd是firewalld防火墙自带的字符管理工具,可以用来设置firewalld防火墙的各种规则,需要注意的是firewalld防火墙规则分为两种状态,一种是runtime(正在运行生效的状态),在runtime状态添加新的防火墙规则,这些规则会立即生效,但是重新加载防火墙配置或者重启系统后这些规则将会失效;一种是permanent(永久生效的状态),在permanent状态添加新的防火墙规则,这些规则不会马上生效,需要重新加载防火墙配置或者重启系统后生效。
在使用firewall-cmd命令管理防火墙时,需要添加为永久生效的规则需要在配置规则时添加--permanent选项(否则所有命令都是作用于runtime,运行时配置),如果让永久生效规则立即覆盖当前规则生效使用,还需要使用firewall-cmd --reload命令重新加载防火墙配置。常用firewall-cmd命令如下:
firewall-cmd命令 | 说 明 |
--get-default-zone | 查看当前默认区域 |
--get-active-zones | 列出当前正在使用的区域及其所对应的网卡接口 |
--get-zones | 列出所有可用的区域 |
--set-default-zone=<ZONE> | 设置默认区域(注意此命令会同时修改运行时配置和永久配置) |
--add-source=<CIDR>[--zone=<ZONE>] | 将来自IP地址或网段的所有流量路由到指定区域,没有指定区域时使用默认区域。 |
--remove-source=<CIDR>[--zone=<ZONE] | 从指定区域中删除来自IP地址或网段的所有路由流量规则,没有指定区域时使用默认区域。 |
--add-interface=<Interface>[--zone=<ZONE] | 将来自该接口的所有流量都路由到指定区域。没有指定区域时使用默认区域。 |
--change-interface=<Interface>[--zone=<ZONE] | 将接口与指定区域做关联,没有指定区域时使用默认区域。 |
--list-all[--zone=<ZONE] | 列出指定区域已配置接口、源、服务、端口等信息,没有指定区域时使用默认区域。 |
--add-service=<SERVICE>[--zone=<ZONE] | 允许到该服务的流量通过指定区域,没有指定区域时使用默认区域。 |
--remove-service=<SERVICE>[--zone=<ZONE] | 从指定区域的允许列表中删除该服务,没有指定区域时使用默认区域。 |
--add-port=<PORT/PROTOCOL>[--zone=<ZONE] | 允许到该端口的流量通过指定区域,没有指定区域时使用默认区域。 |
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE] | 从指定区域的允许列表中删除该端口,没有指定区域时使用默认区域。 |
2.3 区域管理
# firewall-cmd --help | wc -l
(1)查看默认区域
# firewall-cmd --get-default-zone
(2)列出当前正在使用的区域及其所对应的网卡接口
# firewall-cmd --get-active-zones
(3)列出所有可用的区域
# firewall-cmd --get-zones
(4)设置默认区域
# firewall-cmd --set-default-zone=block
(5)将接口加入到某个区域
# firewall-cmd --add-interface=ens37 --zone=trusted
# firewall-cmd --change-interface=ens38 --zone=trusted
2.4 服务管理
(1)查看预定义服务
# firewall-cmd --get-services
(2)添加http服务到public区域
# firewall-cmd --add-service=http --zone=public --permanent
# systemctl restart firewalld
(3)查看public区域已配置的规则
# firewall-cmd --list-all --zone=public
(4)移除public区域的http服务,不使用--zone指定区域时使用默认区域
# firewall-cmd --remove-service=http --permanent --zone=public
# systemctl restart firewalld
(5)将多个服务添加到某一个区域,不添加--permanent选项表示是即时生效的临时设置
# firewall-cmd --add-service=http --add-service=https
# systemctl restart firewalld
2.5 端口管理
(1)允许TCP的3306端口到public区域
# firewall-cmd --add-port=3306/tcp
(2)从public区域将TCP的3306端口移除
# firewall-cmd --remove-port=3306/tcp
(3)允许某一范围的端口,如允许UDP的2048-2050端口到public区域
# firewall-cmd --add-port=2048-2050/udp --zone=public
(4)使用--list-ports查看加入的端口操作是否成功
# firewall-cmd --list-ports
2.6 伪装IP
(1)什么是地址伪装?
通过地址伪装,NAT设备将经过设备的包转发到指定的接收方,同时将通过的数据包
源地址更改为其NAT设备自己的接口地址。当返回的数据包到达时,会将目的地址修改
为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。类似于NAT技术中的端口多路复用(PAT)。IP地址伪装仅支持ipv4,不支持ipv6。
(2)相关命令
# firewall-cmd --query-masquerade # 检查是否允许伪装IP
# firewall-cmd --permanent --add-masquerade # 允许防火墙伪装IP
# firewall-cmd --permanent --remove-masquerade# 禁止防火墙伪装IP
2.7 端口转发
当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
# firewall-cmd --permanent --add-masquerade
# firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80
# firewall-cmd --add-port=8080/tcp 允许访问8080端口
# firewall-cmd --remove-service=http 拒绝访问80端口
端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
2.8 多区域的应用
(1)一个接口只能对应一个区域,将接口与指定区域关联
# firewall-cmd --change-interface=ens75 --zone=drop
(2)根据不同的访问来源网段,设定至不同的区域规则
# firewall-cmd --add-source=192.168.75.0/24 --zone=public
# firewall-cmd --add-source=192.168.85.0/24 --zone=drop
# firewall-cmd --get-active-zones
(3)建议配置方案
将所有接口划分到对应的区域,
根据网段配置至不同的区域,
不同的区域配置不同的规则。
(4)检查防火墙设置
#firewall-cmd --get-active-zones
# firewall-cmd --list-all --zone=drop
2.9 firewalld富规则
2.9.1 富规则的语法介绍
firewalld的富语言(rich language)提供了一种不需要了解iptables语法的通过高级语言配置复杂IPv4和IPv6防火墙规则的机制,为管理员提供了一种表达性语言。通过这种语言可以表达firewalld的基本语法中未涵盖的自定义防火墙规则。富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录(面向syslog 和auditd),以及端口转发、伪装和速率限制。富规则的基本语法如下:
firewall-cmd 管理选项='
rule [family="<rule family>"][ source address="<address>"[invert="True"] ]
[ destination address="<address>"[invert=""True"] ][ <element> ]
[ log [prefix="<prefix text>"][level="<log level>"][limit value="rate/duration"]]
[ audit ][ accept/reject| drop ]'
firewall-cmd 处理富规则的常用选项
选 项 | 说 明 |
--add-rich-rule='RULE' | 向指定区域中添加RULE,如果没有指定区域,则为默认区域 |
--remove-rich-rule='RULE' | 从指定区域中删除RULE,如果没有指定区域,则为默认区域 |
--query-rich-rule='RULE' | 查询RULE是否已添加到指定区域,如果未指定区域,则为默认区域,规则存在,则返回0,否则返回1 |
--list-rich-rules | 输出指定区域的所有富规则,如果未指定区域,则为默认区域 |
富语言具体规则说明如下:
source 限制源P地址,源地址可以是一个IPv4、IPv6地址或者一个网络地址段。
destination 限制目标地址,目标地址使用跟源地址相同的语法。
element 要素,该项只能是(service,port , protocol,icmp-block,masquerade
和forward-port)要素之一。
service 服务名称是 firewalld提供的其中一种服务
命令格式为:service name=service_name
port 端口,独立端口数字,或者是端口范围,如5060~5062。协议为TCP或UDP
命令格式为:port port=number_or_range protocol=protocol
protocol 协议,可以是一个协议ID号,或者一个协议名。
命令格式为:protocol value=protocol_name_or_ID。
icmp-block 阻断一个或多个ICMP类型。
命令格式为:icmp—block name=icmptype_name,
masquerade IP伪装。用源地址而不是目的地址来把伪装限制在一个范围内。
forward—port 端口转发,port和 to-port可以是一个端口或一个端口范围。
而目的地址是一个简单的P地址。
命令格式为: forward-portport=number_or_range
protocol=protocol to-port=number_or_range
to-addr=address
log 注册有内核日志的连接请求到规则中,如系统日志。可以定义一个前缀文本把日志信息作为前缀加入,日志等级可以是emerg alert、 crit、error,warning. notice, info或者debug 中的一个。可以选择日志的用法.按以下方式限制日志:log [prefix=prefix text][level=log level] limit value=rate/duration。持续时间的单位为s. m、 h、 d,s表示秒.m 表示分钟, h表示小时, d表示天。最大限定值是1/d (每天最多有一条日志进入)
accept|reject|drop 可以是accept、reject或drop 中的一个行为。
规则排序
一旦向某个区域(一般是指防火墙)中添加了多个规则,规则的排序会在很大程度上影响防火墙的行为。对于所有的区域,区域内的规则的基本排序是相同的。如果区 域中的任何规则与包均不匹配,通常会拒绝该包,但是区域可能具有不同的默认值。例如,可信区域(trusted) 将接收任何不匹配的包。此外,在匹配某个记录规则后,将继续正常处理包。
直接规则是个例外。大部分直接规则将首先进行解析,然后由firewalld 进行其他处理,但是直接规则语法允许管理员在任何区域中的任何位置插入任何规则。
测试和调试
为了便于测试和调试,几乎所有规则都可以与超时一起添加到运行时配置。当包含超时的规则添加到防火墙时,计时器便针对该规则开始倒计时,-旦规则的计时器达到0秒,便从运行时配置中删除该规则。
在使用远程防火墙时,使用超时会是-种极其有用的工具,特别是在测试更复杂的规则集时。如果规则有效,则管理员可以再次添加该规则;如果规则没有按照预期运行,甚至可能将管理员锁定而使其无法进入系统,那么规则将被自动删除,以允许管理员可以继续工作。
通过在启用规则的firewall-cmd命令的结尾追加选项–timeout= .可向运行时规则中添加超时。
2.9.2 富规则配置案例
(1)允许新的IPv4和IPv6连接FTP, 并使用审核每分钟记录一 次。
# firewall-cmd --zone=public --add-rich-rule='rule service name="ftp" log limit value=1/m audit accept'
允许来自192.168.0.0/24地址的TFTP协议的IPv4连接,并且使用系统日志每分钟记录一次。
# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info"limit value="1/m" accept'
将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接。
# firewall-cmd --add-rich-rule='rule family="ipv4"source address=""192.168.2.2" accept'
拒绝来自public区域中IP地址192.168.0.11的所有流量。
# firewall- cmd --zone public –- add-rich-rule= ’ rule family =ipv4 source address=
192.168.0.11/32 reject’
2.9.3 图形管理工具
# firewall-config
Selinux安全机制
3.1 安全评估标准4类7级 A1 B1 B2 B3 C1 C2 D1
配置文件:/etc/selinux/config
配置运行模式:SELINUX=enforcing 需重启才能生效
setenforce 0 | 1 重启即失效
setenforce 查看运行模式