目录
一、解释一下什么是内核、netfilter、iptables吧!
1、规则链:规则堆放的一个位置 --》如ip、端口号、 协议等
9、我们在INPUT链上配置规则 --》 防护其他的主机访问我们防火墙本身(自身)
六、实验:在实际工作中、我们为了防止自己把防火墙全部设置为了DROP模式、导致无法连接上、因此可尝试在修改防火墙前设置计划任务,防止服务的断开
七、iptables的匹配条件:(通用匹配条件、隐含匹配条件、MAC地址匹配、多端口匹配、IP地址范围匹配)
防护墙是什么呢?
防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
防火墙是否可以防火、防盗、防病毒呢?
防火墙的主要功能是:保护安全 --》 隔离防火墙认为的有危害的数据 --》攻击行为
防火墙像是:保安
只能用来保护安全、而不能杀死病毒
防护ddos攻击:不是一种病毒、 是人主动发起的
ddos:分布式拒绝服务攻击
将对方机器的CPU、内存、带宽、磁盘IO的资源消耗殆尽、不能继续给后面的新用户提供服务了
防火墙的一些功能:(保护功能)
1、防止来自被保护区域外部的攻击。
2、防止信息外泄和屏蔽有害信息。
3、集中安全管理。
4、安全审计和告警。
5、增强保密性和强化私有权。
6、访问控制和其他安全作用等。
防火墙的组成:
netfilter 内核模块:实现数据包的过滤的
iptables:给内核里的netfilter 传递参数的工具
完整的防火墙:netfilter + iptables
iptables的学习概述
iptables --》 是一个防火墙工具 --》linux里的 --》 一个软件
iptables 软件防火墙
硬件防火墙:装有防火墙的服务器
linux的防火墙是基于linux内核实现的
内核中有一个包过滤机制 netfilter、 它才是真正起作用的方法
netfilter 是内核中一个数据过滤的模块 保安
iptables 是与人打交道的 给保安netfilter传递消息的对讲机
一、解释一下什么是内核、netfilter、iptables吧!
1、内核:是linux操作系统最核心的软件
kernel:内存 :和硬件打交道
作用:
1、对CPU进行调度管理
2、对内存空间进行分配和管理
3、对进程进行管理
4、对磁盘里的文件系统进行管理
5、对网络进行管理
6、对其他硬件进行管理
2、netfilter:
位于linux内核中的包过滤防火墙功能体系
称为 linux防火墙的“内核态”
内核态:工作在内核空间的进程的状态 --》内核态
用户态:工作在用户空间的进程状态 --》用户态
3、iptables:
位于/sbin/iptables、是用来管理防火墙的工具
为防火墙体系提供过滤规则和策略、决定如何过滤或处理达到防火墙主机的数据包
称为linux防火墙的“用户态”
用户态的进程不能访问内核空间
但是内核态的进程可以访问用户空间
二、什么时候用户启用的进程状态可以变成内核态?
1、系统调用的时候
2、中断的时候 --》 中断 --》中间运行的时候被打断 --》interrupt 中断
硬件出现问题的时候会出现中断(出现异常)
IO(进出或者读写)的时候 --》 input output --》网络IO 磁盘IO
三、iptables的环境配置:
iptables是Linux自带的软件,用于配置和管理网络包过滤规则。
因此我们使用的环境是:
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core) #centos版本
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64 #内核的版本
[root@localhost ~]#
查看自己的内核等级
还有uname -a
iptables是工作在TCP/IP的网络层
四、iptables的规则表\链结构:
我们先看看下面这张图:
正如图片中写的,我们可以将五个链路比喻成三国中的五个角色,这样,四表五链的学习会简单很多。
1、规则链:规则堆放的一个位置 --》如ip、端口号、 协议等
规则链:
规则的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中
规则链是防火墙规则/策略的集合
默认的5种规则链:
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING链:在进行路由选择后处理数据包
PREROUTING链:在进行路由选择前处理数据包
规则链:规则堆放的一个位置 --》如ip、端口号、 协议等
2、规则表:规则表是规则链的集合
具有某一类相似用途的防火墙规则、按照不同处理时机区被分配到不同的规则链、被归置到不同的“表”中
默认的4个规则表:
raw表:确定是否对该数据包进行状态跟踪 --》记录状态、 你是新的数据包、 还是老的数据包
tcp:syn 当处于 ESTABLISHED 可以快速连接
mangle表:为数据包设置标记 --》可以给数据包插入标记
nat表:修改数据包中的源、目标IP地址或端口 --》可以修改ip地址和端口号 --》***
filter表:确定是否放行该数据包(过滤) --》用的比较多**** 默认展示的表
Chain : 链
blockChain:区块链
policy:策略 规则
ACCEPT:可接受的
target:目标
如下所示:
[root@localhost /]# iptables -t filter -L --》查看防火墙里的filter表里的规则链 ***
也可以通过这条命令查看其他表里的规则链
Chain INPUT (policy ACCEPT)
INPUT_direct all -- anywhere anywhere
INPUT_ZONES_SOURCE all -- anywhere anywhere
INPUT_ZONES all -- anywhere anywhere
Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target prot opt source destination
目标 协议 选择 源 目的地
Chain OUTPUT_direct (1 references)
target prot opt source destination
[root@localhost /]#
规则表里的优先顺序:raw、 mangle、 nat、 filter
3、规则链的匹配顺序
规则链间的匹配顺序:
入站数据:PREROUTING、INPUT
出站数据:OUTPUT、POSTROUTING
转发数据:PREROUTING、FORWARD、POSTROUTING
规则链内的匹配顺序:
1、按顺序异常进行检查、 找到相匹配的规则即停止
2、若在该链内找不到相匹配的规则、则按该链的默认策略处理
默认规则:policy ACCEPT
下面就是数据包过滤匹配图
4、linux路由转发功能的打开
[root@localhost /]# cat /proc/sys/net/ipv4/ip_forward
1
[root@localhost /]#
表示打开了路由功能
[root@localhost /]# echo 0 >/proc/sys/net/ipv4/ip_forward
[root@localhost /]# cat /proc/sys/net/ipv4/ip_forward
0
[root@localhost /]#
表示关闭了路由功能
五、iptables命令的使用:
1、iptables的语法规则:
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
2、注意事项:
1、不指定表名时、默认表示filter表
2、不指定链名时、默认表示该表内所有链
3、除非设置规则链的缺省策略、 否则需要指定匹配条件
3、设置规则内容:
1、-A:在链表(末尾)追加一条新的规则
2、-I:在指定位置(或链首)插入一条新的规则
3、-R:修改、替换指定位置或内容的规则
4、-P:设置指定链的默认策略
4、列表查看规则:
1、-L:列表查看各条规则信息
2、--line-numbers:查看规则信息时显示规则的行号
3、-n:以数字形式显示IP地址、 端口等信息
4、-v:显示数据包的个数、 字节数等详细信息
5、--line:产生编号
5、清除规则:
1、-D:删除指定位置或内容的规则
2、-F:清空规则链内的所有内容
6、自定义规则链:
1、-N:创建一条新的规则链
2、-X:删除自定义的规则链
7、其他:
1、-h:查看iptables命令的使用帮助
8、新的链如何被使用?
1、创建新链
[root@localhost shell]# iptables -t filter -N sanchuang --》自定义链
[root@localhost shell]# iptables -t filter -I INPUT -p icmp -j sanchuang -》给自定义的链赋值
[root@localhost shell]# iptables -L sanchuang
Chain sanchuang (1 references)
target prot opt source destination
[root@localhost ~]# iptables -L sanchuang
Chain sanchuang (0 references)
target prot opt source destination
[root@localhost ~]# iptables -X sanchuang --》删除自定义的链 删除前必须把链给清空 否则删除不了
[root@localhost ~]# iptables -L sanchuang
iptables: No chain/target/match by that name.
9、我们在INPUT链上配置规则 --》 防护其他的主机访问我们防火墙本身(自身)
[root@localhost /]# iptables -t filter -A INPUT -p tcp -j ACCEPT
#给我们的 filter表里的INPUT链 设置为 允许 TCP协议的通过
[root@localhost /]# iptables -I INPUT -p udp -j ACCEPT
#设置INPUT链 允许 UDP协议的通过
[root@localhost /]# iptables -I INPUT 2 -p icmp -j ACCEPT
#设置INPUT链 位置为第二个 允许ICMP协议的通过
[root@localhost /]# iptables -P INPUT DROP
#设置默认的INPUT链的规则是阻止所以协议的访问
[root@localhost /]# iptables -L INPUT --line-numbers
#查看iptables防火墙,并且查看行数
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT tcp -- anywhere anywhere
[root@localhost /]#
将他写成脚本:
[root@localhost shell]# cat iptables.sh
#!/bin/bash
iptables -F -t filter #清除filter表里的规则
iptables -t filter -A INPUT -p tcp -j ACCEPT
iptables -I INPUT -p udp -j ACCEPT
iptables -I INPUT 2 -p icmp -j ACCEPT
iptables -P INPUT DROP
[root@localhost shell]#
下面是一些实验中的命令:
[root@localhost /]# nft list ruleset --》查看filter表
[root@localhost /]# firewall-cmd --list-all --》firewall 防火墙
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost /]#
[root@localhost /]# netstat -anplut|grep ssh --》 查看ssh连接的端口号
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 4593/sshd: root@pts
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1074/sshd
tcp 0 0 192.168.2.200:22 192.168.2.118:50347 ESTABLISHED 4593/sshd: root@pts
tcp6 0 0 ::1:6010 :::* LISTEN 4593/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 1074/sshd
[root@localhost /]#
=====
[root@localhost shell]# ls -a --》 可查看隐藏文件
. for2.sh pos_var.sh unused_ip.txt
.. for3.sh scan_ip.sh up.txt
creat_user.sh for.sh sc_mkpasswd.sh used_ip.txt
delete_user.sh if2.sh .sc_mkpasswd.sh.swp --》vim编辑过程中断网导致编辑失败、产生的警告文件
down.txt if.sh snat.sh while2.sh
first.sh lan_scan.sh test.sh while.sh
[root@localhost shell]# vim sc_mkpasswd.sh
[root@localhost shell]# rm -rf .sc_mkpasswd.sh.swp --》 删除警告文件 可去除警告
[root@localhost shell]# vim sc_mkpasswd.sh
[root@localhost shell]#
六、实验:在实际工作中、我们为了防止自己把防火墙全部设置为了DROP模式、导致无法连接上、因此可尝试在修改防火墙前设置计划任务,防止服务的断开
1、计划任务:每一分钟 更新一次防火墙规则
步骤:
[root@localhost shell]# cat clear_iptables.sh --》清除iptables脚本
#!/bin/bash
iptables -F -t filter
iptables -F -t nat
iptables -P INPUT ACCEPT
[root@localhost shell]#
[root@localhost shell]# crontab -e --》 进行linux计划任务的编写
[root@localhost shell]# crontab -l --》 查看crontab文件内的计划任务
*/1 * * * * bash /shell/clear_iptables.sh
[root@localhost shell]#
[root@localhost shell]# cd /var/log --》去寻找cron的日志
[root@localhost log]# ls
anaconda maillog-20230115 sssd
chrony ntpstats vmware-network.4.log
cron --》找到了 pluto vmware-network.5.log
cron-20221221 ppp vmware-network.6.log
[root@localhost log]# tail -f cron --》动态检测cron日志
Feb 25 03:35:07 localhost crond[7825]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Feb 25 03:36:01 localhost CROND[7843]: (root) CMD (bash /shell/clear_iptables.sh)
Feb 25 03:37:01 localhost CROND[7875]: (root) CMD (bash /shell/clear_iptables.sh) --》 成功执行
[root@localhost log]# cd /shell
[root@localhost shell]# ls
clear_iptables.sh for3.sh pos_var.sh up.txt
creat_user.sh for.sh scan_ip.sh used_ip.txt
delete_user.sh if2.sh sc_mkpasswd.sh user.txt
down.txt if.sh snat.sh while2.sh
first.sh iptables.sh test.sh while.sh
for2.sh lan_scan.sh unused_ip.txt
[root@localhost shell]# bash clear_iptables.sh --》这里执行
[root@localhost shell]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
[root@localhost shell]#
为什么能在外面实行、但在crontab里面不能实行?
因为crontab在路径里找不到
所以我们只能在 clear_iptables.sh 里用绝对路径
[root@localhost shell]# which iptables --》 查看绝对路径
/usr/sbin/iptables
[root@localhost shell]# cat clear_iptables.sh
#!/bin/bash
/usr/sbin/iptables -F -t filter
/usr/sbin/iptables -F -t nat
/usr/sbin/iptables -P INPUT ACCEPT
[root@localhost shell]# tail -f /var/log/cron --》查看动态日志
Feb 25 03:46:01 localhost CROND[8169]: (root) CMD (bash /shell/clear_iptables.sh)
Feb 25 03:47:01 localhost CROND[8192]: (root) CMD (bash /shell/clear_iptables.sh)
Feb 25 03:48:01 localhost CROND[8220]: (root) CMD (bash /shell/clear_iptables.sh)
Feb 25 03:49:02 localhost CROND[8245]: (root) CMD (bash /shell/clear_iptables.sh) --》成功执行
[root@localhost shell]# iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT udp -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere
[root@localhost shell]# iptables -L INPUT --》成功实现了计划任务
Chain INPUT (policy ACCEPT)
target prot opt source destination
2、计划任务很大的坑:
当写完了计划任务的脚本、 但是无法执行计划任务的时候、 可能是你的crontab的PATH地址里面没有你需要运行软件的地址、因此我们需要添加地址、防止出现无法执行的问题
调用的脚本里、 如果有些命令比使用绝对路径、 会导致命令查找不到、 从而不能被执行
七、iptables的匹配条件:(通用匹配条件、隐含匹配条件、MAC地址匹配、多端口匹配、IP地址范围匹配)
通用条件匹配:
1、协议匹配 : -p 协议名 协议名可使用在“/etc/protpcols”文件中的定义的名称 如 TCP ICMP UDP等
2、地址匹配 : -s 源地址 -d 目标地址 地址可以是某个IP地址、网络地址(带掩码长度)
3、接口匹配 : -i 网络接口名(入) -o 网络接口名(出) 分别对应接收、 发送数据包的网络接口
隐含条件匹配:
1、端口匹配: --sport 源端口 --dport 目标端口 可采取范围 “端口1:端口2”指定范围内的端口
2、TCP标记匹配: --tcp-flags 检测范围 被设置的标记 如:SYN、RST、ACK
3、ICMP类型匹配: --icmp-type ICMP类型 ICMP类型可以使用类型字符串或者对应的数值、 例如:Echo-Request、 Echo-Reply
8 0
iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 2233 -j ACCEPT --》 当使用dport端口号时、必须指明是那种协议、不然会报错 如TCP UDP ICMP 等
[root@localhost ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:infocrypt
[root@localhost ~]#
[root@localhost ~]# iptables -A INPUT -p tcp --dport 2233:8000 -j ACCEPT --》 端口号可用“:”隔开表示端口号的一个范围
[root@localhost ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:infocrypt
ACCEPT tcp -- anywhere anywhere tcp dpts:infocrypt:irdmi
[root@localhost ~]#
MAC地址匹配:使用 -m mac 结合 --mac-source MAC地址 的形式
多端口匹配: 使用 -m multiport 结合 --sports 源端口列表 或者 --dports 目标端口列表 的形式
多个端口号之间用 “,” 分隔、 连续端口号用 “:” 分隔
IP地址匹配范围:使用 -m iprange 结合 --src-range 源IP范围 或者 --dst-range 目标IP范围 的形式
以 “-”符号连接起始IP地址、结束IP地址
iptables -A INPUT -p -tcp -m multiport --dport 20, 21, 25, 110, 1250:1280 -j ACCEPT
导入导出防火墙规则
导出规则:
iptables-save
结合重定向输出 “>” 符号保存规则信息
导入规则:
iptables-restore
结合重定向输入 “<” 符号恢复规则信息