概述
保证数据的安全性是继可用性之后最为重要的一项工作,防火墙技术作为公网与内网之间的保护屏障,起着至关重要的作用。
本章节内将会分别使用iptables、firewall-cmd、firewall-config和Tcp_wrappers等防火墙策略配置服务,够熟练的对请求数据包流量进行过滤,还能够基于服务程序进行允许和关闭操作,从更好的层面保证了Linux系统的安全运行。
保证数据的安全性是继可用性之后最为重要的一项工作,防火墙技术作为公网与内网之间的保护屏障,虽然有软件或硬件之分(系统防火墙、硬件防火墙、行为管理设备等),但主要功能都是依据策略对外部请求进行过滤,防火墙技术能够做到监控每一个数据包并判断是否有相应的匹配策略规则,直到匹配到其中一条策略规则或执行默认策略为止,防火墙策略可以基于来源地址、请求动作或协议等信息来定制,最终仅让合法的用户请求流入到内网中,其余的均被丢弃。
防火墙作为公网与内网之间的保护屏障
红帽RHEL7系统中Firewalld服务取代了Iptables服务,但其实Iptables服务与Firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙策略功能的“防火墙管理工具”,真正定义好的防火墙策略会被内核中的netfilter网络过滤器接收,从而真正实现了防火墙功能。
在Linux系统中其实同时有多个防火墙管理工具共同存在,作用都是为了方便运维人员管理Linux系统的防火墙策略,但最终真正的数据过滤功能是由系统内核中netfilter网络过滤器来实现的,红帽RHEL7系统中的防火墙没有变,而是防火墙的规则策略管理工具换了而已,虽然各个工具之间各有优劣特色,但对于防火墙策略的配置思路上是保持一致的,从多个防火墙管理工具中任选一款来学透即可,完全能够满足日常的工作所需。
Linux内核包含一个强大的网络过滤子系统netfilter。netfilter子系统允许内核模块对遍历系统的每个数据包进行检查。这表示在任何传入、传出或转发的网络数据包到达用户空间中的组件之前,都可以通过编程方式检查、修改、丢弃或拒绝这些数据包。这是RHEL7计算机上构建防火墙的主要构建快。
尽管系统管理员理论可以编写自己的内核模块与netfilter交互,但通常不会这样做。取而代之,会使用其他程序来与netfilter交互。这些程序中,最常见和最知名的是iptables。
之前的RHEL版本中,iptables是内核netfilter子系统交互的主要方法。iptables是一个命令工具,它仅能调整IPv4防火墙规则。为保证更完整的防火墙覆盖率,需要使用其他实用程序,例如用于IPv6的ip6tables和用于软件桥的ebtables。
在较早期的Linux系统中想配置防火墙默认使用的都是iptables防火墙管理命令,而新型Firewalld防火墙管理服务已经被投入使用多年,但目前还有大量的生产环境中在使用着iptables命令来管理着防火墙的规则策略。
2.1 策略与规则链
防火墙会从上至下来读取规则策略,一旦匹配到了合适的就会去执行,并立即结束匹配工作,但也有转了一圈之后发现没有匹配到合适规则的时候,那么就会去执行默认的策略。
对防火墙策略的设置有两种,一种是“通”,一种是“堵”——当防火墙的默认策略是拒绝的,我们就要设置允许规则,否则谁都进不来了,而如果防火墙的默认策略是允许的,我们就要设置拒绝规则,否则谁都能进来了,起不到防范的作用。
iptables命令把对数据进行过滤或处理数据包的策略叫做规则,将多条规则又存放到一个规则链中,规则链是依据处理数据包位置的不同而进行的分类,包括有:
#进行路由选择前处理数据包(PREROUTING)
# 处理流入的数据包(INPUT)
# 处理流出的数据包(OUTPUT)
# 处理转发的数据包(FORWARD)
# 在进行路由选择后处理数据包(POSTROUTING)
从内网向外网发送的数据一般都是可控且良性的,因此显而易见我们使用最多的就是INPUT数据链,这个链中定义的规则起到了保证我们私网设施不受外网骇客侵犯的作用。
比如社区物业有两条规定——“禁止小商贩进入社区,各种车辆都需要登记”,这两条安保规定很明显应该是作用到了社区的正门(流量必须经过的地方),而不是每家每户的防盗门上。
根据我们前面提到的防火墙策略的匹配顺序规则,我们可以猜想有多种情况——比如来访人员是小商贩,则会被物业保安直接拒绝在大门外,也无需再对车辆进行登记,
如果来访人员是一辆汽车,那么因为第一条禁止小商贩策略就没有被匹配到,因而按顺序匹配到第二条策略,需要对车辆进行登记,再有如果来访的是社区居民,则既不满足小商贩策略,也不满足车辆登记策略,因此会执行默认的放行策略。
不过只有规则策略还不能保证系统的安全,还应该知道该怎么样处理这些被匹配到的流量,比如:“允许”、“登记”、“拒绝”、“不处理”,
这些动作对应到iptables命令术语中是:
# ACCEPT(接收数据包)
# LOG(记录日志信息)
# REJECT(拒绝流量通过)
# DROP(丢弃数据包)
# SNAT(源地址转换)
# DNAT(目标地址转换)
允许动作和记录日志工作都比较好理解,这两条拒绝动作的不同点,其中REJECT和DROP的动作操作都是将数据包拒绝,DROP是直接将数据包抛弃不响应,而REJECT会拒绝后再回复一条“您的信息我已收到,但被扔掉了”,让对方清晰的看到数据被拒绝的响应。
将Linux系统设置成REJECT拒绝动作策略后,对方会看到本机的端口不可达的响应:
# [root@rhce ~]# ping -c 4 192.168.10.10
# PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
# From 192.168.10.10 icmp_seq=1 Destination Port Unreachable
# From 192.168.10.10 icmp_seq=2 Destination Port Unreachable
2.2 基本的命令参数
iptables是一款基于命令行的防火墙策略管理工具,由于该命令是基于终端执行且存在有大量参数的,无需深入的了解诸如“四表五链”的理论概念,只需要掌握常用的参数并做到灵活搭配即可,以便于能够更顺畅的胜任工作所需。
iptables命令可以根据数据流量的源地址、目的地址、传输协议、服务类型等等信息项进行匹配,一旦数据包与策略匹配后,iptables就会根据策略所预设的动作来处理这些数据包流量。
防火墙策略的匹配顺序规则是从上至下的,因此要把较为严格、优先级较高的策略放到靠前位置,否则有可能产生错误。
表名包括:
# raw:高级功能,如:网址过滤。
# mangle:数据包修改(QOS),用于实现服务质量。
# net:地址转换,用于网关路由器。
# filter:包过滤,用于防火墙规则。
iptables命令主要参数:
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-Inum | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
–dport num | 匹配目标端口号 |
–sport num | 匹配来源端口号 |
iptables命令-L参数查看已有的防火墙策略:
# [root@rhce ~]# iptables -L
iptables命令-F参数清空已有的防火墙策略:
# [root@rhce ~]# iptables -F
iptables -X
iptables -Z
# [root@rhce ~]# iptables -L
# Chain INPUT (policy ACCEPT)
# target prot opt source destination
将INPUT链的默认策略设置为拒绝:
如前面所提到的防火墙策略设置无非有两种方式,一种是“通”,一种是“堵”,当我们将INPUT链设置为默认拒绝后,就需要往里面写入允许策略,否则所有流入的数据包都会被默认拒绝掉,规则链的默认策略拒绝动作只能是DROP,而不能是REJECT。
# [root@rhce ~]# iptables -P INPUT DROP
# [root@rhce ~]# iptables -L
# Chain INPUT (policy DROP)
# target prot opt source destination
向INPUT链中添加允许imcp数据包流入的允许策略:
我们经常会使用到ping命令来检查对方主机是否在线,现在向防火墙INPUT链中添加一条允许imcp协议数据包流入的策略,默认允许了ping命令检测行为。
# [root@rhce ~]# ping -c 4 192.168.10.10
# PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
# --- 192.168.10.10 ping statistics ---4 packets transmitted, 0 received, 100% packet loss, time 3000ms
# [root@rhce ~]# iptables -I INPUT -p icmp -j ACCEPT
# [root@rhce ~]# ping -c 4192.168.10.10
# PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.156 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.117 ms
删除INPUT链中的那条策略,并将默认策略还原为允许:
# [root@rhce ~]# iptables -D INPUT 1
# [root@rhce ~]# iptables -P INPUT ACCEPT
# [root@rhce ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
设置INPUT链只允许指定网段访问本机的22端口,拒绝其他所有主机的数据请求流量:
防火墙策略是按照从上至下顺序匹配的,要记得将允许动作放到拒绝动作上面,否则所有的流量就先被拒绝了。
# [root@rhce ~]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
# [root@rhce ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
# [root@rhce ~]# iptables -L
使用IP地址在192.168.10.0/24网段内的主机访问服务器的22端口:
# [root@Client A ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
# [email protected]'s password:
Last login: Sun Feb 12 01:50:25 2017
# [root@Client A ~]#
使用IP地址在192.168.20.0/24网段外的主机访问服务器的22端口(被拒绝):
# [root@Client B ~]# ssh 192.168.10.10
Connecting to 192.168.10.20:22...
Could not connect to '192.168.10.20' (port 22): Connection failed.
向INPUT链中添加拒绝所有人访问本机12345端口的防火墙策略:
# [root@rhce ~]# iptables -I INPUT -p tcp --dport 12345 -j REJECT
# [root@rhce ~]# iptables -I INPUT -p udp --dport 12345 -j REJECT
# [root@rhce ~]# iptables -L
向INPUT链中添加拒绝来自于指定192.168.10.5主机访问本机80端口(web服务)的防火墙策略:
# [root@rhce ~]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
# [root@rhce ~]# iptables -L
向INPUT链中添加拒绝所有主机不能访问本机888端口和1000至1024端口的防火墙策略:
# [root@rhce ~]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
# [root@rhce ~]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
# [root@localhost ~]# iptables -L
iptables命令配置的防火墙规则默认会在下一次重启时失效,如果让配置的防火墙策略永久生效,执行保存:
# [root@rhce ~]# service iptables save
# iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
开放指定的端口
# iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允许本地回环接口(即运行本机访问本机)
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许已建立的或相关连的通行
# iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
# iptables -A INPUT -j reject #禁止其他未允许的规则访问
# iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
# iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
# iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到 123.255.255.254的命令
# iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
# iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
查看已添加的iptables规则
# iptables -L -n -v
删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
# iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
# iptables -D INPUT 8
RHEL7是多款防火墙管理工具并存的系统,Firewalld动态防火墙管理器服务(Dynamic Firewall Manager of Linux systems)是目前默认的防火墙管理工具,同时拥有命令行终端和图形化界面的配置工具,即使是对Linux命令并不熟悉的同学也能快速入门,相比于传统的防火墙管理工具还支持了动态更新技术。
加入了“zone区域”的概念,简单来说就是为用户预先准备了几套防火墙策略集合(策略模板),然后我们可以根据生产场景的不同而选择合适的策略集合,实现了防火墙策略之间的快速切换。
例如我们有一台笔记本电脑每天都要在办公室、咖啡厅和家里使用,按常理推断最安全的应该是家里的内网,其次是公司办公室,最后是咖啡厅,如果我们需要在办公室内允许文件共享服务的请求流量、回到家中需要允许所有的服务,而在咖啡店则是除了上网外不允许任何其他请求,在以前我们只能频繁的进行手动设置,而现在只需要预设好zone区域集合,然后轻轻点击一下就可以切换过去了上百条策略了,极大的提高了防火墙策略的应用效率
常见的zone区域名称及应用可见下表(默认为public):
区域 | 默认规则策略 |
---|---|
trusted | 允许所有的数据包 |
home | 拒绝流入的数据包,除非与输出流量数据包相关或是ssh,mdns,ipp-client,samba-client与dhcpv6-client服务则允许 |
internal | 等同于home区域 |
work | 拒绝流入的数据包,除非与输出流量数据包相关或是ssh,ipp-client与dhcpv6-client服务则允许 |
public | 拒绝流入的数据包,除非与输出流量数据包相关或是ssh,dhcpv6-client服务则允许 |
external | 拒绝流入的数据包,除非与输出流量数据包相关或是ssh服务则允许 |
dmz | 拒绝流入的数据包,除非与输出流量数据包相关或是ssh服务则允许 |
block | 拒绝流入的数据包,除非与输出流量数据包相关 |
drop | 拒绝流入的数据包,除非与输出流量数据包相关 |
配置防火墙设置
系统管理员可通过三种主要方式与firewalld交互:
直接编辑/etc/firewalld 中的配置文件(本章节讨论)
使用firewall-config 图形工具
从命令行使用firewall-cmd
fireawlld配置文件
firewalld配置文件存储在两个位置:/etc/firewalld 和 /usr/lib/firealld。如果相同名称的配置文件同时存储在两个位置中,则将使用 /etc/firewalld 中的版本。这允许管理员覆盖默认区域和设置,而不必担心其更改被软件包更新所擦除。
预定义firewalld服务
# [root@server ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns
freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-
client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-
wbt mysql nfs ntp open pmcd pmproxy pmwebapi pmwebapis pop3s postgresql
proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client
transmission-client vdsm vnc-server wbem-https
# [root@server ~]#
还存在许多其他预定义服务。可以在/usr/lib/firewalld/service目录总找到并定义firewalld软件包中所含预定义服务的配置文件。
# [root@server services]# pwd
/usr/lib/firewalld/services
# [root@server services]# ls
amanda-client.xml iscsi-target.xml pop3s.xml
bacula-client.xml kerberos.xml postgresql.xml
bacula.xml kpasswd.xml proxy-dhcp.xml
省略。。。。。
屏蔽iptables和ip6tables服务
firewall-cmd命令是Firewalld动态防火墙管理器服务的命令行终端。
它的参数一般都是以“长格式”来执行的
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将来源于此IP或子网的流量导向指定的区域 |
–remove-source= | 不再将此IP或子网的流量导向某个指定区域 |
–add-interface=<网卡名称> | 将来自于该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域做关联 |
–list-all | 显示当前区域的网卡配置参数,资源,端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数,资源,端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 允许默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 允许默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,覆盖当前的 |
Firewalld服务对防火墙策略的配置默认是当前生效模式(RunTime),配置信息会随着计算机重启而失效,如果想要让配置的策略一直存在,那就要使用永久生效模式(Permanent),命令中加入–permanent参数。
但这个永久生效模式对它设置的策略需要重启后才能自动生效,如果想让配置的策略立即生效,手动执行一下–reload参数。
显示默认区域设置为dmz,来自192.168.0.0/24网络的所有流量都被分配给internal区域,而internal区域上打开了用于mysql的网络端口
查看Firewalld服务当前所使用的zone区域:
#[root@rhce ~]# firewall-cmd --get-default-zone
public
查询eno16777728网卡在Firewalld服务中的zone区域:
#[root@rhce ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
将Firewalld防火墙服务中eno16777728网卡的默认区域修改为external,重启后再生效:
# [root@rhce ~]# firewall-cmd --permanent --zone=external
--change-interface=eno16777728
success
# [root@rhce ~]# firewall-cmd --get-zone-of-interface=eno16777728
public
# [root@rhce ~]# firewall-cmd --permanent --get-zone-of-interface
=eno16777728
external
将Firewalld防火墙服务的当前默认zone区域设置为public:
# [root@rhce ~]# firewall-cmd --set-default-zone=public
success
# [root@rhce ~]# firewall-cmd --get-default-zone
public
# [root@rhce ~]# firewall-cmd --get-active-zones
启动/关闭Firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用。):
# [root@rhce ~]# firewall-cmd --panic-on
success
# [root@rhce ~]# firewall-cmd --panic-off
success
查询在public区域中的ssh与https服务请求流量是否被允许:
# [root@rhce ~]# firewall-cmd --zone=public --query-service=ssh
yes
# [root@rhce ~]# firewall-cmd --zone=public --query-service=https
no
将Firewalld防火墙服务中https服务的请求流量设置为永久允许,并当前立即生效:
# [root@rhce ~]# firewall-cmd --zone=public --add-service=https
success
# [root@rhce ~]# firewall-cmd --permanent --zone=public --add-service=https
success
# [root@rhce ~]# firewall-cmd --reload
success
将Firewalld防火墙服务中http服务的请求流量设置为永久拒绝,并当前立即生效:
# [root@rhce ~]# firewall-cmd --permanent --zone=public
--remove-service=http
success
# [root@rhce ~]# firewall-cmd --reload
success
将Firewalld防火墙服务中8080和8081的请求流量允许放行,但仅限当前生效:
# [root@rhce ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
# [root@rhce ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
将原本访问本机888端口号的请求流量转发到22端口号,要求当前和长期均有效:
流量转发命令格式:
# firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
# [root@rhce ~]# firewall-cmd --permanent --zone=public
--add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
success
# [root@rhce ~]# firewall-cmd --reload
success
在客户机使用ssh命令尝试访问192.168.10.10主机的888端口:
# [root@client A ~]# ssh -p 888 192.168.10.10
The authenticity of host '[192.168.10.10]:888 ([192.168.10.10]:888)' can't be established.
ECDSA key fingerprint is b8:25:88:89:5c:05:b6:dd:ef:76:63:ff:1a:54:02:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.10]:888' (ECDSA) to the list of known hosts.
# [email protected]'s password:
Last login: Sun Jul 19 21:43:48 2017 from 192.168.10.10
在Firewalld防火墙服务中配置一条富规则,拒绝所有来自于192.168.10.0/24网段的用户访问本机ssh服务(22端口):
# [root@rhce ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
# [root@rhce ~]# firewall-cmd --reload
success
在客户机使用ssh命令尝试访问192.168.10.10主机的ssh服务(22端口):
# [root@client A ~]# ssh 192.168.10.10
Connecting to 192.168.10.10:22...
Could not connect to '192.168.10.10' (port 22): Connection failed.
3.2富规则
除了firewalld 提供的常规区域和服务语法之外,管理员还有另外两种选项来添加防火墙规则:直接规则和富规则。
直接规则
直接规则允许管理员将手动编码的 {ip,ip6,eb}tables 规则插入到firewalld 管理区域中。尽管这些规则很强大,并且暴露的内核 netfilter 子系统功能不会通过其他手段暴露,但可能难以管理。直接规则所提供的灵活性也低于标准规则和富规则。
富规则
firewalld 富规则为管理员提供了一种表达性语言,通过这种语言可表达 firewalld 的基本语法中未涵盖的自定义防火墙规则;例如,仅允许从单个IP地址(而非通过某个区域路由的所有IP地址)连接到服务。
systemctl mask iptables
systemctl mask ip6tables
systemctl mask ebtables
firewall-cmd --help
firewall-cmd --list-all
firewall-cmd --get-active-zones
firewall-cmd --zone=work --list-all
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --add-service=http
firewall-cmd --remove-service=http
firewall-cmd --add-port=8080/tcp
firewall-cmd --remove-port=8080/tcp
firewall-cmd --add-source=192.168.100.0/24
firewall-cmd --remove-source=192.168.100.0/24
firewall-cmd --add-icmp-block=echo-request
firewall-cmd --remove-icmp-block=echo-request
firewall-cmd --zone=work --add-service=http
firewall-cmd --permanent --zone=work --add-service=http
firewall-cmd --reload
firewall-cmd --get-zone-of-interface=eno16777736
firewall-cmd --get-zone-of-source=192.168.100.0/24
2、允许网站访问
#在qin1上
yum install httpd
echo firewalldtest > /var/www/html/index.html
systemctl restart httpd
firewall-cmd --permanent --add-icmp-block=echo-request
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
#在qin2上
ping 192.168.100.1
ssh 192.168.100.1
http://192.168.100.1
3、接口和source冲突
#在qin1上
yum install httpd
echo firewalldtest > /var/www/html/index.html
systemctl restart httpd
firewall-cmd --add-source=192.168.100.0/24
firewall-cmd --add-service=http
测试qin2通过ping、ssh、http等方式访问qin1,可访问qin1网站是否可行
firewall-cmd --zone=drop --change-interface=eno16777736
测试qin2通过ping、ssh、http等方式访问qin1,可访问qin1网站是否可行
firewall-cmd --zone=trusted --change-source=192.168.100.0/24
测试qin2通过ping、ssh、http等方式访问qin1,可访问qin1网站是否可行
#此实验不可加–permanent,否则无法生效
4、富规则端口转发
#在qin1上
setenforce 0
systemctl start firewalld
firewall-cmd --add-service=http
firewall-cmd --add-port=8899/tcp
yum install -y httpd
vim /etc/hosts
192.168.100.1 www.qin.com #增加
192.168.100.1 www.bing.com #增加
vim /etc/httpd/conf/httpd.conf
Listen 8899 #增加
mkdir /var/www/qin
mkdir /var/www/bing
echo qin80 > /var/www/qin/index.html
echo bing8899 > /var/www/bing/index.html
vim /etc/httpd/conf.d/0.conf
DocumentRoot "/var/www/qin"
ServerName www.qin.com
DocumentRoot "/var/www/bing"
ServerName www.bing.com
systemctl restart httpd
#在qin1和qin2上
http://192.168.100.1
http://192.168.100.1:8899
# 在qin1上
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8899""
firewall-cmd --reload
在qin1和qin2上
http://192.168.100.1 #qin1不过防火墙,所以不做转发,qin2过防火墙,产生端口转发
Firewalld防火墙图形化的界面如图所示,功能分别为1:选择"当前立即生效(Runtime)"或"重启后长期生效(Permanent)"配置、2:可选策略集合区域列表、3:常用系统服务列表、4:当前正在使用的区域、5:管理当前被选中区域中的服务、6:管理当前被选中区域中的端口、7:开启或关闭SNAT(伪装)技术、8:设置端口转发策略、9:控制ICMP协议请求流量、10:管理防火墙的富规则、11:管理网卡设备、12:被选中区域的服务,前面有√的表示允许放行、13:Firewalld防火墙图形化工具的状态。
Firewall-config图形化管理工具在配置策略后,不需要点击保存或完成按钮,只要有修改内容工具就会自动保存好。
将当前区域中http服务的请求流量允许放行,但仅限当前生效,如图所示:
添加一条允许放行8080-8088端口号(tcp协议)入站请求数据的策略,并且将配置模式提前设置为永久长期生效,以达到重启后依然生效的目的,配置过程如图所示。
配置防火墙策略允许8080-8088端口号的请求流量数据
在菜单中点击Reload Firewalld选项,来让配置文件立即生效,这与在命令行终端中执行了–reload参数的效果是一样的
让防火墙永久生效策略配置信息立即生效
SNAT源地址转换协议是为了解决IP地址资源匮乏问题而设计的技术协议,SNAT技术能够使得多个内网用户通过一个外网IP地址上网。
如图所示,在一个局域网中有多台主机,如果网关之上没有经过SNAT处理,那么请求过后的回复数据包就不能在互联网中找到这个私网IP地址,所以用户也就不能顺利取得想要的资源了,
Tcp_wrappers是红帽RHEL7系统中默认已经启用的一款流量监控程序,它能够根据来访主机地址与本机目标服务程序做允许或拒绝操作。
换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤防护工具,而Tcp_wrappers服务则是能够对系统服务进行允许和禁止的防火墙,从而在更高层面保护了Linux系统的安全运行。
控制列表文件修改后会立即生效,系统将会先检查允许策略规则文件(/etc/hosts.allow),如果匹配到相应的允许策略则直接放行请求,如果没有匹配则会去进一步匹配拒绝策略规则文件(/etc/hosts.deny)的内容,有匹配到相应的拒绝策略就会直接拒绝该请求流量,如果两个文件全都没有匹配到的话也会默认放行这次的请求流量。
下表中列出了常见的情况:
客户端类型 | 示例 | 满足示例的客户端列表 |
---|---|---|
单一主机 | 192.168.10.10 | IP地址为192.168.10.10的主 |
指定网段 | 192.168.10. | IP段为192.168.10.0/24的主机 |
指定网段 | 192.168.10.0 255.255.255.0 | IP段为192.168.10.0/24的主机 |
指定DNS后缀 | .rhce.com | 所有DNS后缀为.rhce.com的主机 |
指定主机名称 | www.rhce.com | 主机名称为www.rhce.com的主机 |
指定所有客户端 | ALL | 所有主机全部包括在内 |
在正式配置Tcp_wrappers服务前有两点注意的地方,
第一,在写禁止项目的时候一定要写上的是服务名称,而不是某种协议的名称,
第二,推荐先来编写拒绝规则,这样可以比较直观的看到相应的效果。
先来通过拒绝策略文件禁止下所有访问本机sshd服务的请求数据(无需修改原有的注释信息):
# [root@rhce ~]# vim /etc/hosts.deny
sshd:*
# [root@rhce ~]# ssh 192.168.10.10
ssh_exchange_identification: read: Connection reset by peer
接下来在允许策略文件中添加放行所有来自于192.168.10.0/24这个网段访问本机sshd服务请求的策略,服务器马上就允许了访问sshd服务的请求,效果非常直观:
# [root@rhce ~]# vim /etc/hosts.allow
# See 'man tcpd' for information on tcp_wrappers
sshd:192.168.10.
# [root@rhce ~]# ssh 192.168.10.10
# The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
#[email protected]'s password:
Last login: Wed May 4 07:56:29 2016
1:红帽RHEL7系统中iptables已经被firewalld服务彻底取代?
错,在系统中iptables和firewalld服务均可使用。
2:请您简述下防火墙拒绝规则中的DROP和REJECT动作有何不同之处?
DROP动作是丢包,不响应,而REJECT动作是拒绝请求,回应给对方拒绝信息。
3:如何将iptables服务的INPUT规则链默认策略设置为DROP动作?
执行命令iptables -P INPUT DROP后即可生效。
4:使用iptables命令配置禁止来自于192.168.10.0/24网段访问本机sshd服务(22端口)的防火墙策略应该怎么写?
执行命令iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j REJECT后即可生效。
5:请您简述下firewalld防火墙管理工具的zone区域作用?
我们可以依据不同的工作场景来调用不同的firewalld区域,实现对大量防火墙策略的快速切换。
6:如何在firewalld防火墙管理工具中将默认的zone区域设置为dmz?
执行命令firewall-cmd --set-default-zone=public后即可生效。
7:如何让firewalld防火墙管理工具中永久生效策略(Permanent)立即生效可用呢?
执行命令firewall-cmd --reload后即可生效。
8:使用SNAT源地址转换协议的目的是什么?
SNAT源地址转换协议是为了解决IP地址资源匮乏问题而设计的技术协议,SNAT技术能够使得多个内网用户通过一个外网IP地址上网。
9:Tcp_wrappers服务分别有允许策略配置文件和拒绝策略配置文件,请问匹配顺序是怎么样的?
Tcp_wrapper会依次匹配允许策略配置文件→拒绝策略配置文件,如果都没有匹配到也会默认放行流量。