一,firewalld
1.什么是防火墙?
所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的边界上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。
再redhat系统中防火墙服务有两个firewalld和iptables,在这里我们将介绍一下firewalld。
2.firewalld?
动态防火墙后台程序 firewalld 提供了一个 动态管理的防火墙
, 用以支持网络 “ zones” , 以分配对一个网络及其相关链接
和界面一定程度的信任。它具备对 IP v4 和 IP v6 防火墙设
置的支持。它支持以太网桥 , 并有分离运行时间和永久性配置选
择。它还具备一个通向服务或者应用程序以直接增加防火墙规则
的接口
系统提供了图像化的配置工具 firewall-config 、 system-
config-firewall, 提供命令行客户端 firewall-cmd, 用于配
置 firewalld 永久性或非永久性运行时间的改变 : 它依次用
iptables 工具与执行数据包筛选的内核中的 Netfilter 通信
二,firewalld的配置与学习
1.实验环境:
在这里我们需要准备两台虚拟机,博主的两台虚拟机记为server和client.
server:两块网卡,在这里我们两个网卡的ip分别为eth0:172.25.254.97,eth1:1.1.1.97
client:一块网卡eth0,ip为1.1.1.117
真机的ip为172.25.254.77
2.firewaldd的配置和启动
在前面我们讲过防火墙服务有两个,那么我们这里先关闭iptables服务,确保两个防火墙互不影响
systemctl stop iptables.service ##关闭iptables服务
systemctl disable iptables.service ##设置iptables开机不启动
systemctl mask iptables.service ##锁定iptables服务
systemctl start firewalld ##启动firewalld服务
systemctl enable firewalld ##设置firewalld开机自启动
注意,这些设置全部在server上做
3.selinux对端口的控制
因为防火墙一个很重要的控制内外部网络的控制就是端口,那么,再linux系统中还有一个控制端口的服务就是我们学过的selinux
为了让大家了解selinux对其端口的控制我们用httpd服务来做示例
首先我们通过配置文件/etc/httpd/conf/httpd.conf修改端口为6666,然后重启httpd服务(当然,这里的selinux必须得是enforcing状态)
我们发现无法启动,这是因为再selinux中的系统默认的httpd的端口没有6666这个端口,那么我们可以手动添加这个端口
semanage port -l | grep http ##查看http的端口
semanage port -a -t http_port_t -p tcp 6666 ##添加端口6666
semanage port -l | grep http ##查看端口
systemctl restart httpd.service ##重启服务
我们发现只要添加上6666端口则可以重启httpd服务,实验结束后一切还原
4.firewall所有域的查看,默认域等
firewall-cmd --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-service ##火墙的服务
firewall-cmd --list-all-zones ##列出所有域
firewall-cmd --set-default-zone=dmz ##修改当前域为dmz
firewall-cmd --add-service=ftp ##添加ftp服务为默认域的开放服务,临时生效
firewall-cmd --permanent --add-service=http ##永久生效,不过得重新家在配置文件
firewall-cmd --reload ##刷新
5.指定或移除某个ip通过某个域访问系统以及重新加载配置火墙文件
我们现在的域为public,开放的服务只有ssh和dhcp,我们来看一下真机是否可以通过http访问
我们发现无法访问,那么我们可以设置真机走trusted域,即信任域
firewall-cmd --zone=trusted --add-source=172.25.254.77 ##让77走trusted域
我们发现加载真机走trusted域后真机则可以看到了,那么我们若不想让真机通过http访问server,则将其移除即可
注意:我们在这里的设置都是临时的,若要永久设置则:
firewall-cmd --permanent --zone=trusted --add-source=172.25.254.77 ##永久添加77主机走trusted
firewall-cmd --permanent --zone=trusted --remove-source=172.25.254.77 ##永久删除77主机走trusted
firewall-cmd --reload ##刷新
6.添加指定网卡到不同的域中
firewall-cmd --zone=trusted --add-interface=eth1 ##将eth1网络接口放到trusted中,eth0依旧在public中
我们在此时会发现添加补上,这是因为我们的eth1已经再别的域里了,所以用到的不能是add而是change
此时如果我们用真机去访问server
发现1.1.1.97网卡可以进行访问
7.添加某个服务或者端口为指定域的开放服务或端口
添加服务:
firewall-cmd --list-all --zone=public ##查看public的所有信息
firewall-cmd --add-service=dns ##接入dns服务
firewall-cmd --reload ##刷新,但不会终结已经开启的服务
firewall-cmd --complete-reload ##完全刷新,立即停掉刚才设置的服务
添加端口:
firewall-cmd --add-port=80/tcp
开放端口后,虽然我们没有开启http服务,但是真机依旧可以访问
8.添加指定规则
首先我们将默认域设置为block
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.77 -j ACCEPT 只允许77主机访问ssh
移除上一条规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.77 -j ACCEPT
除77外都可以访问ssh
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 ! -s 172.25.254.77 -j ACCEPT
firewall-cmd --direct --get-all-rules ##查看所有特殊规则
注意:所有设置的规则里,除了规则设定过的主机,其他主机均走默认域
9.火墙伪装
在前面我们做过有关于虚拟机上网的设置,里面提到了火墙伪装,那么在这里我们再来具体的看一下火墙伪装
火墙伪装:确保两点:masquerade和ip_forward的值
masquerade必须为yes,ip_forward必须为1(即开启路由功能)
在这里我们通过个火墙伪装,将我们的eth0网卡虚拟为一个路由器
注意,我这里的ip_forward是关闭的,所以如图修改,若为一则就不用管了
测试:
将client的网管设置为服务器eth1的eth1ip:1.1.1.97,然后去ssh真机
真机用命令w -i查看登陆真机的主机有哪些
我们发现真机显示的连接着是97也就是server,而我们真正连接真机的却是client(1.1.1.117)
10.端口转发
我们在上个实验的基础上继续做端口转发,因为刚才是client连接的真机,而真机以为是server,那么当真机ssh连接server时就真的是server,那么我们可以通过端口转发,使真机连接server,最终到达的确是client
firewall-cmd --permanent -zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.117 ##端口转发
最终我们通过22端口使真机通过server连接上了client,端口转发成功!