简单介绍下firewall的架构(从官网复制的图)

clipboard.png

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

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注