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

Linux-FirewallD

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


简介

相较于 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 命令行工具。

/etc/firewalld 下的配置会覆盖默认配置。


配置集(实时和永久)

FirewallD 使用两个配置集:“运行时”和“持久”:在系统重新启动或重新启动 FirewallD 时,不会保留运行时的配置更改,而对持久配置集的更改不会应用于正在运行的系统。

默认情况下,firewall-cmd 命令适用于运行时配置,但使用 –permanent 标志将保存到持久配置中。

想要配置持久化且实时生效,可以:
1、将规则同时添加到持久规则集和运行时规则集中:

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http

2、将规则添加到持久规则集中并重新加载 FirewallD:

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

firewalld和iptables对比

在RHEL7里,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables。
firewalld是iptables的前端控制器,用于实现持久的网络流量规则。

1,firewalld 可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。而 iptables,在修改了规则后必须得全部刷新才可以生效;

2,firewalld 使用区域和服务而不是链式规则;

3,firewalld 默认是拒绝的,需要设置以后才能放行。而 iptables 默认是允许的,需要拒绝的才去限制

4,firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现。也就是说,firewalld 和 iptables 一样,它们的作用都用于维护规则,而真正使用规则干活的是内核的 netfilter。只不过 firewalld 和 iptables 的结果以及使用方法不一样!


zone区域

zone 区域就是一套规则集合。

“区域”是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。

不同的区域允许不同的网络服务和入站流量类型,首次启用 FirewallD 后,public 将是默认区域。

区域及默认规则策略

  • 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 后,从外访问服务器内部如果没有添加规则默认是阻止,从服务器内部访问服务器外部默认是允许

如何激活zone?

将网卡(interface) 或 源 IP 添加到一个 zone 即激活这个域。

firewalld如何选择使用哪个zone?

每个 zone 就是一套规则集,但是有那么多 zone,对于一个具体的请求来说应该使用哪个 zone(哪套规则)来处理呢?

对于一个接受到的请求具体使用哪个 zone,firewalld 是通过三种方法来判断的:
1、source,也就是源地址 优先级最高
2、interface,接收请求的网卡 优先级第二
3、firewalld.conf 中配置的默认 zone 优先级最低

这三个的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface 去查找,如果前两个都找不到才会使用第三个,即 firewalld.conf 中配置的默认zone。


systemctl启停firewalld

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

#关闭防火墙
systemctl stop firewalld

#开机自动启动
systemctl enable firewalld

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

#查看状态
systemctl status firewalld

Linux 查看被防火墙拒绝的数据包日志

开启 firewalld 日志记录

方法1、编辑 /etc/firewalld/firewalld.conf 配置文件
找到 LogDenied,默认值是 off,即关闭,改为 LogDenied=all,然后 firewall-cmd --reload 重载防火墙即可。
默认情况下,LogDenied 选项是关闭的。LogDenied 选项用于打开日志记录规则。 可设置为:all, unicast, broadcast, multicast 和 off(全部,单播,广播,多播和关闭。)

方法2、使用 firewall-cmd 管理命令
firewall-cmd --get-log-denied 查看 deny 日志开启状态
firewall-cmd --set-log-denied=all 开启 deny 日志

查看Linux系统日志

方法1、journalctl -xef 查看系统服务日志

Sep 06 11:34:46 centos7-hostname kernel: FINAL_REJECT: IN=cni0 OUT= PHYSIN=vethaec10155 MAC=1a:4a:0f:41:6e:01:a2:8c:fe:1e:95:e9:08:00 SRC=127.0.0.2 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=53446 DF PROTO=TCP SPT=54206 DPT=10252 WINDOW=28200 RES=0x00 SYN URGP=0

方法2、查看 /var/log/messages 日志文件

Sep  6 11:56:20 centos7-hostname kernel: FINAL_REJECT: IN=cni0 OUT= PHYSIN=vethd39d8451 MAC=1a:4a:0f:41:6e:01:e6:26:c2:49:e9:f6:08:00 SRC=127.0.0.2 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=32121 DF PROTO=TCP SPT=44976 DPT=8500 WINDOW=28200 RES=0x00 SYN URGP=0

Sep  7 17:08:42 centos7-hostname kernel: FINAL_REJECT: IN=eth0 OUT= MAC=6c:92:bf:ba:d4:9c:00:00:89:89:00:01:08:00 SRC=127.0.0.1 DST=127.0.0.2 LEN=60 TOS=0x10 PREC=0x00 TTL=53 ID=29333 DF PROTO=TCP SPT=34794 DPT=3306 WINDOW=29200 RES=0x00 SYN URGP=0 MARK=0x4000

方法3、dmesg 查看内核日志

[3616737.139961] FINAL_REJECT: IN=cni0 OUT= PHYSIN=vethd39d8451 MAC=1a:4a:0f:41:6e:01:e6:26:c2:49:e9:f6:08:00 SRC=127.0.0.2 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=16961 DF PROTO=TCP SPT=53854 DPT=8500 WINDOW=28200 RES=0x00 SYN URGP=0

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/ 下的所有策略


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

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

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

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

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


域管理

–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

区域来源管理

可以使用区域根据来源管理流入流量,可以对传入流量进行排序,并将其路由到不同区域,以允许或禁止该流量可以到达的服务。
如果将源添加到区域,则该区域将变为活动状态,并且来自该源的任何传入流量将通过它

–list-sources 查看区域的源IP列表

firewall-cmd –zone=trusted –list-sources –permanent

–add-source 添加源IP到区域

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 --permanent 将源ip网段 192.168.1.0/24 添加到 trusted 域,此命令会自动激活 trusted 域,之后来自 192.168.1.0/24 网段的全部流量都会使用 trusted 域,即全部允许。

–remove-source 从区域删除源IP列表

firewall-cmd –zone=trusted –remove-source=192.168.1.0 –permanent


panic 恐慌模式(应急模式)

打开恐慌模式(应急模式)可切断全部网络通信来应对网络攻击,而不用像之前那样通过物理拔除网线来进行断网操作,防止了系统在多网口环境中一次性插拔所有网线可能带来的混乱以及由此引发的系统恢复后延续问题。

–panic-on 打开恐慌模式(切断全部流量)

firewall-cmd --panic-on 开启应急模式,阻断所有网络连接

–panic-off 关闭恐慌模式

firewall-cmd --panic-off 关闭应急模式

–query-panic 查询恐慌模式状态

firewall-cmd --query-panic 查看应急模式的状态


端口管理

–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 添加富规则

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 删除富规则

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

–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

服务管理

服务相当于端口的别名,底层还是端口管理。
但是,虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。

–list-services 查看开放的服务

firewall-cmd --list-services 查看当前区域内被允许的服务
firewall-cmd --permanent --zone=public --list-services 查看特定域下开启的服务,服务空格隔开

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

–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

–add-service 开放服务

firewall-cmd --add-service=<service-name> 添加具体服务,服务名称用户可以根据自己的实际需求从预定义服务名称中选取合适的服务名进行添加。
完成之后用户可以使用命令 firewall-cmd --runtime-to-permanent 将对运行时的修改保存为永久。

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

–remove-service 删除服务

firewall-cmd --remove-service=<service-name> 移除服务


–direct 直接iptables规则

firewall-cmd --direct 可直接使用 iptables 命令添加规则。
firewall-cmd --permanent --direct 或直接编辑 /etc/firewalld/direct.xml 来进行 direct 规则的持久化。


–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端口


masquerade IP转发

centos 系统安装好后运行于主机模式,并没有开启包转发功能。即系统只处理目的地为本机的数据包,不会转发发往其他地址的数据包。在内核中有相应配置选项 net.ipv4.ip_forward 默认设置为0。可以通过命令 sysctl net.ipv4.ip_forward=1 手动开启包转发功能。

防火墙的 masquerade 功能进行地址伪装(NAT),私网访问公网或公网访问私网都需要开启此功能来进行地址转换,否则无法正常互访。通过命令 firewall-cmd --add-masquerade 开启此功能,开启之后 net.ipv4.ip_forward 的值自动被设置为1,即 centos 启用包转发。如果启用了 masquerade 而不启用包转发的设置是没有意义的,相当于只有本机的数据能进出网络接口,那么NAT就没有意义了。

masquerade IP 转发,IP 伪装,NAT 转发

–query-masquerade 查看是否开启IP转发

firewall-cmd --query-masquerade --zone=public 查看指定zone是否开启IP转发

# firewall-cmd --query-masquerade
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'trusted' (see --get-active-zones)
You most likely need to use --zone=trusted option.

yes

–add-masquerade 打开IP转发

firewall-cmd --permanent --zone=public --add-masquerade 打开IP转发

–remove-masquerade 关闭IP转发

firewall-cmd --permanent --zone=public --remove-masquerade 关闭IP转发

Docker 容器内无法访问外网问题

问题:
打开 firewalld 防火墙后,默认 public 域是不限制出站流量的,但 Docker/k8s 容器内无法访问其他 IP

原因:
未打开 masquerade IP转发

解决:
firewall-cmd --query-masquerade --zone=public public 域打开IP转发


配置示例

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

1、开放 8802 端口
firewall-cmd –zone=public –add-port=8472/tcp –permanent 开放8472端口
firewall-cmd –zone=public –add-port=2379-2380/tcp –permanent 开放2379-2380端口

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

FirewallD 防火墙允许指定IP全部流量配置

方法1、将指定 IP 网段加入 trusted 域
将源ip网段 192.168.1.0/24 添加到 trusted 域,此命令会自动激活 trusted 域,之后来自 192.168.1.0/24 网段的全部流量都会使用 trusted 域,即全部允许。

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 --permanent
firewall-cmd --reload

方法2、使用富规则允许指定网段访问

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

Kubernetes/k8s 集群中开启 FirewallD 防火墙

1、启动防火墙,默认屏蔽除 ssh/dhcp 外全部入站流量,出站流量不屏蔽。
全部节点执行:

systemctl start firewalld

2、集群内各节点全互通访问,假设共 192.168.1.1,192.168.1.2 两个节点,每个节点上执行:

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.1 --permanent
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.2 --permanent

3、打开 IP 转发,默认是关闭状态,不打开会导致 容器网络(非主机网络)Pod内无法访问外网
全部节点执行:

firewall-cmd --add-masquerade --permanent

4、k8s master 节点开放 k8s 相关端口:

firewall-cmd --zone=public --add-port=80/tcp --permanent    # ingress
firewall-cmd --zone=public --add-port=6443/tcp --permanent  # k8s api server
firewall-cmd --zone=public --add-port=10255/tcp --permanent # k8s api-server
firewall-cmd --zone=public --add-port=8472/tcp  --permanent # k8s Flannel
firewall-cmd --zone=public --add-port=2379-2380/tcp   --permanent  # k8s etcd
firewall-cmd --zone=public --add-port=10250-10252/tcp --permanent  # k8s kubelet scheduler controller-manager

5、k8s master 节点打开其他需要从容器网络访问的 service 端口

firewall-cmd --zone=public --add-port=8500/tcp --permanent  # 若不开通非主机网络无法访问consul-service
firewall-cmd --zone=public --add-port=8123/tcp --permanent  # 若不开通非主机网络无法访问8123端口对应的k8s service
firewall-cmd --reload
firewall-cmd --list-all

6、k8s worker 节点开放端口:

firewall-cmd --zone=public --add-port=8472/tcp  --permanent # k8s Flannel
firewall-cmd --zone=public --add-port=10250/tcp --permanent # k8s api-server
firewall-cmd --zone=public --add-port=10255/tcp --permanent # k8s api-server
firewall-cmd --reload
firewall-cmd --list-all

Setting up the Firewall Rules
https://docs.oracle.com/en/operating-systems/olcne/1.1/start/ports.html#ports-single

Kubernetes on CentOS 7 with Firewalld
https://medium.com/platformer-blog/kubernetes-on-centos-7-with-firewalld-e7b53c1316af

Best Practices to keeping Kubernetes Clusters Secure
https://devopstales.github.io/kubernetes/k8s-security/


上一篇 Linux-iptables

下一篇 MySQL-Performance_Schema

阅读
评论
6.4k
阅读预计28分钟
创建日期 2022-03-17
修改日期 2022-09-14
类别
目录
  1. 简介
    1. 配置文件
    2. 配置集(实时和永久)
    3. firewalld和iptables对比
  2. zone区域
    1. firewalld的默认行为
    2. 如何激活zone?
    3. firewalld如何选择使用哪个zone?
  3. systemctl启停firewalld
  4. Linux 查看被防火墙拒绝的数据包日志
    1. 开启 firewalld 日志记录
    2. 查看Linux系统日志
  5. firewall-cmd 管理命令
    1. –state 查看firewalld运行状态
    2. –list-all 查看public规则
    3. –list-all-zones 查看所有域的规则
    4. –reload 重载配置(不断开连接)
    5. –complete-reload 重载配置(断开连接)
    6. 域管理
      1. –get-zones 查看所有域
      2. –get-active-zones 查看活动域
      3. –get-default-zone 查看默认域
      4. –set-default-zone 设置默认域
    7. 区域来源管理
      1. –list-sources 查看区域的源IP列表
      2. –add-source 添加源IP到区域
      3. –remove-source 从区域删除源IP列表
    8. panic 恐慌模式(应急模式)
      1. –panic-on 打开恐慌模式(切断全部流量)
      2. –panic-off 关闭恐慌模式
      3. –query-panic 查询恐慌模式状态
    9. 端口管理
      1. –add-port 开放端口
      2. –remove-port 关闭端口
      3. –query-port 查看某个端口是否开放
      4. –list-ports 查看端口开放
    10. 富规则
      1. 富规则的优先级
      2. –add-rich-rule 添加富规则
      3. –remove-rich-rule 删除富规则
      4. –list-rich-rules 查询指定域的所有富规则
    11. 服务管理
      1. –list-services 查看开放的服务
      2. –get-service 查看可配置的服务列表
      3. –add-service 开放服务
      4. –remove-service 删除服务
    12. –direct 直接iptables规则
    13. –add-forward-port 端口转发
    14. masquerade IP转发
      1. –query-masquerade 查看是否开启IP转发
      2. –add-masquerade 打开IP转发
      3. –remove-masquerade 关闭IP转发
      4. Docker 容器内无法访问外网问题
  6. 配置示例
    1. FirewallD 防火墙打开端口操作示例
    2. FirewallD 防火墙富规则屏蔽端口操作示例
      1. 默认网段加入白名单
      2. 禁止指定网段访问指定端口
      3. 开放指定网段访问指定端口
      4. 查看防火墙规则
    3. FirewallD 防火墙允许指定IP全部流量配置
    4. Kubernetes/k8s 集群中开启 FirewallD 防火墙

页面信息

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

评论