FirewallD是防火墙用于实现持久化网络流量规则的前端控制器。它提供命令行和图形界面,可在大多数Linux发行版中使用。与直接控制iptables相比,使用FirewallD有两个主要区别:
注意FirewallD是iptables之上的一层封装,可以更轻松地管理iptables规则 - 它不是 iptables的替代品。虽然FirewallD仍然可以使用iptables命令,但建议仅使用FirewallD的命令。
本指南将向您介绍FirewallD及其区域和服务的概念,并向您展示一些基本配置步骤。
默认情况下,CentOS 7中已经包含FirewallD,但它处于非活动状态。控制它其实与其他系统单元相同。
1.要启动该服务并在启动时启用FirewallD:
sudo systemctl start firewalld
sudo systemctl enable firewalld
要停止并禁用它:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
2.检查防火墙状态。输出应该是提示running
或者not running
。
sudo firewall-cmd --state
3.要查看FirewallD守护程序的状态:
sudo systemctl status firewalld
输出示例:
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
Active: active (running) since Wed 2015-09-02 18:03:22 UTC; 1min 12s ago
Main PID: 11954 (firewalld)
CGroup: /system.slice/firewalld.service
└─11954 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
4.重新加载FirewallD配置:
sudo firewall-cmd --reload
Firewalld使用XML文件配置。除了非常特殊的配置之外,应使用firewall-cmd而不是这些xml文件。
配置文件位于两个目录中:
/usr/lib/FirewallD
默认配置,比如默认区域和公共服务。避免修改它们,因为每个firewalld包更新都会覆盖这些文件。/etc/firewalld
系统配置文件,这些文件将覆盖默认配置。Firewalld使用两个配置表:Runtime(运行时表)和Permanent(持久化表)。重启系统或重新启动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
注意reload命令将删除所有运行时配置并应用永久配置。因为firewalld动态管理规则集,所以它不会破坏现有的连接和会话。
区域是针对给定位置或场景(例如,家庭,公共,受信任等)可能具有的不同信任级别的预构建规则集。不同的区域允许不同的网络服务和传入的流量类型,同时拒绝其他一切。首次启用FirewallD,Public是默认区域。
区域也可以应用于不同的网络接口。例如内网和外网,您可以在内网使用DHCP,但在外网上只允许HTTP和SSH。未明确设置为特定区域的任何接口都将附加到默认区域。
要查看默认区域:
sudo firewall-cmd --get-default-zone
要更改默认区域:
sudo firewall-cmd --set-default-zone=internal
要查看网络接口使用的区域:
sudo firewall-cmd --get-active-zones
输出示例:
public
interfaces: eth0
要获取特定区域的所有配置:
sudo firewall-cmd --zone=public --list-all
输出示例:
public (default, active)
interfaces: ens160
sources:
services: dhcpv6-client http ssh
ports: 12345/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
要获取所有区域的所有配置:
sudo firewall-cmd --list-all-zones
输出示例:
block
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
...
work
interfaces:
sources:
services: dhcpv6-client ipp-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
FirewallD基于配置规则对于特定网络服务过滤不同数据。可以创建自定义服务规则并将其添加到任何区域。默认支持的服务的配置文件位于/usr/lib/firewalld/services
,用户创建的服务文件位于/etc/firewalld/services
。
要查看默认的可用服务:
sudo firewall-cmd --get-services
例如,要启用或禁用HTTP服务:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --remove-service=http --permanent
例如:在端口12345上允许或禁用TCP流量。
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
以下示例规则将流量从80端口转发到同一服务器上的12345端口 。
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
要将端口转发到其他服务器:
1.在所需区域中激活伪装。
sudo firewall-cmd --zone=public --add-masquerade
2.添加转发规则。此示例将流量从当前服务器80端口转发到IP是123.456.78.9的远程服务器的8080端口。
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
要删除规则,请替换--add
为--remove
。例如:
sudo firewall-cmd --zone=public --remove-masquerade
例如,如果您运行的是Web服务器,以下是使用FirewallD为您的Linode分配基本规则的方法。
1.将dmz区域指定为eth0网卡的默认区域。在提供的默认区域中,dmz是最适合此应用程序的区域,因为它只允许SSH和ICMP。
sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0
2.将HTTP和HTTPS的永久服务规则添加到dmz区域:
sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent
3.重新加载FirewallD,以便规则立即生效:
sudo firewall-cmd --reload
如果你现在运行firewall-cmd --zone=dmz --list-all
,这应该是输出:
dmz (default)
interfaces: eth0
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
上面配置的意思是:dmz区域是我们的默认区域,适用于eth0接口的所有网络数据和端口。允许传入HTTP(端口80),HTTPS(端口443)和SSH(端口22)流量,因为对IP版本没有限制,这将适用于IPv4和IPv6,不允许伪装和端口转发。我们没有限制ICMP包,因此完全允许ICMP流量,并且没有富规则。允许所有传出流量。
服务和端口适用于基本配置,但对于高级方案可能限制太多。Rich Rules和Direct Interface允许完全自由的为任何端口、协议、地址和操作添加自定义规则到任何区域。
富规则语法很广泛,但在firewalld.richlanguage(5)手册页(或man firewalld.richlanguage
在终端中查看)中有详细说明。使用firewall-cmd 和参数--add-rich-rule
,--list-rich-rules
以及--remove-rich-rule
来管理富规则。
以下是一些常见示例:
允许来自主机192.168.0.14的所有IPv4流量。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'
拒绝从主机192.168.1.10到端口22的IPv4 TCP流量。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'
允许从主机10.1.0.3到端口80的IPv4 TCP流量,并将其本地转发到本地6532端口。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'
将端口80上的所有IPv4流量转发到主机172.31.4.2上的端口8080(伪装应在区域上处于活动状态)。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'
列出您当前的富规则:
sudo firewall-cmd --list-rich-rules
对于最高级的用法,或者对于iptables专家,FirewallD提供了一个直接接口,允许使用原始iptables命令。除非加上参数--permanent
,否则规则是运行时的。
要查看添加到FirewallD的所有自定义链或规则:
firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules
讨论iptables语法细节超出了本指南的范围。如果您想了解更多信息,可以查看我们的iptables指南。
有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。