firewall防火墙
简单介绍下firewall的架构(从官网复制的图)
1、核心层负责处理配置,其后端包括networkmanager iptables等等
2、firewalld的D_Bus接口主要用来创建和更改防火墙的配置
在RHEL7里有多种防火墙共存,默认使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。firewalld跟iptables比起来至少有两大好处:
1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
2、firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
简单说下firewall中比较重要的几个概念
1、service其实这个service跟域名类似,比如一个网站www.centosdoc.com, 我们访问的时候根本不用你关心他的具体IP地址,只需要域名就可以访问到这个网站,同理我可以在firewall上建立一个service(相当于域名),而这个service里面包含着需要具体放行的端口(相当于IP地址),如果这个应用的端口变更,我需要更改service里面的端口号即可。
2、zonezone 其实就是一些service规则集合,另外加一些默认规则比如(drop的默认规则是拒绝所有、truest的默认规则是放行)
查看所有的zone
# firewall-cmd –get-zones
zoneblock dmz drop external home internal public trusted work
在来说说firewall目录结构(说这个的用处是方便以后直接编辑配置文件而不需要操作命令行)
/etc/firewalld//usr/lib/firewalld/
/etc/firewalld/zones/里面存放当前正在使用的zone,/etc/firewalld/services里面存放自定义的service
示例:
1、新建一个自定义的service
#cat rabbitmq.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Rabbitmq</short>
<description>Rabbitmq is message system. You need the httpd package installed for this option to be useful.</description>
<port protocol="tcp" port="5672"/>
<port protocol="tcp" port="15672"/>
<port protocol="tcp" port="25672"/>
</service>
重新加载配置文件
#firewall-cmd –reload
success
查看是否将新建的服务加入到系统中
#firewall-cmd –get-services | tr " " "\n" | grep rabbit
rabbitmq
将rabbitmq service所包含的端口放开
#firewall-cmd –add-service=rabbitmq
success
查看当前加载的服务
# firewall-cmd –zone=public –list-services
ssh dhcpv6-client rabbitmq
查看防火墙运行状态
#firewall-cmd –state
查看当前放行的端口
#firewall-cmd –list-all
开启1234端口
#firewall-cmd –add-port=1234/tcp
移除tcp 1234端口
#firewall-cmd –remove-port=1234/tcp
查看当前的所用的zone及网络接口
#firewall-cmd –get-active-zones
查看当前接口的zone
#firewall-cmd –get-zone-of-interface=enp0s3
临时修改网络接口enp0s3为public 区域
#firewall-cmd –zone=public –change-interface=enp03s
永久修改网络接口enp0s3为public 区域
#firewall-cmd –permanent –zone=public –change-interface=enp03s
设置端口转发,将外部的222端口转发到65522端口
#firewall-cmd –zone=public –add-masquerade
#firewall-cmd –zone=public –add-forward-port=port=222:proto=tcp:toport=65522
将接口临时添加到public zone
#firewall-cmd –zone=public –add-interface=eth0
2、富规则
接受来自192.168.199.117IP的所有流量
# firewall-cmd –add-rich-rule 'rule family="ipv4" source address=192.168.199.117 accept'
拒绝来自192.168.199.117IP的到80端口的所有流量
# firewall-cmd –add-rich-rule 'rule family="ipv4" source address=192.168.199.117 port port=80 protocol=tcp reject'
允许来自192.168.199.110IP的TCP流量,转发到1080端口上
#firewall-cmd –add-rich-rule 'rule family=ipv4 source address=192.168.199.110 forward-port port=1080 protocol=tcp to-port=1080'
将发往80端口的tcp流量均转发到192.168.199.117的8080端口
firewall-cmd –add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.199.117'
将来自192.168.199.234访问80端口流量丢弃
firewall-cmd –add-rich-rule='rule family="ipv4" source address=192.168.199.234 service name=http drop'
每分钟允许10个新的连接访问https服务
#firewall-cmd –add-rich-rule="rule service name=https limit value=10/m accept"
允许IP地址192.168.199.234访问ssh服务,并且每小时审核两次,600秒后自动消失
# firewall-cmd –add-rich-rule="rule family=ipv4 source address=192.168.199.234 service name=ssh audit limit value=2/h reject" –timeout=600
将内网网段192.168.199.0/24网段的流量映射为网络出口公网IP
#firewall-cmd –zone=public –add-masquerade
#firewall-cmd –zone=public –add-rich-rule="rule family=ipv4 source address=192.168.199.0/24 masquerade"
列出当前富规则
firewall-cmd –list-rich-rules
流量转发命令格式为firewall-cmd –permanent –zone=<区域> –add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
3、 direct规则
######syn-flood:DROP######
#/sbin/iptables -N syn-flood
#/sbin/iptables -A INPUT -i eth0 -p tcp –syn -j syn-flood
#/sbin/iptables -A syn-flood -m limit –limit 1/s –limit-burst 4 -j RETURN
#/sbin/iptables -A syn-flood -j LOG –log-prefix "IPTABLES SYN-FLOOD:"
#/sbin/iptables -A syn-flood -j DROP
firewall-cmd –permanent –direct –add-chain ipv4 filter syn-flood
firewall-cmd –permanent –direct –add-rule ipv4 filter INPUT 100 -i enp0s3 -p icmp –icmp-type echo-request -j syn-flood
firewall-cmd –permanent –direct –add-rule ipv4 filter syn-flood 150 -m limit –limit 1/s –limit-burst 4 -j RETURN
firewall-cmd –permanent –direct –add-rule ipv4 filter syn-flood 151 -j LOG –log-prefix "IPTABLES SYN-FLOOD:"
firewall-cmd –permanent –direct –add-rule ipv4 filter syn-flood 152 -j DROP
查看当前direct规则
#firewall-cmd –direct –get-all-rules
注意事项:
如果不添加 –permanent,那么配置是即时生效的,如果添加 –permanent 则需要重载或重启后配置才会生效。另外如果需要永久生效,不只是添加规则需要添加此参数,移除规则时也同样需要添加,否则已经移除的规则会在重载或重启后被 firewalld 重新添加回启用的规则列表中。
参考:
https://firewalld.org/documentation
http://www.yam-web.net/centos7/direct-rule/index.html