linux firewall 防火墙入门教程
安装防火墙
$ sudo add-apt-repository universe
$ sudo apt install firewalld
你还需要停用 ufw:
$ sudo systemctl disable ufw
没有理由不用 ufw。它是一个强大的防火墙前端。然而,本文重点讲 firewalld,因为大部分发行版都支持它而且它集成到了 systemd,systemd 是几乎所有发行版都自带的。
不管你的发行版是哪个,都要先激活防火墙才能让它生效,而且需要在启动时加载:
$ sudo systemctl enable --now firewalld
理解防火墙的域
Firewalld 旨在让防火墙的配置工作尽可能简单。它通过建立域zone来实现这个目标。一个域是一组的合理、通用的规则,这些规则适配大部分用户的日常需求。FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain)。默认情况下有九个域。
trusted
:接受所有的连接。这是最不偏执的防火墙设置,只能用在一个完全信任的环境中,如测试实验室或网络中相互都认识的家庭网络中。home
、work
、internal
:在这三个域中,接受大部分进来的连接。它们各自排除了预期不活跃的端口进来的流量。这三个都适合用于家庭环境中,因为在家庭环境中不会出现端口不确定的网络流量,在家庭网络中你一般可以信任其他的用户。public
:用于公共区域内。这是个偏执的设置,当你不信任网络中的其他计算机时使用。只能接收选定的常见和最安全的进入连接。dmz
:DMZ 表示隔离区。这个域多用于可公开访问的、位于机构的外部网络、对内网访问受限的计算机。对于个人计算机,它没什么用,但是对某类服务器来说它是个很重要的选项。external
:用于外部网络,会开启伪装(你的私有网络的地址被映射到一个外网 IP 地址,并隐藏起来)。跟 DMZ 类似,仅接受经过选择的传入连接,包括 SSH。block
:仅接收在本系统中初始化的网络连接。接收到的任何网络连接都会被icmp-host-prohibited
信息拒绝。这个一个极度偏执的设置,对于某类服务器或处于不信任或不安全的环境中的个人计算机来说很重要。drop
:接收的所有网络包都被丢弃,没有任何回复。仅能有发送出去的网络连接。比这个设置更极端的办法,唯有关闭 WiFi 和拔掉网线。
你可以查看你发行版本的所有域,或通过配置文件 /usr/lib/firewalld/zones
来查看管理员设置。举个例子:下面是 Fefora 31 自带的 FedoraWorkstation
域:
$ cat /usr/lib/firewalld/zones/FedoraWorkstation.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Fedora Workstation</short>
<description>Unsolicited incoming network packets are rejected from port 1 to 1024, except for select network services. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<service name="samba-client"/>
<port protocol="udp" port="1025-65535"/>
<port protocol="tcp" port="1025-65535"/>
</zone>
获取当前的域
任何时候你都可以通过 --get-active-zones
选项来查看你处于哪个域:
$ sudo firewall-cmd --get-active-zones
输出结果中,会有当前活跃的域的名字和分配给它的网络接口。笔记本电脑上,在默认域中通常意味着你有个 WiFi 卡:
FedoraWorkstation
interfaces: wlp61s0
修改你当前的域
要更改你的域,请将网络接口重新分配到不同的域。例如,把例子中的 wlp61s0
卡修改为 public 域:
$ sudo firewall-cmd --change-interface=wlp61s0 --zone=public
你可以在任何时候、任何理由改变一个接口的活动域 —— 无论你是要去咖啡馆,觉得需要增加笔记本的安全策略,还是要去上班,需要打开一些端口进入内网,或者其他原因。在你凭记忆学会 firewall-cmd
命令之前,你只要记住了关键词 change
和 zone
,就可以慢慢掌握,因为按下 Tab
时,它的选项会自动补全。
FirewallD on CentOS7
FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd
。使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables
读取新规则,然而 firewalld 只应用改动了的不同部分。
要列出所有可用的区域,运行:
# firewall-cmd --get-zones
work drop internal external trusted home dmz public block
列出默认的区域 :
# firewall-cmd --get-default-zone
public
改变默认的区域 :
# firewall-cmd --set-default-zone=dmz
# firewall-cmd --get-default-zone
dmz
firewallD服务
FirewallD 服务使用 XML 配置文件,记录了 firewalld 服务信息。
列出所有可用的服务:
# firewall-cmd --get-services
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
XML 配置文件存储在 /usr/lib/firewalld/services/
和 /etc/firewalld/services/
目录下。
用 FirewallD 配置你的防火墙
作为一个例子,假设你正在运行一个 web 服务器,SSH 服务端口为 7022 ,以及邮件服务,你可以利用 FirewallD 这样配置你的服务器:
首先设置默认区为 dmz。
# firewall-cmd --set-default-zone=dmz
# firewall-cmd --get-default-zone
dmz
为 dmz 区添加持久性的 HTTP 和 HTTPS 规则:
# firewall-cmd --zone=dmz --add-service=http --permanent
# firewall-cmd --zone=dmz --add-service=https --permanent
开启端口 25 (SMTP) 和端口 465 (SMTPS) :
firewall-cmd --zone=dmz --add-service=imap --permanent
firewall-cmd --zone=dmz --add-service=imaps --permanent
firewall-cmd --zone=dmz --add-service=pop3 --permanent
firewall-cmd --zone=dmz --add-service=pop3s --permanent
因为将 SSH 端口改到了 7022,所以要移除 ssh 服务(端口 22),开启端口 7022:
firewall-cmd --remove-service=ssh --permanent
firewall-cmd --add-port=7022/tcp --permanent
要应用这些更改,我们需要重新加载防火墙:
firewall-cmd --reload
最后可以列出这些规则:
# firewall-cmd –list-all
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: http https imap imaps pop3 pop3s smtp smtps
ports: 7022/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules: