Linux防火墙:隔离内部网络和外部网络的隔离技术(介于3-4层的传输)
防火墙规则:源地址 目标地址 端口 协议 MAC 数据包中的标志
类似ACL访问控制列表:过滤
从逻辑上而言,防火墙可以大体分为主机防火墙和网络防火墙
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。网络防墙火和主机防火墙并不中突,可以理解为,网络防火墙主外(集体),主机防火墙主内(个人)。从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件及别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。例如:思科ASA 华为防火墙 天融信防火墙 等。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,从协议上进行控制,性能低,成本低,如:iptables firewall(CentOS7独有的)等
iptables是Linux的防火墙管理工具,真正实现防火墙功能的是Netfilter,我们配置了iptables规则后Netfilter通过这些规则来进行防火墙过滤等操作
Netfilter 模块:
它是主要的工作模块,位于内核中,在网络层的五个位置(也就是防火墙的四表五链中的五链)注册了一些函数,用于抓取数据包;把数据包的信息拿出来匹配哥哥链位置在对应表中的规则:匹配之后,进行相应的处理 ACCEPT、DROP等等。
以下图说明了Netfilter和iptables之间的关系:
链就是位置,共有五个,包括:进路由(PREROUTING)、进系统(INPUT)、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING);
表就是存储的规则:数据包到了该链出,会去对应表中查询设置的规则,然后绝对是否放行、丢弃转发或是修改等操作。
常用于:
filter表 转发的时候会用到 过滤型数据包 (默认的表)
Nat 表 做地址转换时会需要
Mangle表 QOS:在网络拥塞时会提供优先级和服务类型 (较少使用)
Raw表 决定数据包是否被状态跟踪 (追踪流向)
通常来说,nat表于filter表使用率较高
命令格式:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
支持网络区域所定义的网络连接以及接口安全的动态防火墙管理工具。
支持IPv4、IPv6防火墙设置以及以太网桥接
支持服务或应运程序直接添加防火墙规则口
拥有两种配置模式
运行时配置
永久配置
firewalld和iptables比较
firewalld有图形化界面和字符界面,firewalld通过命令控制进程实现我们的需求
位于Linux内核中的包过滤功能体系
称为Linux防火墙的“内核态”
CentOS7默认的管理防火墙规则的工具(Firewalld)
称为Linux防火墙的“用户态”
firewalld做了文件上的隔离,不会断开业务(不丢失现有连接)
区域介绍:
Firewalld数据处理流程
检查数据来源的源地址
若地址关联到特定的区域,则执行该区域所指定的规则
若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则
若网络接口未关联到特定的区域,则使用默认区域并执行该区域所指定的规则
Firewanlld防火墙的配置方法
实时生效,并持续至Firewalld重新启动或重新加载配置
不中断现有连接
不能修改服务配置
不立即生效,除非Firewalld重新启动或重新加载配置
中断现有连接
可以修改服务配置
运行时做的配置,配置内容保存在内存中
"启动firewalld"
[root@localhost firewalld]# systemctl start firewalld
"设置firewalld为开机自启动"
[root@localhost firewalld]# systemctl enable firewalld
"若firewalld正在运行,通过systemctl status firewalld或firewall-cmd命令可以查看其运行状态"
[root@localhost firewalld]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2019-12-09 09:08:34 CST; 6h ago
Docs: man:firewalld(1)
Main PID: 661 (firewalld)
CGroup: /system.slice/firewalld.service
└─661 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
12月 09 12:04:39 localhost.localdomain firewalld[661]: WARNING: COMMAND_FAILED: '/....
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost firewalld]#
”区域“ 选项卡
”服务“ 子选项卡
”端口“ 子选项卡
”协议“ 子选项卡
”源端口“ 子选项卡
”伪装“ 子选项卡
”端口转发“ 子选项卡
”服务“ 选项卡
”模块“ 子选项卡
命令格式:systemctl 选项 firewalld
选项:start stop restart status
关闭防火墙:systemctl stop firewalld
firewall-cmd命令
支持全部防火墙特性
对于状态和查询模式,命令只返回状态,没有其他输出
–permanent参数:携带该参数表示永久配置,否则表示运行时配置
[–zone=] 选项:不懈怠此选项表示针对默认区域操作,否则针对指定区域操作
方式一:
[root@localhost firewalld]# firewall-cmd --reload
success
方式二:
[root@localhost firewalld]# firewall-cmd --complete-reload
success
此命令会导致状态信息丢失,多用于处理防火墙出现问题时。
方式三:
[root@localhost firewalld]# systemctl restart firewalld
[root@localhost firewalld]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@localhost firewalld]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp open ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync 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
[root@localhost ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
firewall-cmd --get-icmptypes 命令的执行结果中各种阻塞类型的含义分别如下所示:
使用 firewall-cmd 命令可以实现获取和管理区域,为指定区域绑定网络接口等功能
示例1:显示当前系统中的默认区域
[root@localhost ~]# firewall-cmd --get-default-zone
public
示例2:显示默认区域的所有规则
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
示例3:显示网络接口 ens33对应区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public
示例4:将网络接口 ens33 对应区域更改为 internal 区域
[root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --zone=internal --list-interfaces
ens33
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
internal
示例5:显示所有激活区域
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
为了方便管理 ,firewalld 预先定义了很多服务 , 存放在 /usr/lib/firewalld/services/ 目录中,服务通过单个的 XML 配置文件来指定。
这些配置文件则按以下格式命名:service-name.xml,每个文件对应一项具体的网络服务。
例如:ssh 服务,与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口。
在最新版本的 firewalld 中默认已经定义了 70 多种服务供我们使用,对于每个网络区域,均可以配置允 许访问的服务。当默认提供的服务不适用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中。
service 配置具有以下优点:
通过服务名字来管理规则更加人性化。
通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式
firewall-cmd 命令区域中服务管理的常用选项及说明 :
示例1:显示默认区域内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
ssh dhcpv6-client
示例2:设置默认区域允许访问 http 服务success
[root@localhost ~]# firewall-cmd --add-service=http
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
success
设置默认区域允许访问 https 服务
[root@localhost ~]# firewall-cmd --add-service=https
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
success
再次查看服务列表
[root@localhost ~]# firewall-cmd --list-services
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'internal' (see --get-active-zones)
You most likely need to use --zone=internal option.
ssh dhcpv6-client http https
在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就会自动打开。但是,对于非预定义的服务只能手动为指定的区域添加端口。
例如,执行以下操作即可实现在internal区域打开 443/TCP 端口
[root@localhost ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
若想实现在 internal 区域禁止 443/TCP 端口访问,可执行以下命令
[root@localhost ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
firewall-cmd 命令工具有两种配置模式:
运行时模式(Runtime mode)表示当前内存中运行的防火墙配置,在系统或 firewalld 服务重启、停止时配置将失效;
永久模式(Permanent mode)表示重启防火墙或重新加载防火墙时的规则配置,是永久存储在配置
文件中的。
firewall-cmd 命令工具与配置模式相关的选项有三个
–reload :重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置。
–permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动 firewalld 或重新加载防火墙规则时才会生效;若不带有此选项,表示用于设置运行时规则
–runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性
示例1:为work区域设置阻塞echo-reply类型的ICMP
[root@localhost ~]# firewall-cmd --zone=work --add-icmp-block=echo-reply
success
示例2:显示work区域阻塞的所有ICMP类型
[root@localhost ~]# firewall-cmd --zone=work --list-icmp-blocks
echo-reply
示例3:删除work区域与阻塞的echo-reply类型的ICMP
[root@localhost ~]# firewall-cmd --zone=work --remove-icmp-block=echo-reply
success
示例4:查询work区域的echo-request类型的ICMP是否阻塞
[root@localhost ~]# firewall-cmd --zone=work --query-icmp-block=echo-reply
no
在学习和工作中我们可以通过firewalld来控制是否允许某台主机访问本机,这也是一种简单的防范措施,在生产环境中,我们多用的还是通过硬件防火墙来进行防护。