防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制。在RHEL7系统中,firewalld防火墙取代了iptables防火墙。iptables与firewalld都不是真正的防火墙,而是一种服务,是用来定义防火墙策略的防火墙管理工具。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
1.1、iptables
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
- 在进行路由选择前处理数据包(PREROUTING);即SNAT源地址转换。
- 处理流入的数据包(INPUT);WANàLAN。
- 处理流出的数据包(OUTPUT);LANàWAN。
- 处理转发的数据包(FORWARD);
- 在进行路由选择后处理数据包(POSTROUTING);即DNAT目的地址转换。
ACCEPT(允许流量通过)、REJECT(告诉对方拒绝流量通过)、LOG(记录日志信息)、DROP(不告诉对方拒绝流量通过)。其中,DROP(不告诉对方拒绝流量通过)直接将流量丢弃而且不响应;REJECT(告诉对方拒绝流量通过)则会在拒绝流量后再回复一条“您的信息已经收到,但是被扔掉了”信息,从而让流量发送方清晰地看到数据被拒绝的响应信息。
iptables是一款基于命令行的防火墙策略管理工具。iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量。防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。
iptables中常用的参数以及作用:
参数 |
作用 |
-P |
设置默认策略 |
-F |
清空规则链 |
-L |
查看规则链 |
-A |
在规则链的末尾加入新规则 |
-I num |
在规则链的头部加入新规则 |
-D num |
删除某一条规则 |
-s |
匹配来源地址IP/MASK,加叹号“!”表示除这个IP外 |
-d |
匹配目标地址 |
-i 网卡名称 |
匹配从这块网卡流入的数据 |
-o 网卡名称 |
匹配从这块网卡流出的数据 |
-p |
匹配协议,如TCP、UDP、ICMP |
--dport num |
匹配目标端口号,格式:--dport num或--dport=num |
--sport num |
匹配来源端口号,格式:--sport num或--sport=num |
[root@linuxprobe ~]# iptables -L
//查看规则链
[root@linuxprobe ~]# iptables -F
//清空规则链
[root@linuxprobe ~]# iptables -P INPUT DROP
//设置INPUT规则链的默认策略为拒绝DROP,其它拒绝的策略动作使用REJECT。使用-P参数后不再使用-j参数。
[root@linuxprobe ~]# iptables -I INPUT -p icmp -j ACCEPT
//向INPUT规则链中添加允许ICMP流量进入的策略规则
[root@linuxprobe ~]# iptables -D INPUT 2
//删除INPUT规则链中的策略(策略编号2)
[root@linuxprobe ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport=22 -j ACCEPT
[root@linuxprobe ~]# iptables -I INPUT -p tcp --dport=22 -j REJECT
//将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量。
--dport后面可用=号跟端口号,也可用空格跟端口号。
[root@linuxprobe ~]# iptables -I INPUT -s 192.168.20.0/24 -d 192.168.10.10 -p tcp --dport=80 -j REJECT
//向INPUT规则链中添加拒绝192.168.20.0/24子网访问192.168.10.10的80端口(Web服务)的策略规则。
[root@linuxprobe ~]# iptables -A INPUT -p tcp --dport=1000:2000 -j REJECT
[root@linuxprobe ~]# iptables -A INPUT -p udp --dport=1000:2000 -j REJECT
//向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则。如果要限制某个端口的全部流量则需要配置匹配TCP和UDP的流量。
注意:iptables命令配置的防火墙规则默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,还要执行保存命令:[root@linuxprobe ~]#service iptables save
1.2、firewalld
RHEL7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。
firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本。
firewall-config是firewalld防火墙配置管理工具的GUI(图形用户界面)版本。
区域(zone)是firewalld预先准备的防火墙策略集合(或策略模板)。用户可以根据场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
firewalld中常用的区域名称及策略规则(匹配从本机外部INPUT进入网卡的流量):
- public:默认当前正在使用的区域。注:public、DMZ、external、internal区域只允许选中的服务通过。
- trusted:默认允许所有流入的流量(没有开放任何服务)。
- drop:默认拒绝所有流入的流量(任何流入网络的包都被丢弃,不作出任何响应,只允许流出的网络连接。即使开放了某些服务(比如http),这些服务的数据也是不允许通过)。
说明:默认情况下是允许所有类型的ICMP通过。
1.2.1、firewalld防火墙配置管理工具CLI(命令行界面):firewall-cmd
firewall-cmd命令中使用的参数以及作用:
参数 |
作用 |
--get-default-zone |
查询默认的区域名称 |
--set-default-zone=<区域名称> |
设置默认的区域,使其永久生效 |
--get-zones |
显示可用的区域 |
--get-services |
显示预先定义的服务 |
--get-active-zones |
显示当前正在使用的区域与网卡名称 |
--add-source= |
将源自此IP或子网的流量导向指定的区域 |
--remove-source= |
不再将源自此IP或子网的流量导向某个指定区域 |
--add-interface=<网卡名称> |
将源自该网卡的所有流量都导向某个指定区域 |
--change-interface=<网卡名称> |
将某个网卡与区域进行关联,与“--zone=区域”结合使用。 |
--list-all |
显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--list-all-zones |
显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
--add-service=<服务名> |
设置默认区域允许该服务的流量 |
--add-port=<端口号/协议> |
设置默认区域允许该端口的流量 |
--remove-service=<服务名> |
设置默认区域不再允许该服务的流量 |
--remove-port=<端口号/协议> |
设置默认区域不再允许该端口的流量 |
--reload |
让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
--panic-on |
开启应急状况模式 |
--panic-off |
关闭应急状况模式 |
firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效,参需要系统重启之后才能自动永久生效。让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。
//执行yum install firewalld命令进行安装
//启动:systemctl start firewalld
//关闭:systemctl stop firewalld
//查看状态:systemctl status firewalld
//查看状态:firewall-cmd --state
//开机启用:systemctl enable firewalld
//开机禁用:systemctl disable firewalld
//firewalld的默认区域配置文件位置在/etc/firewalld/zones/下的.xml文件中。
[root@linuxprobe ~]# firewall-cmd --state
running
//查看firewall的运行状态
[root@linuxprobe ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sun 2020-03-08 11:20:14 CST; 22min ago
Main PID: 1034 (firewalld)
CGroup: /system.slice/firewalld.service
└─1034 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Mar 08 11:20:13 linuxprobe.com systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 08 11:20:14 linuxprobe.com systemd[1]: Started firewalld - dynamic firewall daemon.
//查看firewall服务状态
===========================================================
[root@linuxprobe ~]# firewall-cmd --set-default-zone=public
success
//设置firewalld服务默认所使用的区域。
[root@linuxprobe ~]# firewall-cmd --get-default-zone
public
//查看firewalld服务默认所使用的区域。
===========================================================
[root@linuxprobe ~]# firewall-cmd --set-default-zone=trusted
success
//设置firewalld服务当前所使用的区域为trusted。
[root@linuxprobe ~]# firewall-cmd --get-default-zone
trusted
//trusted区域设置成功。
===========================================================
[root@linuxprobe ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@linuxprobe ~]# firewall-cmd --get-services
amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
[root@linuxprobe ~]# firewall-cmd --get-active-zones
public
interfaces: eno16777736
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-source=192.168.20.0/24
Success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-source=192.168.20.0/24
success
===========================================================
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736
external
//查询eno16777738网卡在firewalld服务中的区域。
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --change-interface=eno16777736
success
[root@linuxprobe ~]# firewall-cmd --get-zone-of-interface=eno16777736
external
[root@linuxprobe ~]# firewall-cmd --permanent --get-zone-of-interface=eno16777736
public
//把firewalld服务中eno16777736网卡的默认区域external修改为public,需要在系统重启后生效。分别查看当前与永久模式下的区域名称。
===========================================================
[root@linuxprobe ~]# firewall-cmd --panic-on
[root@linuxprobe ~]# firewall-cmd --panic-off
//启动或关闭firewalld防火墙服务的应急状况模式,阻断一切进出流量的网络连接(当远程控制服务器时请慎用)。
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=http
Success
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-service=https
success
//把firewalld服务中请求http和https协议的流量设置为永久允许。
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http
no
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
no
//未立即生效前查询public区域是否允许请求http和https协议的流量。
[root@linuxprobe ~]# firewall-cmd --reload
Success
//立即生效
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=http
Yes
[root@linuxprobe ~]# firewall-cmd --zone=public --query-service=https
yes
//立即生效前查询public区域是否允许请求http和https协议的流量。
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --remove-service=http
success
[root@linuxprobe ~]# firewall-cmd --reload
Success
//把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效。
===========================================================
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-port=8080-8090/tcp
success
[root@linuxprobe ~]# firewall-cmd --reload
success
[root@linuxprobe ~]# firewall-cmd --zone=public --list-ports
8080-8090/tcp
//把在firewalld服务中访问8080至8090端口的流量策略设置为允许,且立即生效。
===========================================================
端口转发(访问端口A时转发到端口B)配置:
命令格式:firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
[root@linuxprobe ~]# firewall-cmd --reload
success
//把原本访问192.168.10.10主机888端口的流量转发到22端口,要求当前和长期均有效,并立即生效。
在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:
[root@linuxprobe ~]#ssh -p 888 192.168.10.10
===========================================================
firewalld富规则(优先级在所有的防火墙策略中是最高的):
firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务/端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" destination address="192.168.10.10" service name="ssh" accept log level=warning audit"
success
[root@linuxprobe ~]# firewall-cmd --reload
success
//在firewalld服务中配置一条富规则,使其允许192.168.10.0/24网段的所有用户访问192.168.10.10主机的ssh服务(22端口),同时记录告警日志并审计。
1.2.2、firewalld防火墙配置管理工具GUI(图形用户界面):firewall-config
[root@linuxprobe ~]# firewall-config
①:选择运行时(Runtime)模式或永久(Permanent)模式配置。如要使配置的策略立即生效,可通过option菜单中的Reload Firewalld实现。
②:可选的策略集合区域(策略或区域模板)列表。
③:常用的系统服务列表,可在永久(Permanent)模式下自定义服务(先定义名称,在名称中再添加端口和协议)。
④:当前正在使用的区域,可通过option菜单中的Change Default Zone进行修改。
⑤:管理(选择为允许、不选为拒绝)当前使用区域被选中的服务。与⑫对应。
⑥:管理(自定义)当前被选中区域中的端口。
⑦:开启或关闭SNAT(源地址转换)协议技术。
⑧:设置端口转发策略,即客户端访问外部虚拟端口A转发到内部真实端口B。
⑨:控制请求icmp服务的流量。
⑩:管理防火墙的富规则。如:服务或端口、协议、端口转发、SNAT源地址转换,ACCEPT允许或REJECT拒绝的动作,源和目标地址,是否记录日志及日志的级别,是否审计。
⑪:管理网卡设备。把网卡与区域(策略)进行绑定。
⑫:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与该服务相关的流量。与⑤对应。
⑬:firewall-config工具的运行状态。默认区域(可通过option菜单中的Change Default Zone进行修改),应急状况模式(Panic Mode)是否启用(enabled或disabled)。
来源:oschina
链接:https://my.oschina.net/u/3706537/blog/3189813