当前位置 : 首页 » 文章分类 :  开发  »  Linux-FirewallD

Linux-FirewallD

CentOS7 以上的发行版都自带了 FirewallD 防火墙的,FirewallD 取代了 iptables 防火墙。
https://firewalld.org/


FirewallD 防火墙打开端口操作示例

1、开放 8802 端口
firewall-cmd –add-port=8802/tcp –per
firewall-cmd –add-port=8750-8754/tcp –per 这样写好像不起作用

2、重启防火墙
firewall-cmd –reload

3、查看规则
firewall-cmd –list-all


FirewallD 防火墙富规则屏蔽端口操作示例

默认网段加入白名单

启动 firewalld 防火墙,默认会屏蔽 ssh/dhcpv6 外的入站流量,所以启动后要快速将当前网段加入白名单,否则会造成此服务器上大量服务不可访问

下面的命令示例启动防火墙,将私有网段加入白名单,重启使规则生效

systemctl start firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8"  accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.0/12"  accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16"  accept'
firewall-cmd --reload

禁止指定网段访问指定端口

禁止 10 网段访问 8080 端口

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port=8080 protocol=tcp reject'
firewall-cmd --reload

开放指定网段访问指定端口

开放 10 网段访问 8080 端口

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port=8080 protocol=tcp reject'
firewall-cmd --reload

查看防火墙规则

# firewall-cmd --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
    rule family="ipv4" source address="10.0.0.0/8" accept
    rule family="ipv4" source address="10.0.0.0/8" port port="8080" protocol="tcp" reject
    rule family="ipv4" source address="172.16.0.0/12" accept
    rule family="ipv4" source address="192.168.0.0/16" accept

简介

相较于 iptables 防火墙而言,firewalld 最大的改动是 支持动态更新技术,并加入了区域(zone)的概念
简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

在实现原理层面上,firewalld 和 iptables 的区别:
iptables 的防火墙策略是交由内核层面的 netfilter 网络过滤器来处理的,而 firewalld 则是交由内核层面的 nftables 包过滤框架来处理。

功能上,firewalld 跟 iptables 比起来至少有两大好处:
1、firewalld 可以动态修改单条规则,而不需要像 iptables 那样,在修改了规则后必须得全部刷新才可以生效。
2、firewalld 在使用上要比 iptables 人性化很多,即使不明白“五张表五条链”而且对 TCP/IP 协议也不理解也可以实现大部分功能。

firewalld 支持 IPv4 和 IPv6, 还支持以太网桥,并有分离运行时间和永久性配置选择。

22 端口默认加入了允许规则,但其他比如 http 80 端口,以及其他中间件的 tcp 端口都是不通的。

配置文件

firewalld 存放配置文件有两个目录:
/usr/lib/firewalld 存放默认的配置文件
/etc/firewalld 存放用户自定义的数据,所以我们添加的service或者rule都在此目录中,在 /etc/firewalld/firewalld.conf 中,配置 firewall 可以直接编辑配置文件,也可以使用 firewall-cmd 命令行工具。

zone区域

zone 区域就是一套规则集合

区域及默认规则策略

  • 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 隔离区网络,拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
  • block 限制,拒绝流入的流量,除非与流出的流量相关
  • drop 丢弃,拒绝流入的流量,除非与流出的流量相关

firewalld的默认行为

firewalld 的默认区域是 public,不允许除 ssh/dhcpv6 外的入站流量,允许出站流量
不做任何配置启动 firewalld 后,从外访问服务器内部如果没有添加规则默认是阻止,从服务器内部访问服务器外部默认是允许


systemctl启停firewalld

#开启服务
systemctl start firewalld
systemctl start firewalld.service

#关闭防火墙
systemctl stop firewalld

#开机自动启动
systemctl enable firewalld

#关闭开机自动启动
systemctl disable firewalld.service

#查看状态
systemctl status firewalld

firewall-cmd 管理命令

执行 firewall-cmd 命令时,如果没有带 --permanent 参数表示配置立即生效,但是不会对该配置进行存储,相当于重启服务器就会丢失。如果带上 --permanent 则会将配置存储到配置文件,但是这种仅仅是将配置存储到文件,却并不会实时生效,需要执行 firewall-cmd --reload 命令重载配置才会生效

–state 查看firewalld运行状态

sudo firewall-cmd --state 查看 firewalld 运行状态,running 表示运行,not running 表示停止

–list-all 查看public规则

firewall-cmd --list-all 只显示 /etc/firewalld/zones/public.xml 中防火墙策略

# firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces:   列出这个区域上关联的接口
  sources:  列出这个区域的源。现在这里什么都没有,如果这里有内容,它们应该是这样的格式 xxx.xxx.xxx.xxx/xx。
  services: dhcpv6-client ssh  列出允许通过这个防火墙的服务。可运行 firewall-cmd --get-services 得到一个防火墙预定义服务的详细列表。
  ports: 80/tcp 10050/tcp 10051/tcp 列出允许通过这个防火墙的目标端口。(即 需要对外开放的端口)
  protocols:   协议值可以是一个协议 ID 数字,或者一个协议名
  masquerade: no   表示这个区域是否允许 IP 伪装。如果允许,它将允许 IP 转发,它可以让你的计算机作为一个路由器。
  forward-ports:   列出转发的端口
  sourceports:
  icmp-blocks:   阻塞的 icmp 流量的黑名单。
  rich rules:    在一个区域中优先处理的高级配置。

Interfaces (接口)是系统中的硬件和虚拟的网络适配器的名字,所有的活动的接口都将被分配到区域,要么是默认的区域,要么是用户指定的一个区域。但是,一个接口不能被分配给多于一个的区域。

Sources (源)是入站 IP 地址的范围,它也可以被分配到区域。一个源(或重叠的源)不能被分配到多个区域。这样做的结果是产生一个未定义的行为,因为不清楚应该将哪些规则应用于该源。

–list-all-zones 查看所有域的规则

firewall-cmd --list-all-zones 显示 /etc/firewalld/zones/ 下的所有策略


域管理

–get-zones 查看所有域

firewall-cmd --get-zones 查看所有域

# firewall-cmd --get-zones
work drop internal external trusted home dmz public block

–get-active-zones 查看活动域

firewall-cmd --get-active-zones 显示当前正在使用的区域与网卡名称

–get-default-zone 查看默认域

firewall-cmd --get-default-zone 查询默认的区域名称

–set-default-zone 设置默认域

firewall-cmd --set-default-zone=public 设置默认分区为 public, 立即生效,不需要重新加载防火墙

# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success

–get-service 查看支持的服务

firewall-cmd --get-service 查看所有支持的服务

# firewall-cmd --get-service
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

firewall-cmd --get-service --permanent 查看永久选项所支持的服务,即重启后也支持的

# firewall-cmd --get-service --permanent
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

–panic-on 关闭全部端口

firewall-cmd --panic-on 开启应急模式,阻断所有网络连接
firewall-cmd --panic-off 关闭应急模式
firewall-cmd --query-panic 查看应急模式的状态


–reload 重载配置(不断开连接)

firewall-cmd --reload 重新加载防火墙规则,但不断开已有连接。

–complete-reload 重载配置(断开连接)

firewall-cmd --complete-reload 重新加载防火墙规则,需要断开连接

两者的区别就是第一个无需断开连接,就是 firewalld 特性之一动态添加规则,第二个需要断开连接,类似重启服务


端口管理

–add-port 开放端口

firewall-cmd --zone=public --add-port=8080-8081/tcp 开放 public 域的 8080-8081 端口,立即生效但重启后失效
firewall-cmd --zone=public --add-port=8080-8083/tcp --permanent 开放 public 域的 8080-8083 端口,需reload后生效但会保存到配置文件重启后还生效。

1、开启 1-9000 端口

firewall-cmd --add-port=1-9000/tcp --permanent
firewall-cmd --reload

–remove-port 关闭端口

firewall-cmd --remove-port=8500/tcp --permanent 关闭全部域的 8500 端口,需reload后生效但会保存到配置文件重启后还生效。
firewall-cmd --zone=public --remove-port=8500/tcp --permanent 关闭 public 域的 8500 端口,永久生效。(测试发现关闭 public 域的 8500 端口后 work 域等的同端口也会关闭)

1、屏蔽 8500 端口

# firewall-cmd --remove-port=8500/tcp --permanent
Warning: NOT_ENABLED: 8500:tcp
success
# firewall-cmd --reload
# firewall-cmd --query-port=8500/tcp
no

2、屏蔽 1-9000 端口

firewall-cmd --remove-port=1-9000/tcp --permanent
firewall-cmd --reload

–query-port 查看某个端口是否开放

firewall-cmd --query-port=8500/tcp 查看 8500 端口是否开放
firewall-cmd --zone=public --query-port=8500/tcp 查看 publict 域的 8500 端口是否开放

# firewall-cmd --query-port=8500/tcp
no

–list-ports 查看端口开放

firewall-cmd --permanent --zone=public --list-ports 查看特定域下开启的端口,结果空格隔开


富规则

富规则语法

rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
destination address="address[/mask]" invert="True"
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol 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

富规则的优先级

Rich Rule Priorities
https://firewalld.org/2018/12/rich-rule-priorities

富规则支持优先级字段 priority 之前,是通过规则的行为进行排序的:
log 规则始终在 deny 规则之前,deny 规则始终在 allow 规则之前,所以规则执行顺序为:log > drop/reject > accept
这导致用户感到困惑,因为它隐式地对规则进行了重新排序。 这也使得不可能添加全面的rich规则来拒绝流量。

新版的 firewalld 添加了新的 priority 字段。它可以是 -32768 到 32767 之间的任何数字,其中数字越小,优先级越高。此范围足够大,以允许从脚本或其他实体自动生成规则。
只需在你想优先执行的 rich 规则中给 priority 字段定义一个足够小的负数,就能确保能优先于其他 drop/reject 规则被 firewalld 匹配
例如

firewall-cmd --add-rich-rule='rule priority=1234 service name="mdns" allow'

–add-rich-rule=’xx’ 添加富规则

1、屏蔽 8123 端口

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port=8123 reject'
firewall-cmd --reload

2、屏蔽 172.16.0.0/12 网段访问 8380 端口

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.0/12" port port=8380 protocol=tcp reject'
firewall-cmd --reload

3、允许指定网段访问

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8"  accept'
firewall-cmd --reload

–remove-rich-rule=’xx’ 删除富规则

1、取消屏蔽 8123 端口

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port=8123 reject'
firewall-cmd --reload

2、删除规则:屏蔽 172.16.0.0/12 网段访问 8380 端口

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="172.16.0.0/12" port port=8380 protocol=tcp reject'
firewall-cmd --reload

–query-rich-rule==’xx’ 查询富规则

–list-rich-rules 列出指定域的所有富规则

# firewall-cmd --list-rich-rules
rule family="ipv4" source address="192.168.0.0/16" accept
rule family="ipv4" source address="10.0.0.0/8" accept
rule family="ipv4" source address="172.16.0.0/12" accept
rule family="ipv4" source address="100.64.0.0/10" accept

服务管理

–add-service 开放服务

firewall-cmd --zone=public --add-service=https 启用 https 服务,立即生效但重启后失效
firewall-cmd --permanent --zone=public --add-service=https 启用 https 服务,需reload后生效但会保存到配置文件重启后还生效。

–list-services 查看服务开放

firewall-cmd --permanent --zone=public --list-services 查看特定域下开启的服务,服务空格隔开

# firewall-cmd --permanent --zone=public --list-services
dhcpv6-client ssh

–add-forward-port 端口转发

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=3753 将22端口转发到3753端口,使用tcp协议

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.1.11 将发往22端口的程序包转发到地址是192.168.1.11下相同的端口

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.11 将22端口的数据包转发到192.168.1.11下的2055端口


上一篇 Linux-iptables

下一篇 MySQL-Performance_Schema

阅读
评论
3.7k
阅读预计16分钟
创建日期 2022-03-17
修改日期 2022-03-17
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论