1.什么是firewalld
防火墙(Firewalld),是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出 防火墙是系统的第一道防线,其作用是防止非法用户的进入
centos 7 中防火墙Firewalld是一个非常强大的功能,Firewalld提供了支持网络/防火墙区域(zone)定义网络连接以及接口安全等级的动态防火墙管理工具,它支持IPv4,IPv6防火墙设置以及以太网桥接,并拥有运行时配置和永久配置选项它也支持允许服务或者应用程序直接添加防火墙规则的接口 以前的system-config-frewall/lokkit防火墙模型是静态的,每次修改都要求防火墙完全重启 这个过程包括内核netfilter防火墙模块的卸载和新配置所需模块的装载等,而模块的卸载将会破坏状态防火墙和确立的连接
相反firewall deamon动态管理防火墙,不需要重启防火墙便可以更改,因此也就没有必要重新加在所有的内核防火墙模块了 不过要使用firewall deamon就要求防火墙的所有变更都要通过改守护进程来实现。以确保守护进程中的状态和内核里的防火墙是一致的 另外firewall deamon无法解析由 ip*tables和ebtables 命令行工具添加防火墙的规则
2.搭建实验环境
步骤一:reset并给desktop配置网络并且给两块虚拟网卡,ip1=172.25.254.115,ip2=1.1.1.115,server虚拟机一块网卡,ip=1.1.1.215,配置115的yum源,将desktop当作防火墙服务器。
步骤二 给desktop装上firewalld服务
yum search firewalld 查找 yum install firewalld.noarch
sysemctl stop iptables 关闭这个火墙,不影响firewalld实验效果 systemctl mask iptables 锁住服务 systemctl start firewalld 开启firewalld systemctl enable firewalld 设置开启启动
3.firewalld中的区域管理
网络区域简介
通过网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流 例如,互联网是不可信的区域,而内部网络是高度信任的区域 网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化 该模型描述了主机所连接的整个网络环境的可信级别,并定义了连接的处理方式
初始化区域
阻塞区域block | 任何传入的网络数据包都会被阻止 |
---|---|
工作区域work | 相信网络上的其他计算机,不会损害自己的计算机 |
家庭区域home | 相信网络上的其他计算机,不损害自己的计算机 |
公共区域public | 不相信网络上的任何计算机,只选择接受传入的网络连接 |
隔离区域 DMZ | 隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用,对于隔离区域,只有选择接受传入的网络连接 |
信任区域trusted | 所有网络连接都可以接受 |
丢弃区域drop | 任何传入的网络连接都被拒绝 |
内部区域internal | 信任网络上的其他计算机,不会损害自己的计算器,只有选择接受传入的网络连接 |
外部区域external | 不相信网络上的其他计算机,不会损害自己计算机,只有选择接受传入的网络连接 |
firewalld的默认区域是public
4.使用图形界面管理firewalld防火墙
firewall-config 输入这个命令,firewall图形化管理工具就显示出来了,可以在里面进行修改。
可以看到默认的域是public,public域里并没有允许http服务,所以理论上在真机输入172.25.254.115是访问不到的
现在将默认的域改成trusted,再次用真机访问172.25.254.115发现就可以访问到apache主页了
在真机里ssh 172.25.254.115,发现也可以成功,因为此时115默认的是trust域
允许ssh服务
现在将防火墙服务器端的默认域用图形方式改为block
再次用真机ssh 172.25.254.115发现不能连接
5.使用命令管理firewalld防火墙
firewallcmd --state 查看防火墙的状态
firewall-cmd --get-active-zones 查看正在使用的域
firewall-cmd --get default-zone 查看默认域是什么
firewall-cmd --get-zones 查看所有域
firewall-cmd --zone=public --list-all 查看public域所允许的所有服务
firewall-cmd --get-services 列出所有服务
firewall-cmd --list-all-zones 列出所有域
firewall-cmd --set-defaults-zone=public 更改默认的域
火墙是内核上的插件
实验:
本来public域是不允许访问apache,现在做特殊指定,就可以让真机访问的到115火墙端的apache了
yum install httpd 在这之前需要下载httpd服务并开启
此时真机在firefox上输入172.25.254.115是不能进入apache页面的
在dekstop上添加,让外来的主机走自己的trust域 firewall-cmd --add-sources=172.25.254.60 --zone=trusted 此时默认域仍是public,不允许http服务
此时再次用真机来在firefox中输入172.25.254.115可以进入apache主页
指定什么用户可以访问服务端的指定服务
dekstop两块网卡 ip分别为eth0=172.25.254.115 eth1=1.1.1.115 server一块网卡,ip=1.1.1.215
在server中ping1.1.1.115可以ping通,但用firefox访问1.1.1.111访问不到apache主页
server访问不到的原因是因为,desktop上的eth0和eth1均在public里面,不允许外来主机访问apache
firewall-cmd --remove-interface=eth1 --zone=public 把eth1从public域中移出
firewall-cmd --add-interface=eth1 --zone=trusted 将eth1加入trusted域
firewall-cmd --list-all --zone=trusted
在server端打开firefox,然后访问1.1.1.115,发现可以访问apache页面
firewall-cmd --change-interface=eth1 --zone=public 将eth1放回public中
在server中打开firefox,登陆1.1.1.115发现不能登陆
查看firewalld的函数库
cd /usr/lib/firewalld ls cd /services 服务的配置文件 发现里面全是关于服务的xml文件
在里面我们并没有发现iscsi服务的文件,所以我们可以自己建立一个 cp http.xml iscsi.xml vim iscsi.xml
编辑好之后重启火墙服务
firewall-cmd --get-services发现iscsi已经有了 firewall-cmd --add-service=iscsi firewall-cmd --list-all
当永久添加iscsi服务时候,在/etc/firewalld/zones就会出现一个文件public.xml.old
打开发现是之前的配置
将现在的配置删掉,把之前的配置变成现在的配置,然后重新加载防火墙,发现又变成之前的配置了。
永久设置的两种刷新服务的方式
firewall-cmd --reload 重新加载生效,不会影响已存在的服务(已经连接的) firewall-cmd --complete reload 重新加载,并且断开所有已经存在的服务(所有连接)
此时防火墙允许ssh服务
用真机ssh root@172.25.254.115 发现能连接上
现在在115端,永久取消允许ssh服务,然后reload防火墙
而此刻,在真机上仍没有断开连接,仍然可以创建文件
再次将ssh服务加入火墙,真机退出ssh,再次ssh root@172.25.254.115
此时在115端,再次永久remove ssh服务,然后firewall-cmd --complete-reload
,此时在真机的shell中不能输入任何东西 ,再打开一个shell输入,killall -9 ssh 才可以恢复,然后退出ssh
如何对指定的主机进行管理
现在只想让172.25.254.60访问ssh服务,该怎么做
服务端有三种动作
accept | 接受客户端的请求 |
---|---|
reject | 拒绝请求,并且给与回应 |
drop | 丢弃,不给回应,客户端会一直发送数据包,加大负载 |
实验
在desktop上
firewall-cmd --list-all 发现ssh服务开着呢
此时用真机和server都可以ssh上115
现在想指定只有真机可以ssh上,而server不可以,怎么做?
firewall-cmd --direct --add-rule ipv4 filter(规则表) INPUT(链) 1(写在第一条) -s(源) 172.25.254.60 -p(协议类型) tcp --dport(目的端口) 22 -j(什么动作) ACCEPT 添加只有真机60可以ssh上115
添加好后,firewall-cmd --reload 重新加载火墙
然后将desktop火墙中的的ssh服务remove
此时server不能ssh desktop
而被指定的172.25.254.60可以
firewall-cmd --direct --get-all-rules 查看规则
firewall-cmd --direct -remove-rule ipv4 filter INPUT 1 -s 172.25.254.60 -p tcp --dport 22 -j ACCEPT 删除刚才添加的规则
firewall地址转发功能 (从外到内)
现在用真机60来ssh连接1.1.1.215 server,直接连接是不行的,因为两个ip不在同一网段上
注意:此实验需要在server端添加网关设置为1.1.1.115
在desktop端开启地址转发功能 firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.215 添加地址转发
firewall-cmd --list-all查看是否添加成功
添加成功。
测试
在真机上ssh desktop然后ip addr show 看一下ip
发现其实转到了1.1.1.215上,就是server上,实现了地址转发功能,如果去掉网关,就不能实现。
地址伪装 (从内到外)
想用server 1.1.1.215来ping通desktop172.25.254.115主机,因为两者不在同一网段所以不能ping通
首先desktop端,需要开启内核路由功能 sysctl -a | grep ip_forward ip_forward需要=1
firewall-cmd --permanent --add-masquerade 开启防火墙地址伪装功能 然后将1.1.1.215的网关设置成为1.1.1.115即可实现地址伪装功能,使得1.1.1.215能够ping通172.25.254.115