RHEL中的防火墙种类
1.iptables
2.firewalld
3.ip6tables
4.ebtables
这些软件本身并不具备防火墙功能,他们的作用都是在用户空间中管理和维护规则,只不过规则结构和使用方法不一样罢了,真正利用规则进行过滤是由内核的netfilter完成的
系统中防火墙的结构
1、firewalld提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
2、firewalld将网卡分为不同的区域(区域),这些区域的区别在于对待来访的用户及传输的数据包的默认动作的不同,通过制定一 些安全策略从而保证系统在被访问或传输数据时的安全。
firewalld分为九个区域,含义如下:
trust(信任):可接受所有的网络连接;
home(家庭):用于家庭网络,仅接受ssh、mdns、ipp-client、samba-client或dhcpv6-client服务连接;
internal(内部):用于内部网络,仅接受ssh、ipp-client、mdns、samba-client或dhcpv6-client服务连接;
work(工作区):用于工作区,仅接受ssh、ipp-client、dhcpv6-client服务连接;
public(公共):用于公共区域的使用,仅接受ssh、dhcpv6-client服务,为firewalld的默认区域;
external(外部区域):出去的ipv4的网络连接经过此区域的伪装和转发,只支持ssh服务;
dmz(非军事区):仅接受ssh服务;
block(限制):拒绝所有的网络服务;
drop(丢弃):任何访问的网络数据包都会被丢弃,没有任何回应。
1、firewalld图形管理工具:firewall-config &
Runtime ##临时性修改会立即生效,服务重启后消失
Permanet ##永久性修改,需要重启服务后才会生效
监控命令watch -n 1 firewall-cmd --list-all
临时性修改:(会立即生效)
永久性修改:(不会立即生效)
需要重启防火墙服务systemctl restart firewalld
会发现重启之后临时添加的https服务消失了 永久添加的http服务出现了
永久性更改火墙的服务,会记录到防火墙的配置文件中/etc/firewalld/zones ls
public.xml.old是对public.xml的备份
/usr/lib/firewalld/zones目录下是对所有火墙服务状态的记录,永久性更改火墙服务,该目录下的文件也会及时做出相应的修改
2、firewall-cmd --state ##查看防火墙状态
3、firewall-cmd --get-active-zones ##查看被激活的区域(即添加网卡的区域)
4、firewall-cmd --get-default-zone ##查看当前默认区域
5、firewall-cmd --get-zones ##查看firewalld所有的区域
6、firewall-cmd --zone=public --list-all ##查看指定区域的信息
7、firewall-cmd --list-all-zones ##列出所有区域的详细设置
8、firewall-cmd --get-services ##查看可通过firewalld进行设定的系统中的服务
9、firewall-cmd --set-default-zone=dmz ##设定默认区域,如下图为设置默认区域为dmz(非军事区):仅接受ssh服务;
为了方便实验,我们可以安装一个httpd服务来检测试验的效果yum install httpd -y
给服务端配置两张网卡 eth0 ip为172.25.254.145
eth1 ip为192.168.0.145
1、改变网卡所属域
1) 将默认区域设为dmz firewall-cmd --set-default-zone=dmz
可以看到,eth0,eth1在dmz域 firewall-cmd --list-all
2)为了实验效果,我们在apache默认发布目录下,写入内容,并重启服务生效
echo 172.25.254.145>/var/www/html/index.html
systemctl restart httpd
3)然后将eth1加入信任域:firewall-cmd --change-interface=eth1 --zone=trusted
firewall-cmd --get-active-zones
4)进行测试,用eth1所属网卡访问apache可以查看到刚才我们写入的内容,而eth0不行,表示添加策略成功//172.25.254.145
上面的更改为临时性更改,重启火墙服务后会消失
2、移除和添加网卡到域
1)移除 : firewall-cmd --remove-interface=eth1
2)添加 : firewall-cmd --get-active-zones
3、将网段添加到信任域 : firewall-cmd --add-source=192.168.0.0/24 --zone=trusted
firewall-cmd --list-all --zone=trusted
4、将服务移除出信任域:firewall-cmd --remove-source=192.168.0.145/24 --zone=trusted
5、将服务加入信任区域,其实只是将其端口加入允许列表,实验如下
1)先将http加入允许public域: firewall-cmd --add-service=http --zone=public
然后加如eth0和eth1: firewall-cmd --change-interface-eth1(/eth0) --zone=public
##注意:此时eth0和eth1也应该在添加在public域中,并且public域必须为激活(active)状态
2)此时两块网卡都可以访问
3)此时将http配置文件/etc/httpd/conf/httpd.conf这里改变为8080
4)改变完后,两块网卡都不能访问,即使http已经加入火墙允许列表
5)因为实际火墙默认http服务端口为80,在/usr/lib/firewalld/services/http.xml下可以查
6)所以为了可以使8080可以使用,可以将8080端口加入允许列表 :
firewall-cmd --zone=public --add-port=8080/tcp
firewall-cmd --list-all --zone=public
###还可以将/usr/lib/firewalld/services/hhtp.xml下的端口改为8080
测试:
用ssh服务来体现
1)用客户端先ssh链接到服务端: ssh [email protected]
2)此时将ssh移除出火墙允许列表(服务端),用reload重启服务 : firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
3)此时在用客户端在打开一个shell用ssh链接服务端,将被拒绝: ssh [email protected]
但是之前链接的只要没有退出来还可以继续使用
4)这时我们如果用complete-reload重启服务 firewall-cmd --complete-reload
之前链接的也将不能工作,会卡住,不能执行命令
reload改变之后的操作不影响之前的操作
complete-reload改变所有操作包括正在运行的
通过firewall-cmd工具,可以使用--direct选项在运行时间里增加或者移除链。如果不熟悉iptables,使用直接接口非常危险,因为可能无意间导致防火墙被入侵。直接端口模式使用于服务或者程序,以便在运行时间内增加特定的防火墙规则。直接端口模式添加的规则优先应用
1)firewall-cmd --direct --get-all-rules查看特定规则,如下图可以看到为空,下面我们进行编写实例
和iptables有点相似,规则: firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.0.245 -p tcp --dport 80 -j REJECT表示不允许172.25.254.245这个ip访问本机 ##添加规则
##参数filter(本地数据限制):(-s源地址,-d目的地址,-p协议,--dport端口,-j行为/REJECT拒绝/ACCEPT同意/DROP丢弃)
firewall-cmd --direct --get-all-rules ##列出规则
2)我们可以查看大条件是允许http服务,但上面我们编写了特定的规则,实验可以看到192.168.0.245的这台主机不能访问,但其他主机可以
3)下面我们将刚才编写的规则移除,再次编写在前面加入!,表示除了192.168.0.245这台主机以外,其他的主机不能访问http服务
firewall-cmd --direct --get-all-rules
firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -s 192.168.0.245 -p tcp ==dport 80 -j REJECT
firewall-cmd --direct --get-all-rules
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 ! -s 192168.0.245 -p tcp ==dport 80 -j REJECT
firewall-cmd --direct --get-all-rules
4)实验测试,此时只有172.25.254.245这台主机可以访问,其他不可以
firewall优先级先去direct规则里查找,如果有则按direct规则运行,如果没有则按默认list-all里的执行(默认允许就可以,没有就不行)
1)firewall-cmd --permanent--add-masquerade打开masquerade伪装功能
2)firewall-cmd --permanent --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.45
##使用22端口(ssh服 务)链接到本机的主机将其链接到172.25.254.45上
firewall-cmd--reload
firewall-cmd --list-all
3)测试客户端(172.25.254.245)连接172.25.254.145(服务端的ip)结果连接到了172.25.254.45上
ssh [email protected] ifconfig ##注意ssh连接时输入的密码为172.25.254.45的密码
firewall-cmd --permanent --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=172.25.254.45
firewall-cmd --reload
###将上一步还原
使用该方法,可以用比直接接口方式更易理解的方法建立复杂防火墙规则,此外,还能永久保留设置,这种语法使用关键词值
主要参数:source源地值,destination目的地址,service服务名称,port端口,protocol协议名
对desktop服务端 172.25.254.145 192.168.0.145
server 192.168.0.245
1、先将masuerade关掉 firewall-cmd --list-all firewall-cmd --permanent--remove-masquerade
2、用客户端访问172.25.254.145不能成功 ssh [email protected]
3、加入地址伪装firewall-cmd--add-rich-rule='rule family=ipv4 masquerade'
firewall-cmd --list-all
4、再次用客户端访问ssh [email protected]成功并且w查看,实际是192.168.0.245在连接(客户端的网关是服务端的ip192.168.0.145),显示是172.252.254.145在连接,实现伪装