Linux--firewalld服务

firewalld服务

firewalld 介绍

firewalld是CentOS 7.0新推出的管理netfilter的用户空间软件工具

firewalld是配置和监控防火墙规则的系统守护进程。可以实iptables,ip6tables,ebtables的功能

firewalld服务由firewalld包提供

firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则

归入zone顺序:

  • 先根据数据包中源地址,将其纳为某个zone
  • 纳为网络接口所属zone
  • 纳入默认zone,默认为public zone,管理员可以改为其它zone

网卡默认属于public zone,lo网络接口属于trusted zone

firewalld zone分类

zone名称 默认配置
trusted 允许所有流量
home 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量
internal 和home相同
work 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量
public 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于public zone
external 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。
dmz 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
block 拒绝除和传出流量相关的所有传入流量
drop 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

预定义服务

服务名称 配置
ssh Local SSH server. Traffic to 22/tcp
dhcpv6-client Local DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network
ipp-client Local IPP printing. Traffic to 631/udp.
samba-client Local Windows file and print sharing client. Traffic to 137/udp and 138/udp.
mdns Multicast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the 224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses.

firewalld预定义服务配置

  • firewall-cmd --get-services 查看预定义服务列表
  • /usr/lib/firewalld/services/*.xml预定义服务的配置

firewalld 三种配置方法

  • firewall-config (firewall-config包)图形工具
  • firewall-cmd (firewalld包)命令行工具
  • /etc/firewalld 配置文件,一般不建议
firewall-cmd 命令

firewall-cmd 格式

复制代码
Usage: firewall-cmd [OPTIONS...]

常见选项

复制代码
--get-zones     列出所有可用区域
--get-default-zone  查询默认区域
--set-default-zone=<ZONE> 设置默认区域
--get-active-zones  列出当前正使用的区域
--add-source=<CIDR>[--zone=<ZONE>]  添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source=<CIDR> [--zone=<ZONE>]  从指定区域删除源地址的流量,如无--zone= 选项,使用默认区域
--add-interface=<INTERFACE>[--zone=<ZONE>]  添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=<INTERFACE>[--zone=<ZONE>]   改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--add-service=<SERVICE> [--zone=<ZONE>] 允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service=<SERVICE> [--zone=<ZONE>]  从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE>]    从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域
--reload    删除当前运行时配置,应用加载永久配置
--list-services  查看开放的服务
--list-ports   查看开放的端口
--list-all [--zone=<ZONE>]     列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone= 选项,使用默认区域

范例:

复制代码
#查看默认zone
firewall-cmd --get-default-zone
#默认zone设为dmz
firewall-cmd --set-default-zone=dmz
#在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal  --add-source=192.168.0.0/24
#在internal zone中增加协议mysql的永久规则
firewall-cmd --permanent --zone=internal  --add-service=mysql
#加载新规则以生效
firewall-cmd  --reload

范例:配置firewalld

复制代码
systemctl mask iptables
systemctl mask ip6tables
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd  --get-default-zone
firewall-cmd  --set-default-zone=public
firewall-cmd  --permanent  --zone=public  --list-all
firewall-cmd  --permanent  --zone=public  --add-port  8080/tcp
firewall-cmd   ---reload
其它规则

当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则

  • rich-rules 富规则,功能强,表达性语言
  • Direct configuration rules 直接规则,灵活性差, 帮助:man 5 firewalld.direct
管理rich规则

rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率

规则实施顺序:

  • 该区域的端口转发,伪装规则
  • 该区域的日志规则
  • 该区域的允许规则
  • 该区域的拒绝规则

每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

rich语法:

复制代码
rule
  [source]
  [destination]
  service|port|protocol|icmp-block|masquerade|forward-port
  [log]
  [audit]
  [accept|reject|drop]

man 5 firewalld.richlanguage

rich规则选项

选项 描述
--add-rich-rule='' Add to the specified zone, or the default zone if no zone is specified.
--remove-rich-rule='' Remove to the specified zone, or the default zone if no zone is specified.
--query-rich-rule='' Query if has been added to the specified zone, or the default zone if no zone is specified. Returns 0 if the rule is present, otherwise 1.
--list-rich-rules Outputs all rich rules for the specified zone, or the default zone if no zone is specified.
rich规则实现

拒绝从192.168.0.11的所有流量,当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6

复制代码
firewall-cmd --permanent --zone=public --add-rich-rule='rule   family=ipv4 source address=192.168.0.11/32 reject'

限制每分钟只有两个连接到ftp服务

复制代码
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'

抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包

复制代码
firewall-cmd --permanent --add-rich-rule='rule protocol value=esp drop'

接受所有192.168.1.0/24子网端口5900-5905范围的TCP流量

复制代码
firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5900-5905 protocol=tcp accept'

rich日志规则

复制代码
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]

<LOGLEVEL> 可以是emerg,alert, crit, error, warning, notice, info, debug.
<DURATION> s:秒, m:分钟, h:小时, d:天
audit [limit value="<RATE/DURATION>"]

范例

复制代码
#接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept

#从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信息
firewall-cmd --add-rich-rule='rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' --timeout=300

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.X.10/32 service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com
伪装和端口转发

NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式

伪装NAT

复制代码
firewall-cmd --permanent --zone=<ZONE> --add-masquerade
firewall-cmd --query-masquerade  #检查是否允许伪装
firewall-cmd --add-masquerade   #允许防火墙伪装IP
firewall-cmd --remove-masquerade #禁止防火墙伪装IP

范例:

复制代码
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'

端口转发

端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪装才能实现

复制代码
firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=]

说明:toport= 和toaddr= 至少要指定一个

范例:

复制代码
#转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade  启用伪装
firewall-cmd --zone=public --add-forward-port=port=9527:proto=tcp:toport=80:toaddr=192.168.0.254

rich规则的port转发语法:

复制代码
forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]

范例:

复制代码
#转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=172.25.X.10/32 forward-port port=443 protocol=tcp to-port=22'
firewall-cmd --reload
ssh -p 443 serverX.example.com

范例:限制ssh服务非标准端口访问

复制代码
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
vim /etc/firewalld/services/ssh.xml 
<port protocol="tcp" port="999"/>
systemctl restart sshd.service
systemctl status -l sshd.service
sealert -a /var/log/audit/audit.log
semanage port -a -t ssh_port_t -p tcp 999
systemctl restart sshd.service
ss -tulpn | grep sshd
firewall-cmd --permanent --zone=work --add-source=172.25.X.0/24
firewall-cmd --permanent --zone=work --add-port=999/tcp
firewall-cmd --reload
相关推荐
L_0907几秒前
【Linux】进程状态
linux·开发语言·c++
啟明起鸣1 分钟前
【Nginx 网关开发】上手 Nginx,简简单单启动一个静态 html 页面
运维·c语言·前端·nginx·html
小生不才yz4 分钟前
shell编程 - 数据流指南
linux
lisanmengmeng9 分钟前
添加ceph节点
linux·服务器·ceph
Tinyundg13 分钟前
Linux系统分区
linux·运维·服务器
要做一个小太阳16 分钟前
华为Atlas 900 A3 SuperPoD 超节点网络架构
运维·服务器·网络·华为·架构
江畔何人初20 分钟前
service发现
linux·运维·云原生
life码农27 分钟前
Linux系统清空文件内容的几种方法
linux·运维·chrome
zbguolei32 分钟前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu
UP_Continue34 分钟前
Linux--基础IO
linux·运维·服务器