firewalld
1.简介
firewalld是linux的防火墙命令工具,与iptables类似,本身和iptables一样只是命令行工具,真正实现防火墙是内置于linux内核里面的netfilter模块。但其命令无需理解netfilter的四表五链,相对于iptables会简单一些。也是centos7以后的默认防火墙命令行工具。
2 firewalld 和iptables的区别
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
- firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCPIP协议也不理解也可以实现大部分功能;
- firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制;
- firewalld加入了区域zone的概念。
3.区域
firewalld有区域的概念,而其防火墙隔离操作也是通过区域来进行隔离的
firewalld默认自带的区域:
trusted (信任)
允许所有的数据包流入与流出
home (家庭)
拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、 ipp-client、 amba-client与dhcpv6-client服务相关, 则允许流量
internal (内部)
等同于home区域
work (工作)
拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关, 则允许流量
public (公共)
拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关, 则允许流量
external (外部)
拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz (非军事区)
拒绝流入的流量,除非与流出的流量相关;而如果流量与5ssh服务相关,则允许流量
block (限制)
拒绝流入的流量,除非与流出的流量相关
drop (丢弃)
拒绝流入的流量,除非与流出的流量相关
默认网卡都加入到了公共的区域,也就是public。区域内可以加入网卡或者网段,默认为public区域,如加入网卡表示该网卡的所有流量都遵循该区域的规则,例如默认drop丢弃所有包,将网卡设置为drop即该网卡丢弃所有包。但如果将网段设置为一个区域,例如trust,此时该网段的所有包将允许。
则如果想实现黑名单拒绝所有,只允许白名单可以将网卡先设置为drop并允许部分网段
如果想实现某网段的部分端口放行,例如10.0.0.0/24仅放行其ssh,可以将该网段加入external区域(因其区域本身只允许ssh),但因默认所有网卡为public,此时建议把网卡设置为drop区域,这样仅10网段可以访问ssh且其他所有网段无法访问(如设置为trusted区域为所有网段皆允许但仅10网段限定智能访问其ssh端口)
4.firewall-cmd
firewall-cmd是firewalld服务的命令行工具,在firewall-cmd执行命令时,有两种生效方式:
runtime (运行时):修改规则马上生效,但是临时生效
permanent(持久配置):需要reload才能生效 ,但是永久生效
firewall-cmd相关命令参数:
zone区域相关指令:
–get-default-zone 查询默认的区域名称
–set-default-zone=xxx 设置默认的区域,使其永久生效
–get-active-zones 显示当前正在使用的区域与网卡名称
–get-zones 显示总共可用的区域
–new-zone= 新增区域
services服务相关指令
–get-services 显示预先定义好的服务
–add-service= 设置默认区域允许该服务的流量
–remove-service= 设置默认区域不再允许该服务的流量
port端口相关指令
-add-port=端口号/协议 设置默认区域允许该端口的流量
-remove-port=端口号/协议 设置默认区域不再允许该端口的流量
interface网卡相关指令:
–add-interface=网卡名 将源自该网卡的所有流量都导向某个指定区域
–change-interface=网卡名 将某个网卡与区域进行关联
其他相关指令:
–list-all 显示当前区域的网卡配置参数,资源,端口以及服务等信息
–reload 让永久生效的配置规则立即生效,并覆盖当前的配置规则
–zone 在对区域进行添加修改删除等配置时,指定对其某个区域进行操作。
在对区域添加或更改配置时,如没有指明–zone,则默认设置为当前默认的区域。
例如 firewall-cmd –add-port=8080/tcp
这里给防火墙加了一个8080允许的规则,一般firewalld默认是public,所以这时,这个规则会加到public里面,如果是想把这条规则加到drop里面
则:firewall-cmd –add-port=8080/tcp –zone=drop
firewall-cmd –list-all
显示当前区域的网卡配置参数,资源,端口以及服务等信息
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33 ens37 ens38
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
默认所有网卡都会在public区域,可以通过zone相关参数修改。默认支持的服务(端口)在services里面,如要添加允许的服务,可以通过–add-port(–add-services)。
例如允许81端口 :
firewall-cmd –permanent –add-port=81/tcp
firewall-cmd –reload
删除直接把add换成remove
禁用传统防火墙服务
systemctl mask iptables
systemctl mask ip6tables
systemctl mask ebtables
启动firewalld防火墙,并加入开机自启动服务
systemctl start/enable firewalld
备份firewalld配置文件
cp -rf /etc/firewalld/ /etc/firewalld_backup
案例:
案例一:
1.设定默认区域为drop (拒绝所有)
2.设置白名单IP访问,将源10.0.0.0/24网段加入trusted区域
//将当前默认区域修改为drop
[root@Firewalld ~]firewall-cmd –set-default-zone=drop
//将网络接口关联至drop区域
[root@Firewalld ~]firewall-cmd –permanent –change-interface=eth0 –zone=drop
将10.o.o.0/24网段加入trusted白名单
[root@Firewalld ~]# firewall-cmd –permanent –add-source=10.0.0.0/24 –zone=trusted
[rooteFirewalld ~]# firewall-cmd –reload
success
//查看当前处于活动的区域
firewall-cmd –get-active-zones
drop.默认区域,eth0接口流量都由drop区域过滤
interfaces: eth0
trusted.数据包的源IP是10.0.0.0网段走trusted区域
sources: 10.0.0.0/24
将网卡设置为drop区域以后,再将允许的网段加入trust区域,此时trust允许的网段能访问drop的网卡。
防火墙端口转发:
firewall-cmd –permanent –zone=<区域> –add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标ip地址>
此功能对应iptables nat表功能
1.转发本机555/tcp端口的流量至22/tcp端口,要求当前和长期有效
[root@Firewalld ~]# firewall-cmd –permanent –zone=public –add-forward-port=port=555:proto=tcp:toport=22:toaddr=10.0.0.61
success
[ root@Firewalld ~]# firewall-cmd –reload
success
2.移除本机转发的555/tcp端口策略,要求当前和长期有效
[root@Firewalld -]firewall-cmd –remove-forward-port=port=555:proto=tcp:toport=22:toaddr=10.0.0.61
success
[ rooteFirewalld ~].firewall-cmd –reload
success
3.如果需要将本地的10.0.0.81:6666端口转发至后端172.16.1.8:22端口
1.开启IP伪装
[root@Firewalld ~]# firewall-cmd –add-masquerade –permanent
2.配置转发
[root@Firewalld ~]# firewall-cmd –permanent –zone=public
–add-forward-port=port=6666:proto=tcp:toport=22:toaddr=172.16.1.8
[ root@Firewalld ~].firewall-cmd –reload
此时ssh访问10 6666端口即连接到172.16.1.8:22
防火墙富规则策略:
firewalld中的富规则表示更细致,更详细的防火墙策略配置,可以针对系统服务,端口号,源地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有防火墙策略中也是最高的。
帮助:man firewalld.richlanguage
firewall-cmd –add-rich-rule=’rule’
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
rule [ family=”ipv4 lipv6””]
source address=”address [ /rmask]”[invert=”True”]
destination address=”address [/mask] “ invert=”True”
service name=”service name”
port port=”port value” protocol=”tcp|udp”
protocol value=”protocoi value”
forward-port port=”port value” protocol=”tcp|udp” to-port=”port value” to-addr=”address”
log [prefix=”prefix text”] [level=”log level”] [limit value=”rate/duration”]
accept|reject [type=”reject type”] | drop
//区里的富规则按先后顺序匹配,按先匹配到的规则生效。
–add-rich-rule=KFUJLE>’//在指定的区添加一条富规则
–remove-rich-rule=’’//在指定的区删除一条富规则
–query-rich-rule=’’ 1/找到规则返回0,找不到返回1
–iist-rich-rules/列出指定区里的所有富规则
–list-all 和 –list-all-zones也能列出存在的富规则
1.允许10.0.0.0/24网段中10.0.0.1主机访问http服务,其他同网段主机无法访问,当前和永久生效
#1.加入10.0.0.0/24所有主机至public区域
[root@mo1 ~]# firewall-cmd –permanent –add-source=10.0.0.0/24 –zone=public
#2.仅允许public中的10.0.0.1主机访问http
[rootCmo1 ~]# firewall-cmd –permanent –zone=public –add-rich-rule= ‘rule family=ipv4 source address=10.0.0.1/32 port port=80 protocol=tcp accept”
#3.重载firewalld防火墙
[root@m01 ~]# firewall-cmd –reload
2.拒绝10.0.0.0/24网段中的10.0.0.9主机发起的ssh请求,当前和永久生效
[rootCmo1 ~]# fireuall-cmd –permanent –zone=public –add-rich-rulem ‘rule family-ipv4 source address=10.0.0.9/32 service name=ssh drop’
[ root@me1 ~]# firewall-cmd –reload
success
3.将远程10.0.0.1主机请求firewalld的5551端口,转发至firewalld防火墙的22端口
[rootCmo ~]# firewall-cmd –permanent –zone=public –add-rich-rule= ‘rule family=ipv4 source address=10.0.0.1/32 forward-port port=5551 protocol=tcp to-port=22’
[ root@mo1 ~]# firewall-cmd –reload
success
4.将远程10.0.0.1主机请求firewalld的6661端口,转发至后端主机10.0.0.9的22端口
[ root@mo1 ~]# firewall-cmd –add-masquerade –permanent
[ root@mo1 ]# firewall-cmd –permanent –zone=public –add-rich-rule=’rule family=ipv4 source address=10.0.0.1/32 forward-port port=6661 protocol=tcp to-port=22 to-addr=10.0.0.9’
success
[root@me1]# firewall-cmd –reload
防火墙开启内部上网:
环境
主机1(防火墙主机) 外网ip 内网ip
主机2 内网ip
主机2的内网ip需要与主机1的内网ip位于同一环境,此时主机2 的内网ip无法直接与互联网进行通信
主机2配置:
gateway指定其主机1的内网ip,dns需设置(114.114.114.114)。
然后重启网卡
nmcli c down ens33 &&nmcli c up ens33
主机1配置:
firewall-cmd –permanet –add-masquerade (开启主机转发)
然后即可通信
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!