什么是FirewallD以及如何在Linux上实现
什么是防火墙Firewalld?
Firewalld是许多Linux发行版的防火墙管理解决方案,包括Ubuntu、Debian、CentOS、RHEL和Fedora。它充当Linux内核提供的iptables过滤系统的前端。它是独立于协议的,这意味着它支持IPv4、IPv6、以太网网桥和IP集。
防火墙的基本概念
FirewallD使用区域和服务,而不是iptables链和规则。区域是一组规则,根据计算机连接到的网络中的信任级别,指定应允许的通信量。网络接口分配了一个区域来指示防火墙应该允许的行为。
firewalld是使用firewall cmd命令行工具管理的。它提供了一个接口来管理运行时和永久配置。
防火墙区域
Firewalld中有9个预定义的区域,这取决于信任级别的升序。
对每个区域的简要说明如下:
- Drop丢弃:此区域的信任级别最低,用于丢弃所有传入流量,而不向发件人发送任何确认。
- Block:这个区域和Drop区域非常相似,传入的流量被拒绝,发送者得到一条消息。
- Public公共:允许来自特定公共网络的流量。
- External外部:当系统充当网关或路由器时使用此区域。
- Internal内部:适用于专用内部网络中的计算机的一组规则。
- DMZ:此区域是内部网络中的计算机的隔离补丁,可能无法访问其他内部资源。
- Work工作该区域用于工作机器。信任度很高。
- Home家庭:这个区域的大多数计算机相互信任。信任级别高于工作级别。
- 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操作系统上实现它。我希望你现在可以用防火墙来限制不必要的流量。