linux firewall 防火墙入门教程

本文由 LCTT 原创翻译,Linux中国首发
合理的防火墙是你的计算机防止网络入侵的第一道屏障。你在家里上网,通常互联网服务提供会在路由中搭建一层防火墙。当你离开家时,那么你计算机上的那层防火
墙就是仅有的一层,所以配置和控制好你 Linux 电脑上的防火墙很重要。如果你维护一台 Linux 服务器,那么知道怎么去管理你的防火墙同样重要,只要掌握了这些
知识你才能保护你的服务器免于本地或远程非法流量的入侵。

安装防火墙

很多 Linux 发行版本已经自带了防火墙,通常是 iptables 。它很强大并可以自定义,但配置起来有点复杂。幸运的是,有开发者写出了一些前端程序来帮助用户
控制防火墙,而不需要写冗长的 iptables 规则。
在 Fedora、CentOS、Red Hat 和一些类似的发行版本上,默认安装的防火墙软件是 firewalld ,通过 firewall-cmd 命令来配置和控制。在 Debian 和大部
 
分其他发行版上,可以从你的软件仓库安装 firewalld。Ubuntu 自带的是 简 单 防 火 墙(Uncomplicated Firewall) (ufw),所以要使用 firewalld,你必须启用 universe 软件仓库:

$ 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:接受所有的连接。这是最不偏执的防火墙设置,只能用在一个完全信任的环境中,如测试实验室或网络中相互都认识的家庭网络中。
  • homeworkinternal:在这三个域中,接受大部分进来的连接。它们各自排除了预期不活跃的端口进来的流量。这三个都适合用于家庭环境中,因为在家庭环境中不会出现端口不确定的网络流量,在家庭网络中你一般可以信任其他的用户。
  • public:用于公共区域内。这是个偏执的设置,当你不信任网络中的其他计算机时使用。只能接收选定的常见和最安全的进入连接。
  • dmz:DMZ 表示隔离区。这个域多用于可公开访问的、位于机构的外部网络、对内网访问受限的计算机。对于个人计算机,它没什么用,但是对某类服务器来说它是个很重要的选项。
  • external:用于外部网络,会开启伪装(你的私有网络的地址被映射到一个外网 IP 地址,并隐藏起来)。跟 DMZ 类似,仅接受经过选择的传入连接,包括 SSH。
  • block:仅接收在本系统中初始化的网络连接。接收到的任何网络连接都会被 icmp-host-prohibited 信息拒绝。这个一个极度偏执的设置,对于某类服务器或处于不信任或不安全的环境中的个人计算机来说很重要。
  • drop:接收的所有网络包都被丢弃,没有任何回复。仅能有发送出去的网络连接。比这个设置更极端的办法,唯有关闭 WiFi 和拔掉网线。

你可以查看你发行版本的所有域,或通过配置文件 /usr/lib/firewalld/zones 来查看管理员设置。举个例子:下面是 Fefora 31 自带的 FedoraWorkstation 域:

  1. $ cat /usr/lib/firewalld/zones/FedoraWorkstation.xml
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <zone>
  4. <short>Fedora Workstation</short>
  5. <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>
  6. <service name="dhcpv6-client"/>
  7. <service name="ssh"/>
  8. <service name="samba-client"/>
  9. <port protocol="udp" port="1025-65535"/>
  10. <port protocol="tcp" port="1025-65535"/>
  11. </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 命令之前,你只要记住了关键词 changezone,就可以慢慢掌握,因为按下 Tab 时,它的选项会自动补全。

FirewallD on CentOS7

FirewallD 是 CentOS 7 服务器上默认可用的防火墙管理工具。基本上,它是 iptables 的封装,有图形配置工具 firewall-config 和命令行工具 firewall-cmd。使用 iptables 服务,每次改动都要求刷新旧规则,并且从 /etc/sysconfig/iptables 读取新规则,然而 firewalld 只应用改动了的不同部分。

要列出所有可用的区域,运行:

  1. # firewall-cmd --get-zones
  2. work drop internal external trusted home dmz public block

列出默认的区域 :

  1. # firewall-cmd --get-default-zone
  2. public

改变默认的区域 :

 

  1. # firewall-cmd --set-default-zone=dmz
  2. # firewall-cmd --get-default-zone
  3. dmz

firewallD服务

 

FirewallD 服务使用 XML 配置文件,记录了 firewalld 服务信息。

列出所有可用的服务:

  1. # firewall-cmd --get-services
  2. 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。

  1. # firewall-cmd --set-default-zone=dmz
  2. # firewall-cmd --get-default-zone
  3. dmz

为 dmz 区添加持久性的 HTTP 和 HTTPS 规则:

  1. # firewall-cmd --zone=dmz --add-service=http --permanent
  2. # firewall-cmd --zone=dmz --add-service=https --permanent

开启端口 25 (SMTP) 和端口 465 (SMTPS) :

  1. firewall-cmd --zone=dmz --add-service=imap --permanent
  2. firewall-cmd --zone=dmz --add-service=imaps --permanent
  3. firewall-cmd --zone=dmz --add-service=pop3 --permanent
  4. firewall-cmd --zone=dmz --add-service=pop3s --permanent

因为将 SSH 端口改到了 7022,所以要移除 ssh 服务(端口 22),开启端口 7022:

  1. firewall-cmd --remove-service=ssh --permanent
  2. firewall-cmd --add-port=7022/tcp --permanent

要应用这些更改,我们需要重新加载防火墙:

  1. firewall-cmd --reload

最后可以列出这些规则:

 

  1. # firewall-cmd list-all
  2. dmz
  3. target: default
  4. icmp-block-inversion: no
  5. interfaces:
  6. sources:
  7. services: http https imap imaps pop3 pop3s smtp smtps
  8. ports: 7022/tcp
  9. protocols:
  10. masquerade: no
  11. forward-ports:
  12. sourceports:
  13. icmp-blocks:
  14. rich rules:

 

 

 

posted @ 2020-05-23 15:15  Suixin随心  阅读(807)  评论(0编辑  收藏  举报