Redhat7(centos7)及以上防火墙完整介绍

防火墙

tcpwraps的配置

涉及两个文件 /etc/hosts.allow , /etc/hosts.deny
允许那个客户端来访问我的那个服务 就在/etc/hosts.allow里写
拒绝那个客户端来访问我的哪个服务 就在/etc/hosts.deny里写
格式:daemon1,daemon2,…:clent1 client2 …
比如:sshd:192.168.26.100,关键在于这条目到底是在allow里写还是deny里写。
注意:如果客户端是个网段的话,格式为:192.168.26.或者192.168.26.0/255.255.255.0, 不支持192.168.26.0/24这种写法
匹配规则:
首先到allow里进行匹配,如果匹配成功了,则允许通过,不通过再到deny里匹配
如果allow里没有匹配,则会到deny里匹配,如果匹配了,则是拒绝。
如果在deny里也没有匹配,结果是允许通过(相当于什么都没写)
注意、:编辑/etc/hosts.allow或者/etc/hosts.deny 保存之后,会立即生效,不需要重启什么服务。
注意匹配规则,先匹配allow,如果通过,就不匹配deny中,如,现在在allow中和deny中同时设置 10.233.3.226:
在这里插入图片描述
会发到10.233.3.226这台服务器上ssh这.225台服务器依然可以正常ssh:
在这里插入图片描述
现在去把allow中去掉,就无法连接了(注意:如果配了桥接网络,就需要把桥接网络的ip也添加进去,否则依然可以正常连接):
在这里插入图片描述
禁掉整个网段:
在这里插入图片描述
可以加关键词:EXCEPT 除了的意思。如现在拒绝10.233.3.整段,除了10.233.3.226,发现225是可以正常连接的:
在这里插入图片描述
ALL:全部 ,一般用于deny中,意思就是拒绝所有客户端,如现在我们只想要一台服务器可以连接到该服务器,则在allow中添加允许连接的服务器,在deny写上ALL即可:
在这里插入图片描述
并不是所有的服务都能使用她来进行控制的,ldd -v 查看哪些服务能使用她来控制,需要筛选一下,带wrap的就是允许反之不允许,如,查看sshd服务:ldd -v ’ which sshd` |grep wrap ('which '是反引号)
在这里插入图片描述

firewalld的概念

接口需要和某zone关联,从这个接口进来的所有数据包都要使用这个zone里的规则,如果某接口没有和任何的zone关联,则这个接口进来的数据包会使用默认的zone里的规则,一个接口只能和一个zone关联,或者不关联(默认)
在这里插入图片描述
打开图形化防火墙界面:firewall-config &
在这里插入图片描述
查看默认zone:firewall-cmd --get-default-zone
查看指定接口zone:firewall-cmd --get-zone-of-interface=网卡名称
查看所有zone;firewall-cmd --get-zones
在这里插入图片描述
更改默认zone:firewall-cmd --set-default-zone=****,如修改为trusted,再改回public(默认):
在这里插入图片描述
查看接口是和哪个zone关联的方法有2种:图形化和命令行,
图形化查看:firewall-config &
在这里插入图片描述
命令行查看:firewall-cmd --get-zone-of-interface=网卡名称,如果网卡名称错误和该网卡没有绑定zone都会提示no zone ,如查看ens160网卡的zone:firewall-cmd --get-zone-of-interface=ens160 :
在这里插入图片描述
指定接口新定义zone:firewall-cmd --add-interface=网卡名称 --zone=zone名称 ,在接口有zone的情况下在定义zone会报错:
在这里插入图片描述
(所以定义zone的时候需要先删除zone,在定义zone)删除zone:firewall-cmd --remove-interface=网卡名称 --zone=当前zone名称(查看:firewall-cmd --get-zone-of-interface=网卡名称):(了解即可,下面有命令可以直接更换zone)
在这里插入图片描述
也有命令直接更换(自行删除zone在定义到新zone,只是不需要手动删除而已):firewall-cmd --change-interface=网卡名称 --zone=新zone名称 ,如把zone换到home在换到public:
在这里插入图片描述

配置防火墙(服务、接口、端口)

防火墙配置有2种方法:图形化和命令行
在任何已配置的富规则都会显示在firewall-cmd --list-all 和 firewall-cmd --list-all-zone的输出结果中。具有语法解释如下所示:
在这里插入图片描述
注:以下使用中文版测试只是为了更方便了解,实际生产环境中,不要使用中文版的图形化配置,有bug,要使用英文版的配置,如果是中文环境,加上参数:LANG=C即可:LANG=C firewall-config &

图形化配置防火墙服务:

打开图形化界面:firewalld-config &
在这里插入图片描述
首先更改接口所属zone,已配置的接口(网卡名称)在zone中的接口处即可看到,如果所有zone中的接口都无内容,则代表没有接口配置到zone中,这里以ens160(网卡名称)为例:现在ens160属于public,这时候在其他zone中添加ens160会报错:
在这里插入图片描述
所以正确更改zone的步骤是:删除再添加,
在这里插入图片描述
这里添加到trusted中(不需要重启任何服务,配置即生效,图形化配置后命令行随即咳看到变化):
在这里插入图片描述
查看/开启/关闭某服务:勾上表示开启,未勾上表示关闭
在这里插入图片描述

添加开放端口:

在这里插入图片描述
其他功能按需设置吧,需要注意的是,上述方法设置服务均为临时生效,如果重启服务器或者重启防火墙服务均失效。如果要服务永久生效,需要把配置:运行时改为永久,注:设置永久仅对下次重启服务有效,对当前无效,所以一般要设置2次,运行时和永久都设置才是当前和永久生效)
在这里插入图片描述

命令行配置防火墙服务:

服务名称如何确定:firewall-cmd --get-services ,如:筛选http服务名:firewall-cmd --get-services |grep http
在这里插入图片描述
查看默认zone中是否开启了某服务:firewall-cmd --query-service=服务名
开启默认zone中的某服务(临时生效):firewall-cmd --add-service=服务名
关闭默认zone中的某服务(临时生效):firewall-cmd --remove-service=服务名
在这里插入图片描述
查看指定zone中是否开启了某服务:firewall-cmd --query-service=服务名 --zone=zone名
开启指定zone中的某服务(临时生效):firewall-cmd --add-service=服务名 --zone=zone名
关闭指定zone中的某服务(临时生效):firewall-cmd --remove-service=服务名 --zone=zone名
在这里插入图片描述
上述是设置临时生效的,现在说一下设置永久生效,方法和上面一样,之后后面需要加上参数:–permanent ,需要注意的是,设置永久是并不改变当前状态,所以设置永久和设置临时都需要操作,如:设置指定某zone中永久且当前生效开启http服务:
在这里插入图片描述
设置永久以后重启防火墙或者再次执行临时生效命令当前修改即当前且永久生效:
在这里插入图片描述
查看默认zone的指定端口是否存在:firewall-cmd --query-port=端口号/类型
添加默认zone的指定端口,以808为例:firewall-cmd --add=port=端口号/类型
删除默认zone的指定端口,以808为例:firewall-cmd --add=port=端口号/类型
在这里插入图片描述
指定zone和永久生效方法和上述一样(指定zone:–zone=**,永久参数:–permanent),这里就不一一做测试了,直接指定zone为home且永久生效吧:
在这里插入图片描述

ICMP过滤器

图形化:

ICMP过滤器,需要注意这里和服务是相反的,勾上的表示禁用,未勾上的表示启动。
在这里插入图片描述
ping的原理就是你发送一个request请求,我给你一个reply回应,为一个ping,测试:a服务器执行抓包:tcpdump -i ens160(网卡) icmp ,b服务ping a服务器ip -c2 ,然后回到a服务器看状态:
a服务器执行抓包:
在这里插入图片描述
b服务器加上参数-c2 ping该ip:
在这里插入图片描述
在到a服务器看状态:
在这里插入图片描述
如果不想别人能够ping通你 ,把echoo-request勾上即可:
在这里插入图片描述

命令行操作:

查看所有类型:firewall-cmd --get-icmptpes
在这里插入图片描述
查看单独某个类型有没有被勾上(默认zone,需要查看指定zone加上参数 --zone=zone名称):firewall-cmd --query-icmp-block=echo-request
在这里插入图片描述
开启禁pin功能(永久生效需要加上参数 --permanent):firewall-cmd --add-icmp-block=echo-request
在这里插入图片描述
别人ping该服务器状态为:
在这里插入图片描述
关闭禁ping功能:firewall-cmd --remove-icmp-block=echo-request

来源

图形化:

以http为例:
比如说当前ip设置了一个zone为public,但public并没有开启http服务,所以http并不能使用,但home这个zone中http可以使用,所以,我们在home这个zone的来源中添加一个ip段,这样,当前ip只要满足来源中ip段,则即可以使用public这个zone的规则和home这个zone的规则,即使public中http服务不能使用,但home中的http可以使用,当前服务器的http满足后者,所以http服务能正常使用:
在这里插入图片描述

命令行:

查看当前自定zone的所有规则:firewall-cmd --list-all --zone=zone名称:
在这里插入图片描述
添加来源(永久生效需要加上参数 --permanent):firewall-cmd --add-source=ip/掩码 --zone=zone名称
在这里插入图片描述
删除来源:firewall-cmd --remove-source=ip/掩码 --zone=zone名称

在这里插入图片描述

伪装、端口转发

IP地址伪装和端口转发都属于NAT(网络地址转换)。
地址伪装和端口转发的区别如下:
IP地址伪装:
1、通过地址伪装,NAT设备将经过设备的包转发到指定的接收方,同时将通过的数据包
2、源地址更改为其NAT设备自己的接口地址。当返回的数据包到达时,会将目的地址修改
3、为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。
4、类似于NAT技术中的端口多路复用(PAT)。IP地址伪装仅支持ipv4,不支持ipv6。
端口转发:
也可以称之为目的地址转换或端口映射。通过端口转发,将指定IP地址及端口的流量转发到相同计算机上的不同端口,或不同计算机上的端口。一般公司内网的服务器都采用私网地址,然后通过端口转发将使用私网地址的服务器发布到公网上。
在firewalld中,有一个富语言的概念,firewalld的富语言提供了一种不需要了解iptables语法的通过高级语言配置复杂的防火墙规则的机制,通过这种语言,可以表达firewalld的基本语法中不能实现的自定义防火墙规则。
富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录(面向syslog和auditd),以及端口转发、伪装和速率限制。

伪装配置:

测试需要3台服务器,关系如下图(内网和外网服务器均一张网卡即可,但模拟交换机需要两张网卡,内网和外网同时存在):
在这里插入图片描述
创建私网ip和模拟交换机内网,首先得保证这2台处于同一个网段,所以添加网卡信息的时候选择同一个vlan区。
在这里插入图片描述
设置内网ip和模拟交换机内网ip(模拟交换机一张网卡配内网,另一种网卡配外网):
在这里插入图片描述在这里插入图片描述
均需要重启网络。
模拟交换机上关闭networkmanager:/etc/init.d/NetworkManager stop
在这里插入图片描述
模拟交换机还需要开启转发功能,如图:
在这里插入图片描述
上述操作做完配置变完成了,下面开始测试:模拟交换机ping自己,ping私网网关和ping外网网关是能正常ping通的:
在这里插入图片描述
外网网关虽然能ping通,但ping外网ip的时候并ping不通:
在这里插入图片描述
原因:抓包看状态,首先外网服务器上执行抓包命令:tcpdump -i 网卡名称 icmp
在这里插入图片描述
交换机上再次ping外网ip:
然后回到外网服务器查看抓包状态:
在这里插入图片描述
解决模拟交换机能ping通外网网关,但ping不通外网服务器的情况有两种处理方法:1、通过交换机,2、通过伪装

1、 通过交换机处理(弊端:互联网上能看到私网地址):

route -n查看网关信息,发现外网服务器并没有设置网关,这时候把网关设置为和模拟交换机同样的网关即可:
在这里插入图片描述
此时在外网服务器抓包后再去交换机ping当前服务器,即可正常ping同,抓包状态为:
在这里插入图片描述
但是通过交换机接通外网方式互联网是能看到私网iP的,所以真正的服务器是不允许这样的,所以删除服务器配置的和交换机一样的网关:route del default gw 网关:
在这里插入图片描述

2、 通过伪装

因为只要ip位置完毕以后,伪装只需要勾上即可:
在这里插入图片描述
此时在外网服务器抓包后再去交换机ping当前服务器,即可正常ping同,抓包状态为:
在这里插入图片描述
通过命令行开启伪装:永久生效和指定zone需要加上参数 --permanent 和 --zone=zone名称
开启:firewall-cmd --add-masquerade
关闭:firewall-cmd --remove-masquerade
查看:firewall-cmd --list-all
在这里插入图片描述

端口转发:

在这里插入图片描述
测试首先在内网服务器和外网服务器均装上http:yum -y install http
启动该服务:systemctl start httpd
任意在内网服务器http中写入内容:echo inetnal xxxxx > /var/www/html/index.html
到模拟交换机把http服务关闭,因为不关闭 就会访问交换机的端口,而不会转发到内网端口:systemctl stop httpd

图形化配置:

然后再交换机服务器打开到端口转发添加规则:firewalld-config &
在这里插入图片描述
测试:这时外网是ping不通内网ip的,所以网页也是无法直接通过ip访问http中的内容的:
在这里插入图片描述
但是这时候访问模拟交换机ip(http默认使用80端口),发现访问的是内网内容:
在这里插入图片描述
上述是转发到其他服务器,下面说一下本地转发,以下图为例:就是说当你访问80端口的时候,通过本地转发,实际转发的就是22端口(原80端口将无法使用了)
在这里插入图片描述
测试:22是ssh端口,所以现在指定80端口 仍然能正常ssh过去:
在这里插入图片描述

命令行配置:

查看:firewall-cmd --list-all
在这里插入图片描述
注:永久生效和指定zone需要加上参数 --permanent 和 --zone=zone名称
添加端口转发到指定端口指定到服务器:firewall-cmd --add-forward-port=port=本地端口:proto=tcp/udp:toaddr=目标IP:toport=目标端口 ,如把模拟交换机的80端口指定到内网服务器的22端口:
在这里插入图片描述
测试:在外网服务器ssh交换机ip指定端口到内网服务器ssh 交换机ip -p 端口号:
在这里插入图片描述
删除端口转发::firewall-cmd --remove-forward-port=port=本地端口:proto=tcp/udp:toaddr=目标IP:toport=目标端口
在这里插入图片描述

富规则

富规则其实就是白名单,只允许添加到富规则中的ip能使用对应的功能。

图形化配置:

注:图形化富规则一定要使用英文版配置,否则会出bug,中文环境:LANG=C firewall-config &
以下图服务中http为例:需要注意的是,在富规则(可以理解为白名单)中添加内容并制定服务器后,就只有指定的ip才能使用该服务,但要在服务中把该功能的√去掉,否则添加这个富规则就没有意义。(下图右边中文仅仅用于方便看懂内容)
在这里插入图片描述

命令行配置:

命令行配置:注:永久生效和指定zone需要加上参数 --permanent 和 --zone=zone名称
添加服务:firewall-cmd --add-rich-rule ‘rule family=ipv4(产品线) source address=ip service(类型为服务) name=http(服务名称) accept’
删除服务:firewall-cmd --remove-rich-rule ‘rule family=ipv4(产品线) source address=ip service(类型为服务) name=http(服务名称) accept’
在这里插入图片描述
添加伪装:firewall-cmd --add-rich-rule ‘rule family=ipv4(产品线) source address=伪装ip masquerade’
删除伪装:firewall-cmd --remove-rich-rule ‘rule family=ipv4(产品线) source address=伪装ip masquerade’
在这里插入图片描述
添加端口:forewall-cmd --add-rich-rule ‘rule family=ipv4(产品线) source address=ip port(端口) port=端口号 protocol=tcp(类型) accept’
删除端口:forewall-cmd --remove-rich-rule ‘rule family=ipv4(产品线) source address=ip port(端口) port=端口号 protocol=tcp(类型) accept’
在这里插入图片描述
添加端口转发:firewall-cmd --add-rich-rule ‘rule family=ipv4(产品线) source address=ip forward-port port=80 protocol=tcp(类型) to-addr=ip(转发目的ip) to-port=22(转发目的ip端口号)’
删除端口转发:添加端口转发:firewall-cmd --remove-rich-rule ‘rule family=ipv4(产品线) source address=ip forward-port port=80 protocol=tcp(类型) to-addr=ip(转发目的ip) to-port=22(转发目的ip端口号)’
在这里插入图片描述

发布了67 篇原创文章 · 获赞 32 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/cuichongxin/article/details/103616498