#如果说SELINUX是对内管控应用程序的安全,那么防火主要是对外进行管理
防火墙:
Linux的内核中包含了 netfilter ,netfilter 主要是对流量操作的一个框架,其中包括数据包的过滤,网络地址转换和端口转发等;
在rhel8中内核还包含nftables ,这是一个较新的数据包分类和过滤的子系统,在netfilter的代码上进行了增强,并且保留了netfilter 的架构,对比netfilter来说,nftables 的数据包处理速度,规则集的更新都更加的迅速,并且支持同时处理 ipv4 和 ipv6 的协议;
netfilter 是通过几个程序来进行的配置,包括iptables,ip6tables 等等,但是这些框架目前已经被弃用了,nftables 是使用单个nfs的用户空间程序来通过统一接口管理所有的协议;
而Firewalld 只是一个防火墙的管理器,它属于是 nftables 框架的前端;
#注:在rhel8中,去修改firewalld是实时生效的
firewalld 对于区域的管理:
查看firewalld所有的管理区域:firewall-cmd --get-zones
区域规则集:
区域名称 | 默认配置 |
trusted | 可信任区域,防火墙将放行所有流量。 |
home | 区域内主动发起的链接的流入回程数据允许通过,并且默认放行ssh,mdns,samba等服务 |
internal | 与home相同 |
work | 区域内主动发起连接的流入回程数据允许通过,放行ssh服务,dncpv6-client服务 |
external | 区域内主动发起连接的流入回程数据包允许通过,放行ssh服务,并开启地址伪装 |
dmz | 区域内主动发起连接的流入回程数据包允许通过,放行ssh服务 |
block | 区域内主动发起连接的流入回程数据包允许通过 |
drop | 对进入该区域的所有数据包丢弃,并不进行任何回包,区域内主动发起的链接流入回程数据包允许通过 |
#注:关于zone的目标(target)有四个,默认是default ,其中 ACCEPT 为允许,设置为该目标,相当于没有防火墙功能,REJECT 为拒绝,DROP 为丢弃
#地址伪装:在linux中其实就是开启IP转发后,实现地址访问;地址伪装有两个实现方式如下
#在firewalld中,masquerade 则是开启地址伪装,开启后ip转发的功能就会默认打开
在防火墙上开启nat功能:
snat:源地址转换,可以实现nat中多主机进行上网的功能实现
dnat:目的地址转换,实现端口转发
firewalld的管理规则:
(1)web控制台
systemctl start cockpit.socket #开启cockpit即可,同时确保9090端口正在再被cockpit使用
#因为web控制台无法切换区域,所以它的功能比较有限,主要也是用来配置区域放行的端口和服务
(2)firewall-config 图形化控制台
可以使用 firewall-GUI图形化控制台(rpm包名 firewall-config)
#基本上命令行可以实现的功能,firewall-gui都可以实现
注:Runtime 这个模式是临时有效,重启服务之后即会失效,Permanent 模式需要重新载入才会生效,并且永久有效,但是不会立即生效
(3)firewall-cmd 命令行(使用的是xml的区域文件来进行的配置)
#常见命令行
--get-default-zone #查询默认区域名称
--set-default-zone=<区域名称> #设置默认区域,永久生效
--list-all #显示当前区域网卡配置参数,端口,服务等信息
--list-all-zones #显示所有区域网卡配置参数,端口,服务等信息
--get-zones #显示可用的区域
--get-active-zones #显示当前正在使用的区域,网卡名称等
--add-source= #将源自这个IP或子网的流量导向指定的区域
--remove-source= #与--add-source相反,不将这个ip或子网的流量导向这个区域
--change-source= #将源自这个IP活子网的流量导入指定的新的区域
示例:例如需要放行一个端口
确认当前放行的端口,以及当前默认的区域
firewall-cmd --list-all
#可以看出当前在public这个区域,并且没有单独放行任何端口
#通过命令行放行82端口
firewall-cmd --permanent --add-port=82/tcp
#放行完毕之后手动重新加载下firewall的配置文件
firewall-cmd --reload
也可以查看对应区域的配置文件,通过修改配置文件去放行端口
vim /etc/firewalld/zones/public.xml #修改对应区域的配置文件,这里对应的是public区域
手动修改,修改后也需重新加载下配置文件
最终查看结果
示例:单独拉黑一个ip
查看当前zone使用的情况
firewall-cmd --get-active-zones
单独拉黑一个ip,再来查看状态
firewall-cmd --add-source=192.168.161.1 --znotallow=drop
#将ip地址移出黑名单
firewall-cmd --remove-source=192.168.161.1
<<EOF
由上示例可看出拉黑一个ip的格式为 firewall-cmd --add-source=* --zone=drop 其中 --add-source 为指定
需要操作的IP,--zone=drop 是指定操作的区域,如果不携带--zone 那么则是直接操作当前正在使用的区域;同理
需要添加服务到黑名单则为--add-service=smtp --zone=drop ,依次类推,但是需要注意这种操作都是临时有效
加上--permanent后重新加载配置文件则会变为永久有效
EOF
firewalld 优先级
优先级最高 ==》source 来源地址
优先级其次==》interface 接收请求的网卡
优先级最低==》firewalld 配置的默认区域(zone)
所以例如当一条请求满足了source 则不会继续往下去配置,会直接生效所配置的规则
firewalld 端口转发
将本机的端口转向本机
firewall-cmd --add-forward-port=port=9999:proto=tcp:toport=22 #将9999端口转为22端口,所以外部通过ssh链接的时候可以直接使用 ssh -p 9999 [email protected] 这种形式来进行访问
将本机的端口转向远程主机
第一步:需要先将masquerade(地址伪装) 打开
firewall-cmd --add-masquerade --znotallow=public
第二步:转换IP
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=1000:toaddr=远程主机IP
firewalld的富规则集
#更加详细的防火墙管理规则
man firewalld.richlanguage #查看帮助,语法规则如下
#示例:将单个端口对指定IP开放
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.161.1" port port="22" protocol="tcp" accept"