1.介绍
1)对于一个服务有哪些访问控制策略?
一、server:服务本身的访问控制策略
二、perm(权限):文件的读写执行权限的设定
三、sexlinux:内核防火墙
虽然无法读取数据,但是数据还是进入到系统了
防火墙:是让数据进不来 ,是一个表格,是一个访问策略
两种火墙管理方式,两种服务:一种为iptables(静态) , 6以后有firewalld(动态)。最终操作的是iptable
iptable实现的是数据包过滤功能
Filewalld(动态防火墙)作为redhat7系统中变更对于netfilter内核模块的管理工具;
iptables service 管理防火墙规则的模式(静态):用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,
再执行命令 /etc/init.d/iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,
然后重新完整地加载所有新的防火墙规则,如果加载了防火墙的模块,需要在重新加载后进行手动加载防火墙的模块;
firewalld 管理防火墙规则的模式(动态):任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。
还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。
2.firewalld域
便于理解:
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,
从而实现防火墙策略之间的快速切换。例如,我们有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。
按常理来讲,这三者的安全性按照由高到低的顺序来排列,应该是家庭、公司办公室、咖啡厅。
当前,我们希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;
在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。
在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,
然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。
firewalld中常见的区域名称(默认为public);
网络区名称 默认配置
trusted(信任) 可接受所有的网络连接
home(家庭) 用于家庭网络,仅接受ssh、mdns、ipp-client、samba-client、或dhcp6-client服务连接
internal(内部) 用于内部网络,仅接受ssh、mdns、ipp-client、samba-client、或dhcp6-client服务连接
work(工作) 用于工作区,仅接受ssh、ipp-client或dhcpv6-client服务连接,为firewalld的默认区域
external(外部) 出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务连接
dmz(非军事区) 仅接受ssh服务连接
block(限制) 拒绝所有网络连接
drop(drop) 任何接受的网络数据包都被丢弃,没有任何回复
3.使用图形的方式管理防火墙
firewalld-config
![](https://i-blog.csdnimg.cn/blog_migrate/fded5f1b19865327d2cc866809319614.png)
4.使用命令行接口配置防火墙
firewall-cmd --state ##查看火墙状态
firewall-cmd --get-default-zone ##查看默认域
firewall-cmd --get-active-zones ##查看当前活动的区域,并附带一个目前分配给它们的接口列表:
firewall-cmd --get-zones ##查看所有的域
firewall-cmd --zone=public --list-all ##列出指定域的所有设置
firewall-cmd --get-services ##查看火墙可以控制的所有服务
firewall-cmd --list-all ##查看当前的状态
firewall-cmd --zone=work --list-all ##查看work域的状态
firewall-cmd --set-default-zone=dmz ##设置默认域
实验:
firewall-cmd --state ##查看火墙状态
firewall-cmd --get-default-zone ##查看默认域
firewall-cmd --get-active-zones ##查看当前活动的区域,并附带一个目前分配给它们的接口列表:
firewall-cmd --get-zones ##查看所有的可用域
firewall-cmd --zone=public --list-all ##列出指定域的所有设置
firewall-cmd --get-services ##查看火墙可以控制的所有服务
firewall-cmd --list-all ##查看当前的状态
firewall-cmd --zone=work --list-all ##查看work域的状态
firewall-cmd --set-default-zone=dmz ##设置默认域
![](https://i-blog.csdnimg.cn/blog_migrate/9be4b9c37c53f382bcdeb89b0398f91f.png)
5.火墙访问命令
firewall-cmd --reload ## 重载命令
firewall-cmd --permanent --add-service=http ##允许访问服务
firewall-cmd --permanent --remove-service=http ##删除
firewall-cmd --permanent --zone=trusted --add-source=172.25.254.36 ##允许某一个IP访问
firewall-cmd --permanent --remove-source=172.25.254.36 --zone=trusted ##删除
irewall-cmd --zone=block --add-source=172.25.254.36 ##黑名单:企业一般中block 有回应的拒绝
firewall-cmd --remove-source=172.25.254.250 --zone=block ##删除
firewall-cmd --zone=drop --add-source=172.25.254.36 ##丢弃:无回应的拒绝
firewall-cmd --remove-source=172.25.254.250 --zone=drop ##删除
firewall-cmd --add-interface=eth0 --zone=trusted ##增加接口 到可信域
firewall-cmd --change-interface=eth0 --zone=public ##改变接口 到公开域
firewall-cmd --remove-interface=eth0 --zone=public ##删除接口
实验:
firewall-cmd --reload ## 重载命令,每次设置完成后需要重新加载
firewall-cmd --permanent --add-service=http ##允许访问服务
之前没有http服务
实验后有http服务
firewall-cmd --permanent --remove-service=http ##删除
实验后http服务不在了
firewall-cmd --permanent --zone=trusted --add-source=172.25.254.36 ##允许某一个IP访问
实验之前测试不可以访问apache
实验过后,172.25.254.85不可以访问服务机172.25.254.11,
firewall-cmd --permanent --remove-source=172.25.254.36 --zone=trusted ##删除
irewall-cmd --zone=block --add-source=172.25.254.36 ##黑名单:企业一般中block 有回应的拒绝
测试使用172.25.254.85不可以访问,使用172.25.254.10可以访问
firewall-cmd --remove-source=172.25.254.250 --zone=block ##删除
firewall-cmd --zone=drop --add-source=172.25.254.36 ##丢弃:无回应的拒绝
出于一直连接的状态
firewall-cmd --remove-source=172.25.254.250 --zone=drop ##删除
firewall-cmd --add-interface=eth0 --zone=trusted ##增加接口 到可信域
firewall-cmd --change-interface=eth0 --zone=public ##改变接口 到公开域
firewall-cmd --remove-interface=eth0 --zone=public ##删除接口
6.配置文件
文件:
/usr/lib/firewalld/services/ :firewalld服务默认在此目录下定义了70+种服务供我们使用,格式:服务名.xml;
/etc/firewalld/zones/ : 默认区域配置文件,配置文件中指定了编写完成的规则(规则中的服务名必须与上述文件名一致);
分为多个文件的优点 :
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式
1)配置文件的查看
cd /etc/firewalld/
[root@localhost firewalld]# ls
firewalld.conf icmptypes lockdown-whitelist.xml services zones
2)域配置文件的修改 ##使用的是xml语句
步骤一:进入到域所在的配置文件的目录 /etc/firewalld/zones
[root@localhost firewalld]# cd zones/
[root@localhost zones]# ls
public.xml public.xml.old trusted.xml trusted.xml.old
步骤二:vim public.xml ##编辑公共域的配置文件
新编写<service name="http"/>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="samba"/>
<service name="http"/>
<service name="dhcpv6-client"/>
<service name="nfs"/>
<service name="ssh"/>
<service name="tftp"/>
<port protocol="tcp" port="3260"/>
</zone>
步骤三:重新加载
firewall-cmd --reload
测试结果
firewall-cmd --list-all
![](https://i-blog.csdnimg.cn/blog_migrate/1f4a6849afea009c29036cb87429ff94.png)
3)服务端口的修改
一、火墙控制服务的查看 /usr/lib/firewalld/services
cd /usr/lib/firewalld/
[root@localhost services]# cd /usr/lib/firewalld/
[root@localhost firewalld]# ls
icmptypes services zones
[root@localhost firewalld]# cd services/
[root@localhost services]# ls
amanda-client.xml ipp-client.xml mysql.xml rpc-bind.xml
bacula-client.xml ipp.xml nfs.xml samba-client.xml
bacula.xml ipsec.xml ntp.xml samba.xml
dhcpv6-client.xml kerberos.xml openvpn.xml smtp.xml
dhcpv6.xml kpasswd.xml pmcd.xml ssh.xml
dhcp.xml ldaps.xml pmproxy.xml telnet.xml
dns.xml ldap.xml pmwebapis.xml tftp-client.xml
ftp.xml libvirt-tls.xml pmwebapi.xml tftp.xml
high-availability.xml libvirt.xml pop3s.xml transmission-client.xml
https.xml mdns.xml postgresql.xml vnc-server.xml
http.xml mountd.xml proxy-dhcp.xml wbem-https.xml
imaps.xml ms-wbt.xml radius.xml
二、火墙端口的修改
修改hhtp的端口为8080
编辑 vim http.xml
修改为8080端口
<port protocol="tcp" port="8080"/>
三、添加新的服务
[root@localhost services]# cp http.xml http8080.xml
[root@localhost services]# vim http8080.xml
[root@localhost services]# systemctl restart firewalld.service
[root@localhost services]# firewall-cmd --get-services
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http http8080 https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
7.reload 和 complete reload的区别
我们以ssh为例,说明二者的区别
一、使用172.25.254.85 ssh连接172.25.254.11
二、关闭172.25.254.11的ssh的火墙服务
三、使用reload,并重启防火墙服务查看
测试还在ssh连接中。
四、使用complete reload
虽然可以操作但是已经断开联系。
reload:不中断连接
complete reload :把所有连接中断,刷新火墙策略
8.Direct Rules ##精确控制
如何让特定IP可以访问特定服务
只有在服务没有完全打开的情况
通过firewall-cmd工具,可以使用--direct选项在运行时间里增加或者移除链。如果不熟悉iptables,使用直接接口非常危险,因为您可能无意间导致防火墙被入侵。直接端口模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则。直接端口模式添加的规则优先应用。
1)查看规则
firewall-cmd --direct --get-all-rules
添加允许规则 ACCEPT
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.36 -j ACCEPT
-p 服务
-s IP地址
-j 权限
--direct 精确控制
filter 1 filter表的第一项目
--dport 端口号
测试
172.25.254.85端口可以访问172.25.254.11的apache(172.25.254.11的http服务不允许)
2)删除规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.36 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/a37a1e6716ff7d07787dbdd6494fb1d9.png)
3)添加不允许规则 REJECT ##此时服务是打开的,添加某个不允许选项。
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.36 -j REJECT
415
测试
172.25.254.85不可以访问172.25.254.11(此时http服务开启状态)
9.rich rules
1)介绍snat和dnat
富规则可以对服务端口协议进行更详细的配置
下面我们讲解两个概念:
snat:源地址转换 实现:地址隐藏功能
dnat:目的地址转换 实现:地址转发功能
SNAT和DNAT的区别:
1、从定义来讲它们一个是源地址转换,一个是目标地址转换。都是地址转换的功能,将私有地址转换为公网地址。
2、要区分这两个功能可以简单的由连接发起者是谁来区分:内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
3、当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
2)地址转发功能:dnat
步骤一:打开地址伪装功能
firewall-cmd --permanent --add-masquerade
步骤二:firewall-cmd --reload
![](https://i-blog.csdnimg.cn/blog_migrate/1b0fb67bd1c31eabb87935d20b7ab503.png)
步骤三:地址转换
firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.10 ##将ssh连接172.25.254.11转发到172.25.254.10
测试
ssh连接172.25.254.11查看IP地址,此时输入的密码应该是172.25.254.10的密码。
w -i ##查看ssh登陆
步骤四:删除
firewall-cmd --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.10
3)源地址转换:snat地址伪装
目的:实现1.1.1.10(相当于内网)和 172.25.254.85(相当于外网)的通信
实验环境
三台主机
第一台主机ip172.25.254.85
![](https://i-blog.csdnimg.cn/blog_migrate/06d743238eb2d3c787975eeeb2057667.png)
第二台主机:
1ip:172.25.254.11
2ip:1.1.1.11
第三台主机ip:1.1.1.10
![](https://i-blog.csdnimg.cn/blog_migrate/19d5590d8eed144856ec77b7c4fa4cfb.png)
第二台主机相当于路由器
具体实现过程
第二台主机:
步骤一:开启地址隐藏功能
firewall-cmd --permanent --add-masquerade
![](https://i-blog.csdnimg.cn/blog_migrate/0139153c3e460d1b84493bd9f078d72f.png)
步骤二:开启地址转发功能
vim /etc/sysctl.conf
编辑
net.ipv4.ip_forward=1
第三台主机
编辑网关 vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATE0=1.1.1.11
测试
使用 1.1.1.11 ,ssh root@172.25.254.85,发现可以连接
在172.25.254.85 查看w -i
发现登陆的ip是 172.25.254.11 ##1.1.1.10的地址被隐藏了
11.火墙的关闭隐藏和开机不启动
systemctl stop firewalld.service
systemctl mask firewalld.service ##隐藏火墙
systemctl disable firewalld.service ##开机不启动火墙