firewalld(Dynamic Firewall Manager of Linux systems, Linux 系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于 CLI (命令行界面)和基于 GUI(图形用户界面)的两种管理方式。
相较于传统的防火墙管理配置工具,firewalld 支持动态更新技术并加入了区域(zone)的概念。区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后只需轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。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 | 拒绝流入的流量,除非与流出的流量相关 |
firewall-cmd 是 firewalld 防火墙配置管理工具的 CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的,除了能用 Tab 键自动补齐命令或文件名等内容之外,还可以用 Tab 键来补齐表中所示的长格式参数了。
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将源自此 IP 或子网的流量导向指定的区域 |
–remove-source= | 不再将源自此 IP 或子网的流量导向某个指定区域 |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
–panic-on | 开启应急状况模式 |
–panic-off | 关闭应急状况模式 |
使用 firewalld 配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。想让配置策略一直存在,就需要使用永久(Permanent)模式,在用 firewall-cmd 命令正常设置防火墙策略时添加–permanent 参数即可。但是,永久生效模式只有在系统重启之后才能自动生效。如果想立即生效,需要手动执行 firewall-cmd --reload 命令。
查看 firewalld 服务当前所使用的区域:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --get-default-zone
public
查询 eno16777728 网卡在 firewalld 服务中的区域:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --get-zone-of-interface=eno16777728
no zone
把 firewalld 服务中 eno16777728 网卡的默认区域修改为 external,并在系统重启后生效。分别查看当前与永久模式下的区域名称:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --permanent --zone=external --change-interface=eno16777728
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --get-zone-of-interface=eno16777728
no zone
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --permanent --get-zone-of-interface=eno16777728
external
把 firewalld 服务的当前默认区域设置为 public:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --set-default-zone=public
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --get-default-zone
public
启动/关闭 firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --panic-on
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --panic-off
success
查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --zone=public --query-service=ssh
yes
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --zone=public --query-service=https
no
把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许,并立即生效:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --zone=public --add-service=https
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --permanent --zone=public --add-service=https
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --reload
success
把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --permanent --zone=public --remove-service=http
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --reload
success
把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效:
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
root@zoupeng-ThinkPad-X1-Carbon-5th:~# firewall-cmd --zone=public --list-port
8080-8081/tcp
把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效:
注:流量转发命令格式为firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标 IP 地址>
root@zoupeng-ThinkPad-X1-Carbon-5th:/home/zoupeng# firewall-cmd --permanent --zone=public --add-forward-port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
root@zoupeng-ThinkPad-X1-Carbon-5th:/home/zoupeng# firewall-cmd --reload
success
在客户端使用ssh命令尝试访问192.168.10.10主机的888端口:
[root@client A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't
be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
[email protected]'s password:此处输入远程root管理员的密码
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10
firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在 firewalld 服务中配置一条富规则,使其拒绝192.168.10.0/24 网段的所有用户访问本机的 ssh 服务(22 端口):
[root@linuxprobe ~]# firewall-cmd --permanent --zone=public --add-rich-rule="
rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@linuxprobe ~]# firewall-cmd --reload
success
在客户端使用 ssh 命令尝试访问 192.168.10.10 主机的 ssh 服务(22 端口):
[root@client A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.
firewall-config是 firewalld 防火墙配置管理工具的 GUI(图形用户界面)版本。
irewall-config 的界面如图所示,其功能具体如下。
➢ 1:选择运行时(Runtime)模式或永久(Permanent)模式的配置。
➢ 2:可选的策略集合区域列表。
➢ 3:常用的系统服务列表。
➢ 4:当前正在使用的区域。
➢ 5:管理当前被选中区域中的服务。
➢ 6:管理当前被选中区域中的端口。
➢ 7:开启或关闭 SNAT(源地址转换协议)技术。
➢ 8:设置端口转发策略。
➢ 9:控制请求 icmp 服务的流量。
➢ 10:管理防火墙的富规则。
➢ 11:管理网卡设备。
➢ 12:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关
的流量。
➢ 13:firewall-config 工具的运行状态。
我们先将当前区域中请求 http 服务的流量设置为允许,但仅限当前生效。具体配置如图所示。
尝试添加一条防火墙策略规则,使其放行访问 8080~8088 端口(TCP 协议)的流量,
并将其设置为永久生效,以达到系统重启后防火墙策略依然生效的目的。在按照图 所示的界面配置完毕之后,还需要在 Options 菜单中单击 Reload Firewalld 命令,让配置的防火墙策略立即生效。这与在命令行中执行–reload 参数的效果一样。SNAT 是一种为了解决 IP 地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网 IP 接入 Internet。
下面是在网络中不使用 SNAT 技术和使用 SNAT 技术时的情况。在图中所示的局域网中有多台 PC,如果网关服务器没有应用 SNAT 技术,则互联网中的网站服务器在收到 PC 的请求数据包,并回送响应数据包时,将无法在网络中找到这个私有网络的 IP 地址,所以 PC 也就收不到响应数据包了。在图中所示的局域网中,由于网关服务器应用了 SNAT 技术,所以互联网中的网站服务器会将响应数据包发给网关服务器,再由后者转发给局域网中的 PC。
用户只需按照图进行配置,并选中 Masquerade zone 复选框,就自动开启了 SNAT 技术。
这里使用 firewall-config 工具重新演示了前面使用 firewall-cmd 来配置防火墙策略规则,将本机 888 端口的流量转发到 22 端口,且要求当前和长期均有效,具体如图所示。
配置富规则,让 192.168.10.20 主机访问到本机的 1234 端口号,如图所示。
如果生产环境中的服务器有多块网卡在同时提供服务,则对内网和对外网提供服务的网卡要选择的防火墙策略区域也是不一样的。可以把网卡与防火墙策略区域进行绑定,这样就可以使用不同的防火墙区域策略,对源自不同网卡的流量进行针对性的监控,效果更好。
TCP Wrappers 是一款流量监控程序。Linux 系统中其实有两个层面的防火墙,第一种是前面讲到的基于 TCP/IP 协议的流量过滤工具,而 TCP Wrappers 服务则是能允许或禁止 Linux 系统提供服务的防火墙,从而在更高层面保护了 Linux 系统的安全运行。
TCP Wrappers 服务的防火墙策略由两个控制列表文件所控制,用户可以编辑允许控制列表文件来放行对服务的请求流量,也可以编辑拒绝控制列表文件来阻止对服务的请求流量。控制列表文件修改后会立即生效,系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。
TCP Wrappers 服务的控制列表文件配置起来并不复杂,常用的参数如表所示。
在配置 TCP Wrappers 服务时需要遵循两个原则:
➢ 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
➢ 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。
下面编写拒绝策略规则文件,禁止访问本机 sshd 服务的所有流量(无须/etc/hosts.deny 文件中修改原有的注释信息):
[root@linuxprobe ~]# vim /etc/hosts.deny
#
# hosts.deny This file contains access rules which are used to
# deny connections to network services that either use
# the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# The rules in this file can also be set up in
# /etc/hosts.allow with a 'deny' option instead.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
sshd:*
[root@linuxprobe ~]# ssh 192.168.10.10
ssh_exchange_identification: read: Connection reset by peer
接下来,在允许策略规则文件中添加一条规则,使其放行源自 192.168.10.0/24 网段,访问本机 sshd 服务的所有流量。可以看到,服务器立刻就放行了访问 sshd 服务的流量,效果非常直观:
[root@linuxprobe ~]# vim /etc/hosts.allow
#
# hosts.allow This file contains access rules which are used to
# allow or deny connections to network services that
# either use the tcp_wrappers library or that have been
# started through a tcp_wrappers-enabled xinetd.
#
# See 'man 5 hosts_options' and 'man 5 hosts_access'
# for information on rule syntax.
# See 'man tcpd' for information on tcp_wrappers
sshd:192.168.10.
[root@linuxprobe ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Wed May 4 07:56:29 2017
[root@linuxprobe ~]#