赞
踩
防火墙是系统的第一道防线,其作用是防止非法用户的进入,是内部网和外部网(Internet)之间的保护屏障。在我们构建服务器应用的时候首先应该想到的是安全,不能让用户随意的获取服务器的资源甚至系统的用户数据。这种安全事件频频发生我们更应该注重安全,安全也是未来互联网行业必须重视的重中之重。
如果大家直接购买阿里云的ECS或者腾讯云的云服务器可能很少关注防火墙,DDoS攻击等问题。因为服务器提供商同时为我们提供了这项业务,对于服务器允许的网络请求类型,接口等我们都可以通过服务器提供商提供的可视化的界面进行配置。这种严格的配置在生产环境中比较多见,对于部分用户为了方便会设置路由规则为0.0.0.0/0这样就会存在潜在的风险,表示你的任何端口都可以被外部的任何设备访问,这其实是很危险的一件事。可能大家会说自己在服务器上搭建的mysql服务器是有密码的,其实mysql的密码校验真的不安全。还有大部分人为了操作方便给数据库授权了所有ip的访问权限,这就更危险了。就等于你暴漏了一个保险柜在大街上人人都可以去试一下。
有这样一个案例。自己在云服务器上搭建redis服务的情况。默认情况下redis的配置中有
bind 127.0.0.1
这样的内部回环,所以外部服务器是访问不了的。但是如果为了外部网络可以访问注释bind后redis就完全是个暴露的在任何地方都可以随便存取的服务。关于redis安全会在下一篇文章中专门来说。
开启firewall的命令是
systemctl start firewalld.service
如果提醒服务被mask则需要执行下边的命令
systemctl unmask firewalld.service
然后start就没有问题了
如果你之前没有使用firewall在上边步骤中刚开启你会发现你的80端口等都不可访问了,这时候就需要配置防火墙来开放相应的端口。
如果服务器有网络接口 eth0和lo那么网络请求的基本流向是
数据包从eth0或者lo进入其中的一个zone然后进入内核处理。
zone其实最简单的理解是定制的过滤规则的划分。根据我们对请求的不同信任度来使用不同的zone(规则集合)。例如上图中eth0网卡的请求需要进过第二个zone。而且每一个网卡interface所对应的zone只能有一个,这需要我们设置。我们来看看firewall默认有哪些zone:
firewall-cmd --get-zones
work drop internal external trusted home dmz public block
默认情况是有这些zone
如果要查看zone的特征,主要是一些过滤规则,可以使用以下的命令
firewall-cmd --list-all-zones
这样会返回所有的zone的特征,我们拿一个来看
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 3306/tcp 80/tcp 6626/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
可用于接受(accept)、拒绝(reject)或丢弃(drop)与任何规则(rule)(端口(port)、服务(etc)等)不匹配的每个包。在可信区域中使用ACCEPT target接收不匹配任何规则的每个包。在block zone中使用%%REJECT%%目标来拒绝(使用默认的firewalld拒绝类型)不匹配任何规则的每个包。DROP target用于drop zone中删除不匹配任何规则的每个包。如果没有指定目标,则将拒绝不匹配任何规则的每个包。
是一个可选标记,在区域配置中只能使用一次。此标志反转icmp块处理。区域中只接受启用的ICMP类型,而拒绝所有其他类型。
是一个可选的标记,可以多次使用。它可用于将接口绑定到zone。对于NetworkManager管理的接口,您不需要这样做,因为NetworkManager自动将接口绑定到区域。
是一个可选的标记,可以多次使用。它可用于将源地址、地址范围、MAC地址或ipset绑定到一个区域。源条目具有以下格式之一:
address="address[/mask]"
mac="MAC"
ipset="ipset"
是一个可选的标记,可以多次使用,以启用多个服务条目。服务条目格式如下:
name="string"
如果不知道有哪些services可用可以使用以下命令
firewall-cmd --get-services
RH-Satellite-6 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
是一个可选标记,可多次用于具有多个端口条目。端口条目的所有属性都是强制性的:
port="portid[-portid]" #定义端口或者端口范围
protocol="tcp|udp|sctp|dccp" #定义协议类型
firewall-cmd --zone==public --add-port=80/tcp --permanent
这里是在public zone下配置添加port特性为运行80端口的tcp请求。参数–permanent是为了在重启的情况下该规则任然生效,也就是持久化配置
为什么配置到public zone下呢?因为默认的zone就是public,可以使用以下命令查看
firewall-cmd --get-default-zone
在设置完路由规则后需要重新加载
firewall-cmd --reload
更多的选项和使用方法大家可以查看firewall-cmd的help
firewall-cmd --h
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。