网络安全与防火墙

第八章 网络安全与防火墙

一.iptables基本操作

1.1 iptables简介

iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。

“四表”是指 iptables 的功能,默认的 iptables规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):

  • filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。
  • nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。
  • mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。
  • raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。

“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。

Linux 防火墙的过滤框架,如图 1 所示。

可以看出,如果是外部主机发送数据包给防火墙本机,数据将会经过 PREROUTING 链与 INPUT 链;如果是防火墙本机发送数据包到外部主机,数据将会经过 OUTPUT 链与 POSTROUTING 链;如果防火墙作为路由负责转发数据,则数据将经过 PREROUTING 链、FORWARD 链以及 POSTROUTING 链。

iptables语法格式
iptables 命令的基本语法格式如下:

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

各参数的含义为:

  • -t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
  • COMMAND:子命令,定义对规则的管理。
  • chain:指明链表。
  • CRETIRIA:匹配参数。
  • ACTION:触发动作。
  • iptables 命令常用的选项及各自的功能如表 2 所示
选 项 功 能
-A 添加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出添加防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置链默认规则

1.2 iptables基本操作例子

1.查看filter表的所有规则

[root@gzh-cs8 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

2.查看nat表的所有规则

[root@gzh-cs8 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

因为我们并没有对iptables做什么配置所有他不会显示表的规则, centos8默认是firewalld作为默认防火墙的.

3.拒绝进入防火墙的所有ICMP协议数据包

[root@gzh-cs8 ~]# iptables -I INPUT -p icmp -j REJECT
[root@gzh-cs8 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

修改以后我们再查看规则就可以看到我们新加的这个规则了.

4.向filter表插入一条新的入栈规则,丢弃192.168.88.138主机发送给防火墙本机的所有数据包.

[root@gzh-cs8 ~]# iptables -A INPUT -s 192.168.88.138 -j DROP
[root@gzh-cs8 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
DROP all -- 192.168.88.138 0.0.0.0/0

从规则中可以知道只要是192.168.88.138来的数据包都会drop

5.修改filter表中INPUT链的默认规则为接受数据包.

[root@gzh-cs8 ~]# iptables -t filter -P INPUT ACCEPT

6.丢弃外网接口(ens160)进入防火墙本机的源地址为私网地址的数据包

[root@gzh-cs8 ~]# iptables -A INPUT -i ens160 -s 192.168.0.0/16 -j DROP
[root@gzh-cs8 ~]# iptables -A INPUT -i ens160 -s 172.16.0.0/12 -j DROP
[root@gzh-cs8 ~]# iptables -A INPUT -i ens160 -s 10.0.0.0/8 -j DROP

运行完第一个你会发现你的ssh连不上了哈哈哈🤣,为什么呢他设置了不允许该段的主机访问,做完以后在虚拟机改回来就行.

删除刚才加的那个规则,看是第几条规则再删别删错了.

[root@gzh-cs8 ~]# iptables -D INPUT 3

二.firewalld基本操作

2.1firewalld简介

firewalld是自CentOS 7以来带有一个动态的、可定制而无需重新启动防火墙守护程序或服务。firewall-cmd就是iptables/nftable的前端。在CentOS 8中,nftables取代iptables成为默认的Linux网络包过滤框架。本文介绍如何为您的CentOS 8设置防火墙,并借助firewall-cmd管理工具进行管理。

在CentOS7之后,当你使用firewalld时,有两个基本概念,你必须要知道的

  • 服务(service)
  • 区域(zone)

在传统的iptables基于规则的顺序的匹配先后顺序来多数据包进行处理,处理的动作基本上非黑即白这个逻辑,因此iptables的基于规则列表的运行机制相对固化,缺少灵活性。而firewalld将传入的流量分类到由源IP和/或网络接口定义的区域中。每个区域都有的配置,可以根据指定的标准接受或拒绝数据包。

firewalld不仅打破来规则列表固化的先后顺序,而且将以往iptables规则中的tcp/ip信息,使用了一个叫service(服务)来独立封装在一个xml文本中,让使用者更加容易记忆和理解.

什么叫service?粗暴地说,就是应用协议,而与该协议相关的应用能为你做什么。
例如,我上网经常用到tcp协议的80端口和443端口,还有域名解析要用到udp协议的35端口,访问共享文件夹需要用到udp端口的137和138端口,OK,我们这些常用的应用,firewalld都已经内置了。因此在防火墙的配置和管理会变得简单以及人性化。

而理解区域就更简单了,就是对各种内置服务预分组的集合。您可以通过运行以下ls命令查看所有区域,没错,区域也是以XML文档内容预定义在Linux系统中的:

[root@gzh-cs8 ~]# ls -l /usr/lib/firewalld/zones/
总用量 40
-rw-r--r--. 1 root root 299 2月 4 2021 block.xml
-rw-r--r--. 1 root root 293 2月 4 2021 dmz.xml
-rw-r--r--. 1 root root 291 2月 4 2021 drop.xml
-rw-r--r--. 1 root root 304 2月 4 2021 external.xml
-rw-r--r--. 1 root root 397 2月 4 2021 home.xml
-rw-r--r--. 1 root root 412 2月 4 2021 internal.xml
-rw-r--r--. 1 root root 729 2月 1 2021 nm-shared.xml
-rw-r--r--. 1 root root 343 2月 4 2021 public.xml
-rw-r--r--. 1 root root 162 2月 4 2021 trusted.xml
-rw-r--r--. 1 root root 339 2月 4 2021 work.xml

2.2 了解预定义区域

1.获取所有可用的区域

[root@gzh-cs8 ~]# firewall-cmd --get-zones 
block dmz drop external home internal nm-shared public trusted work
  • block–拒绝所有传入的网络连接。仅从系统内部启动的网络连接是可能的。
  • dmz –经典非军事区(DMZ)区域,它提供对LAN的有限访问,并且仅允许选定的传入端口。
  • drop –丢弃所有传入网络连接,并且仅允许传出网络连接。
  • external-对于路由器连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。
  • home –适用于您信任其他计算机的局域网内的家用计算机,例如笔记本电脑和台式机。仅允许选择的TCP / IP端口。
  • internal–当您主要信任LAN上的其他服务器或计算机时,用于内部网络。
  • public–您不信任网络上的任何其他计算机和服务器。您仅允许所需的端口和服务。对于云服务器或您所托管的服务器,请始终使用公共区域。
  • trust–接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或VM。
  • work–在信任同事和其他服务器的工作场所中使用。

2.如何查找您的默认区域

默认区域为public,所有网络接口都分配给此区域,用户可以将网络接口和源分配给区域。其中一个区域设置为默认区域。

获取默认区域运行

[root@gzh-cs8 ~]# firewall-cmd --get-default-zone 
public
# 查看活动区域和分配给它们的网络接口
[root@gzh-cs8 ~]# firewall-cmd --get-active-zones
public
interfaces: ens160

3.查看与公共区域关联的防火墙规则或服务

[root@gzh-cs8 ~]# firewall-cmd --list-all 
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

2.3区域的target

这个跟iptables的target是相似的,它可以设置为以下选项之一:

  • default:不做任何事情
  • ACCEPT:接受数据包
  • REJECT 拒绝数据包,返回拒绝的信息
  • DROP:丢弃数据包,并且不做任何答应

要设置区域的target,使用–zone选项指定区域,–set-target选项指定目标。

例如,要将公共区域的目标更改为DROP

[root@gzh-cs8 ~]# firewall-cmd --zone=public --set-target=DROP 

2.4创建新的区域

firewalld还可以您创建自己的区域。

示例:创建一个名为memcached的新分区,打开端口11211,并仅允许从IP地址192.168.88.138进行访问:

firewall-cmd --new-zone=visitors --permanent 

放某些端口和添加

firewall-cmd --zone=visitors --add-port=80/tcp --permanent 
firewall-cmd --zone=visitors --add-port=53/tcp --permanent
firewall-cmd --zone=visitors --add-source=192.168.88.138/24 --permanent

重新加载Firewalld:

firewall-cmd --reload

2.5服务(services)

服务只不过是本地端口、协议、源端口、目的地和防火墙助手模块的列表。举个例子,服务器就是包含一组tcp/ip协议细节的集合:

  • 端口: 443,21或22
  • 服务: ssh,http或https
  • 协议: tcp/udp/icmp

我们可以查看一下防火墙所支持的服务类型

[root@gzh-cs8 ~]# 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 collectd 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 galera 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 kube-apiserver 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 rquotad 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

如何查看当前区域允许哪些服务

[root@gzh-cs8 ~]# firewall-cmd --list-service 
cockpit dhcpv6-client ssh

以上命令表明我的默认区域是public的,并且我允许CentOS 8/RHEL 8上的传入SSH连接(端口22)、dhcpv6-client和cockpit服务端口。默认情况下会丢弃所有其他流量。

如果CentOS 8上配置nginx,我需要使用firewall-cmd打开端口80/443。假设您不需要cockpit或dhcpv6-client等不必要的服务,可以通过修改规则将其删除。例如,删除服务dhcpv6-client和cockpit:

[root@gzh-cs8 ~]# firewall-cmd --remove-service=cockpit --permanent firewall-cmd --remove-service=dhcpv6-client --permanent firewall-cmd --reload 

运行时Firewalld配置更改是临时的。当您重新启动CetnOS8服务器时,它们就消失了。例如,以下命令将临时打开Nginx/Apache Web服务器的TCP端口80/443(Https):

[root@gzh-cs8 ~]# firewall-cmd --zone=public --add-service=http firewall-cmd --zone=public --add-service=https 

当您重新启动Linux机器或重新启动Firewalld服务本身时,不会保留上述规则。

如何将规则添加到永久集并重新加载Firewalld?只需将添加–permanent参数即可

[root@gzh-cs8 ~]# firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --zone=public --add-service=https --permanent firewall-cmd --reload 

如何拒绝/阻止TCP/UDP端口/协议

[root@gzh-cs8 ~]# firewall-cmd --zone=public --remove-port=23/tcp --permanent 

开放源IP

要允许来自特定IP地址(或范围)的所有传入流量,请使用–zone选项指定区域,并使用–add-source选项指定源IP。例如,要允许公共区域中来自192.168.172.32的所有传入流量,请运行:

[root@gzh-cs8 ~]# firewall-cmd --zone=public --add-source=192.168.88.138