什么是FirewallD以及如何在Linux上实现

时间:2019-04-29 03:17:50  来源:igfitidea点击:

什么是防火墙Firewalld?

Firewalld是许多Linux发行版的防火墙管理解决方案,包括Ubuntu、Debian、CentOS、RHEL和Fedora。它充当Linux内核提供的iptables过滤系统的前端。它是独立于协议的,这意味着它支持IPv4、IPv6、以太网网桥和IP集。

防火墙的基本概念

FirewallD使用区域和服务,而不是iptables链和规则。区域是一组规则,根据计算机连接到的网络中的信任级别,指定应允许的通信量。网络接口分配了一个区域来指示防火墙应该允许的行为。

firewalld是使用firewall cmd命令行工具管理的。它提供了一个接口来管理运行时和永久配置。

防火墙区域

Firewalld中有9个预定义的区域,这取决于信任级别的升序。

对每个区域的简要说明如下:

  1. Drop丢弃:此区域的信任级别最低,用于丢弃所有传入流量,而不向发件人发送任何确认。
  2. Block:这个区域和Drop区域非常相似,传入的流量被拒绝,发送者得到一条消息。
  3. Public公共:允许来自特定公共网络的流量。
  4. External外部:当系统充当网关或路由器时使用此区域。
  5. Internal内部:适用于专用内部网络中的计算机的一组规则。
  6. DMZ:此区域是内部网络中的计算机的隔离补丁,可能无法访问其他内部资源。
  7. Work工作该区域用于工作机器。信任度很高。
  8. Home家庭:这个区域的大多数计算机相互信任。信任级别高于工作级别。
  9. Trusted可信:此区域的信任级别最高。网络中的所有计算机都是可信的。

步骤1-安装防火墙

默认情况下,Firewalld预安装在大多数操作系统上。但是一些最小的操作系统安装不包括fi如果没有安装,可以使用以下命令安装:

sudo yum install firewalld        # CentOS/RHEL 8/7/6 
sudo dnf install firewalld        # Fedora and CentOS/RHEL 8 
sudo apt install firewalld        # Ubuntu and Debian

安装firewalld后,我们需要启动它并在系统重新启动后启用它。

sudo systemctl start firewalld
sudo systemctl enable firewalld

运行以下命令以验证firewalld的状态

systemctl status firewalld
或者
firewall-cmd --state

步骤2-使用分区和服务

默认情况下,firewalld中的默认区域是public,所有网络接口都配置了public zone。

可以使用以下命令列出默认区域:

firewall-cmd --get-default-zone

输出:

public

接下来,运行以下命令以获取活动区域的列表:

firewall-cmd --get-active-zones

我们应该得到以下输出:

public
  interfaces: eth0 eth1

要获取所有可用区域的列表,请运行以下命令:

firewall-cmd --get-zones

我们应该得到以下输出:

block dmz drop external home internal public trusted work

可以使用以下命令列出与公共区域关联的所有服务:

firewall-cmd --list-all

我们应该得到以下输出:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

要将默认区域从public更改为work,请运行以下命令:

firewall-cmd --set-default-zone=work

现在可以使用以下命令验证默认区域:

firewall-cmd --get-default-zone

输出:

Output:

work

我们可以使用以下命令获取系统中所有可用服务的列表:

firewall-cmd --get-services

我们应该得到以下输出:

RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

步骤3–允许和拒绝Firewalld中的服务

我们可以基于firewalld中的预定义服务来允许和拒绝传入流量。

例如,要允许公共区域中http服务的所有传入流量,请运行以下命令:

firewall-cmd --zone=public --add-service=http

输出:

success

要允许公共区域中ftp服务的传入流量,请运行以下命令:

firewall-cmd --zone=public --add-service=ftp

输出:

success

上面的命令将临时添加http和ftp服务,并且在重新启动时不会持久化。我们需要使用“--permanent”选项使其永久,如下所示:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=ftp

接下来,运行以下命令使更改生效:

firewall-cmd --reload

现在可以使用以下命令获取已添加服务的列表:

firewall-cmd --permanent --zone=public --list-services

我们应该看到以下输出:

cockpit dhcpv6-client ftp http ssh

还可以使用以下命令检查有关公共区域的详细信息:

firewall-cmd --info-zone public

输出:

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: cockpit dhcpv6-client ftp http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

如果要从firewalld中删除/拒绝上述服务,请使用“--remove service”选项:

firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --permanent --zone=public --remove-service=ftp

接下来,运行以下命令使更改生效:

firewall-cmd --reload

步骤4–Firewalld中允许和拒绝端口

我们还可以基于firewalld中的端口来允许和拒绝传入流量。

例如,允许端口8080和443上的所有传入通信量,请运行以下命令:

firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=8080/tcp

接下来,运行以下命令使更改生效:

firewall-cmd --reload

接下来,使用以下命令验证添加的端口:

firewall-cmd --permanent --zone=public --list-ports

输出:

443/tcp 8080/tcp

同样地,从firewalld中删除/拒绝上述端口,使用–remove port选项:

firewall-cmd --permanent --zone=public --remove-port=443/tcp
firewall-cmd --permanent --zone=public --remove-port=8080/tcp

接下来,运行以下命令使更改生效:

firewall-cmd --reload

第5步-使用Firewalld进行端口转发

端口转发是将来自IP/端口组合的请求重定向到其他IP和/或端口的过程。此技术允许远程计算机连接到专用网络中的特定服务。

在配置端口转发之前,需要在所需区域中激活伪装。我们可以使用“--add masquerade”选项激活它:

firewall-cmd --zone=public --add-masquerade

接下来,要将流量从端口80转发到同一服务器上的端口8080,请运行以下命令:

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080

如果要将通信量从本地端口80转发到IP地址为192.168.1.200的远程服务器上的端口8080,请运行以下命令:

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200

接下来,运行以下命令使更改生效:

firewall-cmd --reload

如果要删除上述规则,请将–add替换为–remove,如下所示:

firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200
firewall-cmd --permanent --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080

总结

在上面的指南中,我们学习了Firewalld的基本概念以及如何在Linux操作系统上实现它。我希望你现在可以用防火墙来限制不必要的流量。