文章目录
-
目录
文章目录
前言
一.静态防火墙:iptables
iptables五链
iptables 四表
iptables控制类型
iptables命令配置
前言
这儿主要介绍Linux系统本身提供的软件防火墙的功能,即数据包过滤机制。 数据包过滤,也就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决定该连接为放行或抵挡的机制。由于这种方式可以直接分析数据包头部数据,包括硬件地址,软件地址,TCP、UDP、ICMP等数据包的信息都可以进行过滤分析,因此用途非常广泛。
一.静态防火墙:iptables
iptables 不是防火墙,而是客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架netfilter中。
iptables 特点:
- netfilter位于内核空间中,而iptables是控制netfilter的工具,位于用户空间。
- 通过iptables可以编写某些规则并保存到netfilter中,从而起到防护效果。
- netfilter/iptables组成Linux平台下的包过滤防火墙,可以完成包过滤,NAT等功能。
- iptables默认默认允许访问,需要拒绝的采取限制。
- iptables无法过滤内网数据包,仅过滤外网数据包
- iptables修改规则之后必须全部刷新才可以生效
iptables五链
五链实际是五规则链的简称,而每个规则链由多个规则组成;每个数据包被iptables过滤时都要经过如下五个规则链的筛选:
规则链 | 位置 | 作用 | 场景 |
PREROUTING链 | 数据包进入网络接口后,路由决策前 | 可以用于修改数据包的目的地址(DNAT),改变数据包的路由路径 | 用户目标NAT |
INPUT链 | 数据包在被路由到本地系统之后 | 过滤进入本地服务器的数据包 | 防火墙规则,允许或拒绝进入本地系统的流量 |
FORWARD链 | 数据包在路由决策之后 | 控制通过本地系统转发的数据包 | 路由器或网关上,用于控制数据包的转发 |
OUTPUT链 | 数据包由本地系统产生,经过路由决策之前 | 控制本地系统发出的数据包 | 允许或拒绝本地系统发送的流量 |
POSTROUTING链 | 据包离开网络接口之前 | 可以用于修改数据包的源地址,改变数据包离开系统时的地址信息 | 用户源NAT |
iptables 四表
在Linux中的iptables中,表(tables)是用于组织规则链的结构。iptables包含四个主要的表,每个表专门用于不同类型的数据包处理。以下是主要的四个表:
表 | 功能 | 默认链 | 应用场景 | 作用 |
filter表 | 主要用于数据包过滤 | INPUT、FORWARD、OUTPUT | 根据定义的规则决定是否接受、拒绝或丢弃数据包 | 防火墙规则 |
nat表 | 用于网络地址转换(NAT) | PREROUTING、POSTROUTING、OUTPUT | 改数据包的源地址或目的地址,以实现地址映射和端口转发 | NAT |
mangle表 | 用于对数据包进行修改 | PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD | 可以修改数据包的TTL值等 | 需要对数据包的服务质量(QoS)进行控制或流量整形时 |
raw表 | 对数据包的状态跟踪机制 | PREROUTING、OUTPUT | 可以决定数据包是否被状态跟踪机制处理,通常用于实现高性能的处理 | 需要对状态跟踪机制进行细粒度控制时 |
数据包到达防火墙根据下图进行匹配:
iptables控制类型
iptables的每张表包含不同的控制类型,不同的控制类型允许管理员对数据包执行不同的操作。以下是iptables的主要控制类型:
- Accept:允许数据包通过
- Drop:丢弃数据包
- Reject:拒绝数据包通过
- Snat:修改数据包源IP
- Dnat:修改目标IP
- Masquerade:伪装成一个非固定的公网IP
- Log:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables命令配置
基本语法:
iptables [选项] 命令 [链] [匹配条件] [目标]
iptables -t 表名 【参数】 规则链名 -p 协议名 -s 源IP --sport 源端口 -d 目标IP --dport 目标端口 -j 动作
参数:
-A:在指定链的末尾插入指定的规则
-D:在指定的链中删除 一个或多个指定规则
-I: 在指定链中的指定位置插入一条或多条 规则
-R: 替换/修改第几条规则
常见选项:
演示案例:
#允许所有IP访问3306端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
#允许指定IP访问3306端口
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3306 -j ACCEPT
#显示规则
iptables -L
#保存规则
#删除INPUT链表中的规则
iptables -D INPUT -p tcp --dport 3306 -j ACCEPT
注意:iptables的匹配规则是自上而下匹配,当遇见如下情况:如Mysql数据库的3306端口已经开放,但是仍然无法通过3306端口远程连接,此时可能是在开放3306的规则之前的某些规则阻止了连接。
上述情况解决办法如下:在INPUT链表首部插入规则
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
或者可以逐一在每条规则之前插入规则来测试阻止连接的规则是哪一条
#在在 INPUT 链的第2个位置插入一条允许所有 IP 地址访问 3306 端口的规则
iptables -I INPUT 2 -p tcp --dport 3306 -j ACCEPT
找到阻止连接的规则后可以删除阻止连接的规则
#删除链表指定位置的规则
sudo iptables -D INPUT 2
二.动态防火墙:firewalld
动态防火墙firewalld和静态防火墙iptables都是定义防火墙规则的工具,定义好的规则交给netfilter即网络过滤器来读取,从而实现防火墙功能。
与iptables不同点:
- firewalld不仅可以过滤外网数据包,也可以过滤内网数据包。
- firewalld可以动态修改规则,允许更新规则的同时不中断会话连接。
- firewalld默认拒绝所有访问,需要配置允许访问规则。
- firewalld取消规则链的概念,新增区域的概念。
firewalld 区域概念
firewalld 为了方便管理网络流量,增添了区域的概念,firewall防火墙将不同的流量导入不同的区域再对各区域制定相应的规则从而方便了流量管理。下面是一些区域的默认规则
firewall 命令管理工具
firewall-cmd是的命令管理工具:
firewll-cmd命令生效模式
- runtime模式:运行时模式,立即生效,重启失效
- permanent模式:永久模式,重启生效
基本语法:
firewaa-cmd --zone=指定区域 +参数
参数:
我们可以额使用firewall-cmd --list-all列出所有区域的规则,各区域规则各行解释如下:
[root@localhost1 ~]# firewall-cmd --list-all
public (active) #当前激活的区域是 public
target: default #默认的防火墙策略。ACCEPT、REJECT DROP
icmp-block-inversion: no #是否启用 ICMP 反转阻止
interfaces: ens160 #当前区域绑定的接口
sources: #指定的源地址
services: cockpit dhcpv6-client ssh #允许的服务
ports: #开放的端口
protocols: #允许的协议
forward: yes #
masquerade: no #是否启用了 IP 伪装(NAT)
forward-ports: #端口转发规则
source-ports: #源端口规则
icmp-blocks: #阻止的 ICMP 类型
rich rules: #自定义规则
案例1:
禁止主机192.168.23.133主机使用ssh远程连接本地服务器
首先测试一下未添加规则前能否正常远程连接:
防火墙未添加规则前远程主机能够正常远程连接,下面让配置一下防火墙规则:
[root@localhost1 ~]# sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.23.133" service name="ssh" reject'
success
[root@localhost1 ~]# firewall-cmd --reload
success
[root@localhost1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.23.133" service name="ssh" reject
再次远程连接本地主机发现提示拒绝连接, 这是因为防火墙的规则限制了远程连接
当我们再次删除防火墙规则后,被限制的主机就可以正常远程连接本地主机
案例2:
防火墙未放行3306端口之前,本地服务器上的Mysql数据库无法通过navciat远程连接 。
此时,只需要防火墙放行3306端口,navciat便可以正常连接,命令如下:
防火墙日志
防火墙默认关闭日志记录功能,需要手动开启,开启方法如下:
vim /etc/firewalld/firewalld.conf
将其中的”LogDenied=off”调整为”LogDenied=all“
off表示关闭不记录被拒绝日志,all表示记录所有被拒的日志
查看被拒绝的日志信息:
dmesg --| grep -i reject