1、安全技术
1.1入侵检测系统
特点是不阻断网络访问,主要提供报警和事后监督。不主动介入,默默的看着你(类似于监控)
1.2入侵防御系统
透明模式工作, 数据包,网络监控,服务攻击,木马,蠕虫,系统漏洞等进行准确的分析和判断。
在判定为攻击行为后会立即阻断,主动的防御(所有的数据在进入本机之前必须要通过的设备或者软件)
2、防水墙
是一种防止内部信息泄露的产品。对外有防火墙的功能,对内是透明模式,类似于监控。事前事中事后都知道。
3、防火墙
3.1概念
核心:隔离
工作在网络或者主机的边缘
对网络或者主机的数据包基于一定的规则进行检查。匹配到的规则放行或者拒绝(数据包将会被丢弃。
只开放允许访问的策略(白名单机制,拒绝所有,允许个别)
iptables:linux自带的防火墙,一般用于内部配置,对外一般不适用(对外都使用专业的)
firewalld:linux自带的防火墙,centos7默认的防火墙。
都是包过滤防火墙(对数据包进行控制)
iptables:linux自带的防火墙,一般用于内部配置,对外一般不适用(对外都使用专业的)。工作在网络层,针对数据包实施过滤和限制,包过滤防火墙
firewalld:linux自带的防火墙,centos7默认的防火墙。
3.2包过滤防火墙
特点:在网络层对数据包进行选择,选择的依据是防火墙设置的策略。策略包括:ip地址,端口,协议。
优点:处理速度快,易于维护
缺点:无法检查应用层数据,病毒无法进行处理
3.3应用层防火墙
在应用层对数据进行检查,比较安全
优点:更安全,问题可以精准定位
缺点:所有数据都会检查,增加防火墙的负载
4、通信的要素
4.1五大要素
源ip、目的ip、源端口、目的端口、协议(TCP/UDP)
4.2四大要素
源ip、目的ip、源端口、目的端口
5、内核态和用户态
5.1内核态
涉及到软件的底层代码或者是系统的基层逻辑,以及一些硬件的编码。开发人员更关注内核态
数据如果是内核态处理,速度相对较快
iptables的过滤规则就是由内核来进行控制
5.2用户态
应用层软件层面,人为控制的一系列操作,使用功能。运维人员只考虑用户态
数据只通过用户态处理速度比较慢
6、iptables的配置和策略
四表五链
6.1四表
raw表:用于控制数据包的状态,跟踪数据包的状态
mangle表:修改数据包的头部信息
nat表:网络地址转换,可以改变数据包的源地址和目的地址
filter表:也是iptables的默认表,不做声明默认就是filter表。用来过滤数据包,控制数据包的进出以及接受和拒绝数据包
6.2五链
PREROUTING链:处理数据包进入本机之前的规则(NAT表)
INPUT链:处理数据包进入本机的规则(filter表,是否允许数据包进入)
OUTPUT链:处理本机发出的数据包的规则,或者是数据包离开本机的规则(filter表,,一般不做设置)
FORWARD链:处理数据包转发到其他主机的规则,或者是否允许本机进行数据包转发
POSTROUTING:处理数据包离开本机之后的规则(NAT表)
表里面有链,链里面有规则
6.3优先级
7、iptables的设置
7.1管理选项
在表的链中插入、增加、删除、查看规则
-t:指定表名
-A:在链中添加一条规则,在链尾添加
-I:指定位置插入一条规则
-P:指定链的默认规则,一般都是设置成拒绝(默认是允许)
-D:删除规则
-R:修改规则(慎用)
-vnL:v显示详细信息,n以数字形式展示内容,L查看
--line-numbers:显示规则的编号,和vnL一起使用
-F:清空链中的所有规则(慎用)
-X:清除自定义链中的规则
7.2匹配的条件
根据数据包的ip地址、端口、协议
-p:指定协议类型
-s:指定匹配的源ip地址
-d:指定匹配的目的ip地址
-i:指定数据包进入本机的网络设备(ens33)
-o:指定数据包离开本机的网络设备
--sport:指定源端口
--dport:指定目的端口
7.3控制类型
允许、拒绝、丢弃
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,没有任何回应信息
REJECT:拒绝数据包通过,数据包也会被丢弃。但是会有一个响应的信息
SNAT:修改数据包的源地址
DNAT:修改数据包的目的地址
7.4注意事项
(1)不指定表名,默认的就是filter表
(2)不指定链名,默认的就是所有链(禁止行为)
(3)除非设置了链的默认策略,否则必须指定匹配条件(一般都是匹配条件)
(4)选项、链名和控制类型都是大写,其余的是小写
8、iptables的命令格式
iptables[-t 表名] 管理选项 链名(大写) 匹配条件 [-j控制类型]
所有的控制类型前面都是-j
匹配原则:每个链中的规则都是从上到下的顺序匹配,匹配到之后就不再向下匹配
如果链中没有规则,则执行链的默认策略(ACCEPT)进行处理
查看规则:
iptables -L
查看指定表:
iptables -t 表名 -L
数字化形式查看规则:
iptables -vnL
查看行号:
iptables -vnL --line-number(s)
或
iptables --line-number(s) -vnL
添加规则:
#拒绝所有其他主机ping本机
iptables -A INPUT -p icmp -j REJECT
插入规则:
#在INPUT的第一条插入ACCEPT
iptables -I INPUT 1 -p icmp -j ACCEPT
指定一个ip地址:
#禁止20ping主机
iptables -A INPUT -s 192.168.230.20 -p icmp -j REJECT
指定多个ip地址:
iptables -A INPUT -s 192.168.230.20,192.168.230.30 -p icmp -j DROP
指定端口:
#拒绝22端口
iptables -A INPUT -p tcp --dport 22 -j REJECT
拒绝ip和端口访问:
#拒绝20访问22端口
iptables -A INPUT -s 192.168.230.20 -p tcp --dport 22 -j REJECT
#20无法访问
[root@test2 ~]# ssh root@192.168.230.10
ssh: connect to host 192.168.230.10 port 22: Connection refused
#10可以访问
[root@test1 ~]# ssh root@192.168.230.10
root@192.168.230.10's password:
Last login: Wed Jun 26 16:40:33 2024 from test1
拒绝20访问nginx:
iptables -A INPUT -s 192.168.230.20 -p tcp --dport 80 -j REJECT
[root@test2 ~]# curl 192.168.230.10
curl: (7) Failed connect to 192.168.230.10:80; 拒绝连接
删除规则:
iptables -D INPUT 序号
修改策略:
#将INPUT序号1的策略改为REJECT,源ip改为20
-R INPUT 1 -s 192.168.230.20 -p tcp --dport 80 -j REJECT
修改链的默认策略:
#将INPUT的默认策略改为DROP
iptables -P INPUT DROP
指定网络设备:
#拒绝20通过ens33网卡访问80服务
iptables -A INPUT -i ens33 -s 192.168.230.20 -p tcp --dport 80 -j REJECT
[root@test2 ~]# curl 192.168.230.10
curl: (7) Failed connect to 192.168.230.10:80; 拒绝连接
拒绝整个网段:
iptables -A INPUT -s 192.168.230.0/24 -p tcp --dport 80 -j REJECT
[root@test1 ~]# curl 192.168.230.10
curl: (7) Failed connect to 192.168.230.10:80; 拒绝连接
一次性对多个端口进行操作:
#禁止所有主机访问22和80端口(端口从小到大,只能禁止两个端口)
iptables -A INPUT -p tcp --dport 22:80 -j REJECT
[root@test2 ~]# ssh root@192.168.230.10
ssh: connect to host 192.168.230.10 port 22: Connection refused
[root@test2 ~]# curl 192.168.230.10
curl: (7) Failed connect to 192.168.230.10:80; 拒绝连接
-m 扩展模块,一次性禁止多端口,ip范围,指定mac地址:
iptables -A INPUT -p tcp -m multiport --dport 22,80,3306 -j REJECT
指定ip范围:
#拒绝20-30的ip地址访问本机的80端口
iptables -A INPUT -p tcp -m iprange --src-range 192.168.230.20-192.168.230.30 --dport 80 -j REJECT
[root@test2 ~]# curl 192.168.230.10
curl: (7) Failed connect to 192.168.230.10:80; 拒绝连接
一次性指定多个端口:
-m multiport --sport 源端口池
-m multiport --dport 目的端口池
-m iprange --src-range 源地址池
-m iprange --dst-range 目的地址池
9、备份和还原
格式:
iptables-save > /opt/iptables.bak
一键导入,设置为当前防火墙设置:
iptables-restore </opt/iptables.bak
修改iptables的默认设置:
cat /etc/sysconfig/iptables
直接把配置导入配置文件:
cat /opt/iptables.bak >/etc/sysconfig/iptables
#立即生效了,实验环境下,了解就可以了。不要尝试
systemctl restart iptables
#重启之后生效的就是配置文件中的内容,操作需谨慎
10、自定义链
添加自定义链:
iptables -N 链名
自定义链改名:
iptables -E 原链名 自定义链名
在自定义链中添加规则:
iptables -I aaa -p tcp -j REJECT
删除自定义链:
#先删除iptables INPUT链中的对应关系,然后删除自定义链中的规则
iptables -D INPUT 1
iptables -D ky27 1
然后再用iptables -X ky27 删除这个链
11、snat和dnat
11.1snat
源地址转换
内网——外网 内网ip转换成可以访问的外网ip
内网的多个主机可以使用一个有效的公网ip地址访问外部网络
11.2dnat
目的地址转换
外部用户可以通过一个公网地址访问服务内部的私网服务。私网的ip和公网的ip做一个映射
12、实验
关闭防火墙
test1、3安装nginx,重启
test2安装iptables,添加一个新网卡
配置test2网卡ens33ip地址
把ens33复制给ens36,并且配置地址
cp ifcfg-ens33 ifcfg-ens36
配置test3的网关和ip地址
配置test1的网关
test2 进入linux内核参数的配置文件
vim /etc/sysctl.conf
打开路由器数据包的转发功能
使内核参数的配置立刻生效
[root@test2 opt]# sysctl -p
net.ipv4.ip_forward = 1#表明已生效
源地址转换
iptables -t nat -A POSTROUTING -s 192.168.230.0/24 -o ens36 -j SNAT --to 10.0.0.10
-t nat:指定表为nat表
-A POSTROUTING:添加链
-s:指定源ip
-o:指定输出网络设备
-j:控制类型
--to:指定整个网段192.168.230.0/24,从ens36出去时,做源地址转换,转换成10.0.0.10
重启test1、2、3的网卡
systemctl restart network
进入test1、3的虚拟机
打开test3的终端,打开nginx的access日志
tail -f /var/log/nginx/access.log
在test1访问test3的地址12.0.0.100,访问成功
此时test3的access日志ip地址变为12.0.0.100,实现了源地址转换
目的地址转换DNAT
iptables -t nat -A PREROUTING -d 11.0.0.11 -i ens36 -p tcp --dport 80 -j DNAT --to 192.168.230.10
-d 11.0.0.11:指定作为目的地址转换的ip地址
-i:从指定的设备进入本机
-dport:指定端口
-j DNAT:使用目的地址转换
--to 192.168.230.10:外网想要访问内网的192.168.230.10这个web服务,只需要访问11.0.0.11就可以访问内网的web服务
test3访问11.0.0.11成功
13、在linux当中如何抓包
tcpdump是linux自带的抓包工具(最小化安装是不带的,需要额外安装)
静态抓包:
tcpdump tcp -i ens33 -t -s0 -c 10 and dst port 80 and src net 192.168.230.0/24 -w /opt/target.cap
tcp:指定抓包的协议udp icmp第一个参数,可以不指定协议
-i:只抓经过指定设备的包
-t:不显示时间戳
-s0:抓完整的数据包
-c 10:抓10个包
dst port:指定抓包的目的端口
src net 192.168.230.0/24:指定抓包的IP地址
net:网段
host:主机(ip地址)
src host 192.168.230.10
-w:保存指定路径
动态抓包:
tcpdump -i ens33 -s0 -w ./ens33.cap
如果要用wireshark对数据包进行分析,tcpdump在抓包时,要使用-s0,抓取完整格式,否则wireshark无法分析
14、firewalld
14.1定义
firewalld是centos7自带的,也是默认的,7以前默认是iptables
和iptables一样,也是包过滤防火墙
ip 端口 协议
14.2firewalld按照区域来划分
public:公共区域,默认配置了ssh以及DHCPv6预定服务是放通的,其他的全部都是拒绝。是默认区域
trusted:信任区域,允许所有的数据包放通
block:限制区域,拒绝所有
drop:丢弃区域,丢弃所有数据包
dmz:非军事区域,默认只允许ssh通过
home:家庭区域,默认只允许ssh通过
internal:内部区域,和home一模一样
external:外部区域,默认允许ssh通过,其他的全部拒绝
work:工作区域,默认放通ssh
14.3firewall-cmd 命令行工具
14.3.1区域管理
显示当前系统的默认区域:
firewall-cmd --get-default-zone
显示默认区域的所有规则:
firewall-cmd --list-all
显示当前正在使用的区域及其对应的网卡接口:
firewall-cmd --get-active-zones
设置默认区域:
firewall-cmd --set-default-zone=block
firewall-cmd --get-default-zone #查看当前的默认区域。
14.3.2服务管理
查看默认区域内允许访问的所有服务:
firewall-cmd --list-service
#dhcpv6 -client 获取ipv6的地址
该区域默认使用的网卡设备
添加httpd服务到public 区域:
firewall-cmd --add-service=http --zone=public
查看public区域已配置规则:
firewall-cmd --list-all --zone=public
删除public区域的httpd 服务:
firewall-cmd --remove-service=http --zone=public
添加多个服务:
firewall-cmd --add-service=http --add-service=ftp --zone=public #方法一
firewall-cmd --add-service={ftp,http} #方法二
同时添加httpd、ftp服务到默认区域,设置成永久生效:
firewall-cmd --add-service=http --add-service=ftp --permanent
firewall-cmd --add-service={ftp,http} --zone=public --permanent #两种方式
firewall-cmd --reload
firewall-cmd --list-all添加使用 --permanent选项表示设置成永久生效,需要重新启动firewalld服务或执行firewall-cmd --reload命令
重新加载防火墙规则时才会生效。若不带有此选项,表示用于设置运行时规则,
但是这些规则在系统或firewalld服务重启、停止时配置将失效。
14.3.1端口管理
允许TCP的443端口到internal区域:
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal
从internal 区域将TCP的443端口移除:
firewall-cmd --zone=internal --remove-port=443/tcp
允许UDP的2048~2050端口到默认区域:
[root@localhost ~]# firewall-cmd --add-port={21,80,23,24}/tcp
success
[root@localhost ~]# firewall-cmd --add-port=30-35/tcp
success
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all
添加源地址进行操作:
[root@localhost ~]# firewall-cmd --add-source=192.168.233.20 --zone=block
[root@localhost ~]# firewall-cmd --get-active-zone
[root@localhost ~]# firewall-cmd --remove-source=192.168.233.20 --zone=block
[root@localhost ~]# firewall-cmd --get-active-zone