FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。 以前的 system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的连接。 相反,firewall daemon 动态管理防火墙,不需要重启整个防火墙便可应用更改。因而也就没有必要重载所有内核防火墙模块了。不过,要使用 firewall daemon 就要求防火墙的所有变更都要通过该守护进程来实现,以确保守护进程中的状态和内核里的防火墙是一致的。另外,firewall daemon 无法解析由 ip*tables 和 ebtables 命令行工具添加的防火墙规则。 守护进程通过 D-BUS 提供当前激活的防火墙设置信息,也通过 D-BUS 接受使用 PolicyKit 认证方式做的更改。
“守护进程” 通过所谓的直接接口,其他的服务(例如 libvirt )能够通过 iptables 变元(arguments)和参数(parameters)增加自己的规则。 amanda 、ftp 、samba 和 tftp 服务的 netfilter 防火墙助手也被“守护进程”解决了,只要它们还作为预定义服务的一部分。附加助手的装载不作为当前接口的一部分。由于一些助手只有在由模块控制的所有连接都关闭后才可装载。因而,跟踪连接信息很重要,需要列入考虑范围。
静态防火墙(system-config-firewall/lokkit) 在软件安装,初次启动或者是首次联网时,将会出现一个选择器。通过它你可以选择要使用的防火墙方案。其他的解决方案将保持完整,可以通过更换模式启用。 firewall daemon 独立于 system-config-firewall,但二者不能同时使用。
使用iptables和ip6tables的静态防火墙规则 yum install iptables-services systemctl mask firewalld.service systemctl enable iptables.service systemctl enable ip6tables.service 静态防火墙规则配置文件是 /etc/sysconfig/iptables 以及 /etc/sysconfig/ip6tables . 注: iptables 与 iptables-services 软件包不提供与服务配套使用的防火墙规则. 这些服务是用来保障兼容性以及供想使用自己防火墙规则的人使用的. 你可以安装并使用 system-config-firewall 来创建上述服务需要的规则. 为了能使用 system-config-firewall, 你必须停止 firewalld. 为服务创建规则并停用 firewalld 后,就可以启用 iptables 与 ip6tables 服务了: systemctl stop firewalld.service systemctl start iptables.service systemctl start ip6tables.service
什么是区域?
预定义的服务
端口和协议
ICMP阻塞
伪装
端口转发
哪个区域可用?
丢弃
阻塞
公开
外部
隔离区(dmz)
工作
家庭
内部
受信任的
我应该选用哪个区域?
如何配置或者增加区域?
如何为网络连接设置或者修改区域 如果这个连接受到 NetworkManager 控制,你也可以使用 nm-connection-editor 来修改区域。
由NetworkManager控制的网络连接 为了简化,自此,网络连接将被用作与区域的关系。 如果一个接口断开了,NetworkManager也将告诉firewalld从区域中删除该接口。 当firewalld由systemd或者init脚本启动或者重启后,firewalld将通知NetworkManager把网络连接增加到区域。
由脚本控制的网络 区域定义了本区域中防火墙的特性:
使用firewalld
使用firewall-cmd
一般应用 firewall-cmd --state 此举返回 firewalld 的状态,没有任何输出。可以使用以下方式获得状态输出: firewall-cmd --state && echo "Running" || echo "Not running" 在 Fedora 19 中, 状态输出比此前直观: # rpm -qf $( which firewall-cmd ) firewalld-0.3.3-2.fc19.noarch # firewall-cmd --state not running 在不改变状态的条件下重新加载防火墙: firewall-cmd --reload 如果你使用–complete-reload,状态信息将会丢失。这个选项应当仅用于处理防火墙问题时,例如,状态信息和防火墙规则都正常,但是不能建立任何连接的情况。 获取支持的区域列表 firewall-cmd --get-zones 这条命令输出用空格分隔的列表。 获取所有支持的服务 firewall-cmd --get-services 这条命令输出用空格分隔的列表。 获取所有支持的ICMP类型 firewall-cmd --get-icmptypes 这条命令输出用空格分隔的列表。 列出全部启用的区域的特性 firewall-cmd --list-all-zones 输出格式是: <zone> interfaces: <interface1> .. services: <service1> .. ports: <port1> .. forward-ports: <forward port1> .. icmp-blocks: <icmp type1> .. .. 输出区域 <zone> 全部启用的特性。如果生略区域,将显示默认区域的信息。 firewall-cmd [--zone=<zone>] --list-all 获取默认区域的网络设置 firewall-cmd --get-default-zone 设置默认区域 firewall-cmd --set-default-zone=<zone> 流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。 获取活动的区域 firewall-cmd --get-active-zones 这条命令将用以下格式输出每个区域所含接口: <zone1>: <interface1> <interface2> .. <zone2>: <interface3> .. 根据接口获取区域 firewall-cmd --get-zone-of-interface=<interface> 这条命令将输出接口所属的区域名称。 将接口增加到区域 firewall-cmd [--zone=<zone>] --add-interface=<interface> 如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。 修改接口所属区域 firewall-cmd [--zone=<zone>] --change-interface=<interface> 这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。 从区域中删除一个接口 firewall-cmd [--zone=<zone>] --remove-interface=<interface> 查询区域中是否包含某接口 firewall-cmd [--zone=<zone>] --query-interface=<interface> 返回接口是否存在于该区域。没有输出。 列举区域中启用的服务 firewall-cmd [ --zone=<zone> ] --list-services 启用应急模式阻断所有网络连接,以防出现紧急状况 firewall-cmd --panic-on 禁用应急模式 firewall-cmd --panic-off
查询应急模式 firewall-cmd --query-panic 此命令返回应急模式的状态,没有输出。可以使用以下方式获得状态输出: firewall-cmd --query-panic && echo "On" || echo "Off"
处理运行时区域 启用区域中的一种服务 firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>] 此举启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。如果服务已经活跃,将不会有任何警告信息。 例: 使区域中的ipp-client服务生效60秒: firewall-cmd --zone=home --add-service=ipp-client --timeout=60 例: 启用默认区域中的http服务: firewall-cmd --add-service=http 禁用区域中的某种服务 firewall-cmd [--zone=<zone>] --remove-service=<service> 此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。 例: 禁止home区域中的http服务: firewall-cmd --zone=home --remove-service=http 区域种的服务将被禁用。如果服务没有启用,将不会有任何警告信息。 查询区域中是否启用了特定服务 firewall-cmd [--zone=<zone>] --query-service=<service> 如果服务启用,将返回1,否则返回0。没有输出信息。 启用区域端口和协议组合 firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>] 此举将启用端口和协议的组合。端口可以是一个单独的端口 <port> 或者是一个端口范围 <port>-<port> 。协议可以是 tcp 或 udp。 禁用端口和协议组合 firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol> 查询区域中是否启用了端口和协议组合 firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol> 如果启用,此命令将有返回值。没有输出信息。 启用区域中的IP伪装功能 firewall-cmd [--zone=<zone>] --add-masquerade 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。 禁用区域中的IP伪装 firewall-cmd [--zone=<zone>] --remove-masquerade 查询区域的伪装状态 firewall-cmd [--zone=<zone>] --query-masquerade 如果启用,此命令将有返回值。没有输出信息。 启用区域的ICMP阻塞功能 firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype> 此举将启用选中的Internet控制报文协议(ICMP)报文进行阻塞。ICMP报文可以是请求信息或者创建的应答报文,以及错误应答。 禁止区域的ICMP阻塞功能 firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype> 查询区域的ICMP阻塞功能 firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype> 如果启用,此命令将有返回值。没有输出信息。 例: 阻塞区域的响应应答报文: firewall-cmd --zone=public --add-icmp-block=echo-reply 在区域中启用端口转发或映射 firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。 禁止区域的端口转发或者端口映射 firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 查询区域的端口转发或者端口映射 firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 如果启用,此命令将有返回值。没有输出信息。 例: 将区域home的ssh转发到127.0.0.2 firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
处理永久区域 获取永久选项所支持的服务 firewall-cmd --permanent --get-services 获取永久选项所支持的ICMP类型列表 firewall-cmd --permanent --get-icmptypes 获取支持的永久区域 firewall-cmd --permanent --get-zones 启用区域中的服务 firewall-cmd --permanent [--zone=<zone>] --add-service=<service> 此举将永久启用区域中的服务。如果未指定区域,将使用默认区域。 禁用区域中的一种服务 firewall-cmd --permanent [--zone=<zone>] --remove-service=<service> 查询区域中的服务是否启用 firewall-cmd --permanent [--zone=<zone>] --query-service=<service> 如果服务启用,此命令将有返回值。此命令没有输出信息。 例: 永久启用 home 区域中的 ipp-client 服务 firewall-cmd --permanent --zone=home --add-service=ipp-client 永久启用区域中的一个端口-协议组合 firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> 永久禁用区域中的一个端口-协议组合 firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol> 查询区域中的端口-协议组合是否永久启用 firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol> 如果服务启用,此命令将有返回值。此命令没有输出信息。 例: 永久启用 home 区域中的 https (tcp 443) 端口 firewall-cmd --permanent --zone=home --add-port=443/tcp 永久启用区域中的伪装 firewall-cmd --permanent [--zone=<zone>] --add-masquerade 此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。 永久禁用区域中的伪装 firewall-cmd --permanent [--zone=<zone>] --remove-masquerade 查询区域中的伪装的永久状态 firewall-cmd --permanent [--zone=<zone>] --query-masquerade 如果服务启用,此命令将有返回值。此命令没有输出信息。 永久启用区域中的ICMP阻塞 firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype> 此举将启用选中的 Internet 控制报文协议 (ICMP) 报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文或错误应答报文。 永久禁用区域中的ICMP阻塞 firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype> 查询区域中的ICMP永久状态 firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype> 如果服务启用,此命令将有返回值。此命令没有输出信息。 例: 阻塞公共区域中的响应应答报文: firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply 在区域中永久启用端口转发或映射 firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口 <port> 或者是端口范围 <port>-<port> 。协议可以为 tcp 或udp 。目标端口可以是端口号 <port> 或者是端口范围 <port>-<port> 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。 永久禁止区域的端口转发或者端口映射 firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 查询区域的端口转发或者端口映射状态 firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> } 如果服务启用,此命令将有返回值。此命令没有输出信息。 例: 将 home 区域的 ssh 服务转发到 127.0.0.2 firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
直接选项 选项–direct需要是直接选项的第一个参数。 将命令传递给防火墙。参数 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行参数。 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args> 为表 <table> 增加一个新链 <chain> 。 firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain> 从表 <table> 中删除链 <chain> 。 firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain> 查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1. firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain> 如果启用,此命令将有返回值。此命令没有输出信息。 获取用空格分隔的表 <table> 中链的列表。 firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table> 为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。 firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args> 从表 <table> 中删除带参数 <args> 的链 <chain>。 firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args> 查询带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1. firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args> 如果启用,此命令将有返回值。此命令没有输出信息。 获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔。 firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>
当前的firewalld特性
区域
服务
ICMP类型
直接接口
运行时配置
永久配置
托盘小程序
图形化配置工具
命令行客户端
对于ebtables的支持
/usr/lib/firewalld中的默认/备用配置
/etc/firewalld中的系统配置设置 为了手动修改预定义的 icmp 类型,区域或者服务,从默认配置目录将配置拷贝到相应的系统配置目录,然后根据需求进行修改。 如果你加载了有默认和备用配置的区域,在 /etc/firewalld下的对应文件将被重命名为 <file>.old 然后启用备用配置。
正在开发的特性 Fedora 19 提供了带有 D-Bus 和命令行支持的富语言特性第2个里程碑版本。第3个里程碑版本也将提供对于图形界面 firewall-config 的支持。 对于此特性的更多信息,请参阅: firewalld Rich Language
锁定 Fedora 19 提供了锁定特性的第二个里程碑版本,带有 D-Bus 和命令行支持。第3个里程碑版本也将提供图形界面 firewall-config 下的支持。 更多信息请参阅: firewalld Lockdown
永久直接规则
从ip*tables和ebtables服务迁移 此特性将需要大量复杂防火墙配置的迁移测试。
计划和提议功能
对于conntrack的支持
用户交互模型
用户策略支持
端口元数据信息(由 Lennart Poettering 提议) 元数据信息可以用来为防火墙制定简单的规则。下面是一些例子:
这里的元数据信息不只有特定应用程序,还可以是一组使用情况。例如:组“全部共享”或者组“文件共享”可以对应于全部共享或文件共享程序(如:torrent 文件共享)。这些只是例子,因而,可能并没有实际用处。
这里是在防火墙中获取元数据信息的两种可能途径:
sysctld 另一个例子是 net.ipv4.ip_forward ,防火墙设置、libvirt 和用户/管理员更改都需要它。如果有两个应用程序或守护进程只在需要时开启 ip_forwarding ,之后可能其中一个在不知道的情况下关掉服务,而另一个正需要它,此时就不得不重启它。 sysctl daemon 可以通过对设置使用内部计数来解决上面的问题。此时,当之前请求者不再需要时,它就会再次回到之前的设置状态或者是直接关闭它。
防火墙规则 动态防火墙有附加的防火墙功能链。这些特殊的链按照已定义的顺序进行调用,因而向链中添加规则将不会干扰先前调用的拒绝和丢弃规则。从而利于创建更为合理完善的防火墙配置。 下面是一些由守护进程创建的规则,过滤列表中启用了在公共区域对 ssh , mdns 和 ipp-client 的支持: *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :FORWARD_ZONES - [0:0] :FORWARD_direct - [0:0] :INPUT_ZONES - [0:0] :INPUT_direct - [0:0] :IN_ZONE_public - [0:0] :IN_ZONE_public_allow - [0:0] :IN_ZONE_public_deny - [0:0] :OUTPUT_direct - [0:0] -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j INPUT_direct -A INPUT -j INPUT_ZONES -A INPUT -p icmp -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i lo -j ACCEPT -A FORWARD -j FORWARD_direct -A FORWARD -j FORWARD_ZONES -A FORWARD -p icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A OUTPUT -j OUTPUT_direct -A IN_ZONE_public -j IN_ZONE_public_deny -A IN_ZONE_public -j IN_ZONE_public_allow -A IN_ZONE_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT -A IN_ZONE_public_allow -d 224.0.0.251/32 -p udp -m udp --dport 5353 -m conntrack --ctstate NEW -j ACCEPT -A IN_ZONE_public_allow -p udp -m udp --dport 631 -m conntrack --ctstate NEW -j ACCEPT 使用 deny/allow 模型来构建一个清晰行为(最好没有冲突规则)。例如: ICMP块将进入 IN_ZONE_public_deny 链(如果为公共区域设置了的话),并将在 IN_ZONE_public_allow 链之前处理。
该模型使得在不干扰其他块的情况下向一个具体块添加或删除规则而变得更加容易。 |