防火墙
一. iptables简介
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
和netfilter的适配性好
#查看有没有安装
iptables --version
二.iptables防火墙
1.iptables的表、链结构
1.1规则链
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:处理数据包的不同时机
5种规则链
- INPUT:处理进入本机的数据包
- OUTPUT:处理从本机出去的数据包
- FORWARD:处理转发数据包
- POSTROUTING链:在进行路由选择后处理数据包
- PREROUTING链:在进行路由选择前处理数据包
1.2规则表
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
4个规则表
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)
1.3匹配顺序
规则表之间的顺序
- raw—>mangle—>nat—>filter
规则链之间的顺序
- 入站:PREROUTING—>INPUT
- 出站:OUTPUT—>POSTROUTING
- 转发:PREROUTING—>EORWARD—>POSTROUTING
规则链内的匹配顺序
- 按顺序依次检查,匹配即停止
- 若找不到相匹配的规则,则按该链的默认策略处理
内核中数据包的传输过程
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要 转送出去
- 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
- 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
三.iptables配置
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
#前期准备工作
systemctl stop firewalld.service
systemctl disable --now firewalld.service
##开机不自启 并且立即关闭
systemctl enable --now firewalld.service
##开机自启 并且 立即开启
#安装iptables
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service
1.基本语法
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
iptables -t filter -A INPUT -s 192.168.210.1 -j DROP
命令 指定表 指定链 -s -j DROP已读不回
2.基本操作
2.1控制类型
选项 | 用法 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出任何回 应信息 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
#拒绝来自 192.168.210.102的源地址 直接丢弃
iptables -t filter -A INPUT -s 192.168.210.102 -j DROP
#拒绝来自 192.168.210.101 的源地址,不回复,210段都无法访问了
iptables -A INPUT -s 192.168.210.0/24 -j REJECT
2.2管理选项
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 |
-I(大写的i) | 在指定链中插入一条新的,未指定序号默认作为第一条 |
-P | 指定默认规则 |
-D | 删除 |
-R | 修改、替换某一条规则 |
-L | 查看 |
-n | 所有字段以数字形式显示 |
-v | 查看时显示更详细信息,常跟-L一起使用 |
–line-number | 规则带编号 |
-F | 清除链中所有规则 |
-N | 新加自定义链 |
-X | 清空自定义链的规则,不影响其他链 |
-Z | 清空链的计数器(匹配到的数据包的大小和总和) |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
在iptables的默认filter表中的INPUT链中添加一条规则,拒绝来自192.168.210.102中的全部流量
iptables -A INPUT -s 192.168.210.102 -j REJECT
-I 需要指明序号 - INPUT 1 在 INPUT 链的规则第一条前添加我就变成第一条了
iptables -I INPUT 2 -s 192.168.210.0/24 -j ACCEPT
2.3指定匹配范围选项
指定匹配条件的选项 | 功能 |
---|---|
-p | 指定要匹配的协议类型,例如TCP、UDP、ICMP等 |
-s | 指定源IP地址或地址范围 |
-d | 指定目标IP地址或地址范围 |
-i <网络接口> | 指定输入网络接口 |
-o<网络接口> | 指定输出网络接口 |
-m | 指定扩展模块,用于进一步定义匹配条件 |
–icmp-type | 指定ICMP类型 |
–sport | 指定源端口号或端口范围 |
–dport | 指定目标端口号或端口范围 |
3.查看规则表
#无论查看、添加、删除,只有filter表可以省略
#查看
iptables [-t filter] -vnL #查看详细规则列表,不写规则表 默认filter表
-v 显示详细
-n 数字形式显示
-L 查看规则列表
4.添加规则
#添加规则
iptables [-t filter] -A INPUT -s 192.168.210.102 -j DROP/REJECT/ACCEPT
#drop 和 reject的区别? drop丢弃后不会返回任何信息,相当于已读不回;reject会有提示信息
#一般只对INPUT和PREROUTING规则链进行处理,不处理OUTPUT POSTROUTING FORWARD
# -s 为指定源地址
# -j 为跳转 后面DROP/REJEC/ACCEPT为处理动作
5.删除、清空、替换规则
5.1查看规则编号
iptables -vnL --line-numbers
#查看规则编号
5.2删除规则
iptables -D INPUT 2
#删除第二条规则
5.3清空规则
iptables -F
#不包括默认
iptables -P INPUT DROP
#修改INPUT链的默默人规则为拒绝 清空规则后又无法登录了
#手动白名单 最后加上拒绝所有
iptables -A INPUT -s 192.168.210.2 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -j REJECT
5.4替换规则
iptables -A INPUT -s 192.168.210.102 -j DROP
#拒绝这个源地址访问
iptables -R INPUT 1 -s 192.168.210.102 -j ACCEPT
#修改成允许访问
6默认策略
6.1修改默认规则
白名单:在名单才可以,默认拒绝所有
黑名单:在名单里面的才不可以,默认允许所有
规则列表默认是黑名单ACCEPT允许,改成白名单
#修改默认规则为 白名单后自己也无法访问
iptables -P INPUT DROP
访问127.0.0.1 也不行
ping 127.0.0.1
ping 192.168.210.101
#快照后在虚拟机操作
iptables -P INPUT ACCEPT
iptables -vnL
iptables -A INPUT -s 0.0.0.0/0 -j REJECT
iptables -vnL
#看似黑名单,实则白名单,在最后一条加了默认拒绝所有,实现了白名单功能,还能使用iptables -F,
iptables -I INPUT 1 -s 192.168.210.101 -j ACCEPT
#把自己加进去,加在第一行前,允许自己访问,现在清空所有并不会造成我自己无法登录
#在xshell里操作
iptables -A INPUT -s 192.168.210.101 -j REJECT
#把自己加进去
iptables -A INPUT -s 0.0.0.0/0 -j DROP
#再默认拒绝所有
6.2 添加回环网卡
iptables -vnL
#查看规则列表
iptables -I INPUT 2 -i lo -j ACCEPT
#添加回环网卡,添加在第2条规则前
ping 127.0.0.1
#其他本机上的网址也都能ping通
7通用匹配
基本匹配条件:无需加载模块,由iptables/netfilter自行提供
通用匹配选项
选项 | 用法 |
---|---|
-p | 指定要匹配的协议类型,例如TCP、UDP、ICMP等,参看: /etc/protocols |
-s | 指定源IP地址或地址范围 |
-d | 指定目标IP地址或地址范围 |
-i | 指定输入网络接口,入站网卡,只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链 |
-o | 指定输出网络接口,出站网卡 ,只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链 |
除了icmp协议,其他都允许
iptables -A FORWARD ! -p icmp -j ACCEPT
感叹号!表示取反
只让特定的机器不可以ping我
iptables -I INPUT 2 -s 192.168.210.102 -p icmp -j REJECT
8.扩展匹配
扩展模块的查看帮助
man iptables-extensions
8.1隐式扩展
8.1.1 端口匹配
tcp协议的扩展选项
选项 | 用法 |
---|---|
–sport | 源端口 |
–dport | 目的端口 |
–icmp-type | 指定ICMP类型 |
--sport和--dport 必须配合-p <协议类型>使用
只能用于匹配连续的端口
可以匹配单个端口,也可以匹配端口范围,以源端口匹配为例:
格式 | 含义 |
---|---|
–sport 1000 | 匹配源端口是1000的数据包 |
–sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
–sport 1000: | 匹配源端口是1000及以上的数据包 |
–sport :3000 | 匹配源端口是3000及以下的数据包 |
先安装一个httpd,然后开启httpd
控制102服务器访问101服务器的tcp的80端口
iptables -A INPUT -p tcp --dport 80 -s 192.168.210.102 -j REJECT
然后用102服务器curl 192.168.210.101
如果端口连续 端口:端口
iptables -A INPUT -p tcp --dport 80:1000 -s 192.168.210.102 --j REJECT
8.1.2 TCP标志匹配
--tcp-flags TCP标志
TCP标志 | 功能 |
---|---|
SYN(同步) | 用于建立连接。 |
ACK(确认) | 用于确认收到的数据。 |
FIN(结束) | 用于关闭连接。 |
RST(复位) | 用于重置连接。 |
URG(紧急) | 用于指示数据中有紧急数据部分。 |
PSH(推送) | 用于强制接收方立即处理数据。 |
#iptables允许通过来自ens33接口的,具有FIN、RST、ACK和SYN标志的TCP包
#只有SYN标志的TCP包,拒绝建立连接
iptables -I INPUT -i ens33 -p tcp \--tcp-flags FIN,RST,ACK SYN -j ACCEPT
8.1.3 ICMP扩展
类型匹配:--icmp-type ICMP类型
type/code
echo-reply icmp应答
echo-request icmp请求
--icmp -type 0/3/8
#可以是字符串、数字代码
Echo-Request(代码为8)表示请求
Echo-Reply(代码为0)表示回复
Dest ination-Unreachable(代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
代码 | 含义 |
---|---|
8 | “Echo- Request” 表示请求 |
0 | “Echo- Reply” 表示回复 |
3 | "Dest ination-Unreachable"表示目标不可达 |
101能ping通102,102不能ping101,101ping102的时候需要发一个编号为8的包,然后102回复101一个编码为0的包,只需要把102发给101的8包禁掉就可以了
iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.210.102 -j DROP
#丢弃icmp的包,别人ping不通本机,本机也ping不通别人
iptables -A INPUT -p icmp -j DROP
#禁止其他主机ping本机
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#当本机ping不通其它主机时提示目标不可达,此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
8.2显示扩展
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载模块
[-m matchname [per-match-options]]
8.2.1multiport扩展(多端口)
可用于匹配非连续的端口,以离散的方式匹配,最多支持15个端口
--source-ports,--sports port[,portl,port:port]...
#指定多个源端口 号隔开
--destination-ports,--dports
port[,portl,port:port]...
# 指定多个目标端口 逗号隔开
--ports port[,portl,port:port]...
#多个源或目标端
iptables -A INPUT -s 192.168.210.102 -p tcp -m \
multiport --dports 22,80,3306 -j REJECT
#拒绝来自源IP地址为192.168.210.102的TCP流量,并且目标端口号为22、80和3306
然后在102服务器curl 192.168.210.101,发现拒绝连接
8.2.2 iprange扩展(IP范围)
指明连续的(但一般不是整个网络)ip地址范围
基本格式
-m iprange --src-range from[-to] 源IP地址范围
-m iprange --dst-range from[-to] 目标IP地址范围
iptables -A INPUT -m iprange --src-range 192.168.210.102-192.168.210.104 -j REJECT
# 拒绝来自源IP地址范围为192.168.210.102到192.168.210.104的所有流量,并且应用于INPUT链(也就是进入服务器的流量),三个地址无法访问主机
iptables -A FORWARD -p udp -m iprange --src-range 192.168.210.102-192.168.210.103 -j DROP
#禁止转发源地址位于192.168.210.102-192.168.210.103的udp数据包
8.2.3 string扩展(字符串)
string模块用于在数据包的内容中搜索指定的字符串,并根据匹配结果执行相应的操作
基本格式
-m string --string 字符串 --algo bm/kmp
#bm kmp为字符串检测算法
--from offset 开始查询的地方
--to offset 结束查询的地方
iptables -A INPUT -p tcp --dport 80 -m string --string "example" --algo bm -j DROP
#对于目标端口为80的TCP流量,在数据包的内容中搜索字符串"example"
#如果匹配成功,则使用DROP动作丢弃该数据包
8.2.4 time模块
time模块用于根据时间条件匹配数据包,可以限制特定时间段内进出防火墙的数据包。
基本格式
-m time --匹配选项 匹配条件
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
时间
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]d
--monthdays day[,day...]每个月的几号
--weekdays day[,day...]星期几,1- 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,centos 7版本以上系统默认为 UTC
注意:centos6 不支持kerneltz ,--]ocaltz指定本地时区(默认)
匹配选项 | 含义 |
---|---|
- -timestart | 指定开始时间 |
- -timestop | 指定结束时间 |
- -datestart | 指定开始日期 |
- -datestop | 指定结束日期 |
- -days | Mon-Fri |
[root@localhost~]#date
#中国标准时间
2022年08月 14日 星期日 22:26:07 CST
[root@locaThost ~]#date -u
#utc时间
62022年 08月 14日 星期日 14:26:09 UTC
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 \
--datestart 2023-08-01 --datestop 2023-08-31 --days Mon-Fri -j ACCEPT
#在2023年8月1日至2023年8月31日期间的每个工作日的08:00至17:00之间,接受(ACCEPT)输入的数据
#如果不在指定的日期和时间范围内或不是工作日,则不匹配该规则
8.2.5.connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connTimit-above N #连接的数量大于N时匹配
模拟攻击
[root@localhost3 7-2]# gcc flood_connect.c -o f1ood
#编译安装 黑客文件
[root@localhost3 7-2]# ./f1ood 192.168.210.101
#运行黑客脚本
[root@localhost 7-1]#ss -natp
[root@localhost 7-1]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
如果一个用户访问我的80端口,连接数量大于2的时候就拒绝连接
limit 限制流量
--limit-burst number #前多少个包不限制
--1imit #[/second|/minute|/hour|/day]
例子:两条都要加
[root@locahost 7-2]#iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
icmp包前5个不限制,一分钟允许通过10个包
ping 192.168.210.101
[root@localhost ~]#iptables -A INPUT -p icmp -j REJECT
8.2.6.state连接状态
状态类型:
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
格式
老用户可以继续访问,拒绝新用户
--state state
iptables -F
#清空
[root@localhost 7-1]#ipatables -A INPUT -m state --state NEW -j REJECT
[root@localhost 7-1]#ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
[root@localhost 7-2]#ping 192.168.210.101
#已在ping 的可以继续ping,停了也不可以通了,xshell也不可以再连
#新用户不可以访问,旧用户可以访问
lsmod |grep conn
#内核模块可以看到,调用state状态时可以看到
cat /proc/sys/net/netfilter/nf_conntrack_max
#记录的用户数为 65536
echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
#修改最大记录数
tail /var/log/messages
#查看日志
#我可以访问A,A不能访问我 单向通讯
iptables -F
iptables -A INPUT -s 192.168.210.102 -m state --state NEW -j REJECT 第一个包是#请求包只要禁止请求包即可
9.保存规则
iptables -F
iptables -A INPUT -s 192.168.210.102 -j REJECT
iptables -A INPUT -s 192.168.80.0/24 -j REJECT
#加2条规则
iptables -vnL
iptables-save
#把规则显示出来
iptables-save > /data/iptables.rule
#重定向保存到data下
iptables -F
iptables -vnL
#清空后规则没有了
iptables-restore < /data/iptables.rule
#恢复
iptables -vnL
vim /etc/rc.d/rc.local
#写进文件里开机自动加载
iptables-restore < /data/iptables.rule
chmod +x rc.local
#给这个文件执行权限
iptables -F
reboot
#方法2
yum install iptables-services.x86_64 -y
#备份工具
rpm -ql iptables-services
/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
#保存到这个文件中
systemctl start iptables-services
#启动服务
systemctl enable iptables-services
#开机自启
四.SNAT和DNAT
1.SNAT
SNAT原理与应用:
SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
SNAT原理:源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT转换前提条件:
1.局域网各主机已正确设置IP地址、子网掩码、默认网关地址
2.Linux网关开启IP路由转发
linxu系统本身是没有转发功能 只有路由发送数据
snat:作用是让内网机器可以上外网
内网机器地址一般是私网地址 192.168.0.0 - 192.168.255.255
172.16.0.0 172.31.255.255
10.0.0.0 10.255.255.255
这三网段是永远不会出现在公网上的,所以内网必然无法上网
snat 将私网转化成公网地址
2.DNAT
DNAT原理与应用:
DNAT应用环境:在Internet中发布位于局域网内的服务器
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映谢。
DNAT转换前提条件:
1.局域网的服务器能够访问Internet
2.网关的外网地址有正确的DNS解析记录 3. Linux网关开启IP路由转发
3.实验
实验环境
centos7-1(内网服务器) IP地址 192.168.210.101 网关指向7-2 ens33
centos7-2(网关服务器) ens33IP地址(nat):192.168.210.102 ens36IP地址(仅主机):12.0.0.1
centos7-3(外网服务器) ens33IP地址(仅主机):12.0.0.10
7-2
7-2添加网卡,仅主机模式
ip a
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens36
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36
DEVICE=ens36
ONBOOT=yes
IPADDR=12.0.0.1
NETMASK=255.255.255.0
systemctl restart network
ping 12.0.0.1
#永久打开路由转发功能:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #将此行写入配置文件
sysctl -p #读取修改后的配置
7-1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#把网关改成192.168.210.102
systemctl restart network
route -n
#查看网关
ping 12.0.0.1
ping 192.168.210.102
7-3
7-3网卡改成仅主机
#在虚拟机操作
ifconfig ens33 12.0.0.10/24
ping 12.0.0.10
ping 12.0.0.1
7-2
iptables -F -t nat
iptables -F
cd
iptables -t nat -A POSTROUTING -s 192.168.210.0/24 -o ens36 -j SNAT --to 12.0.0.1
#将源地址为192.168.210.0段的私网地址全部 转化为网关地址
7-1
ping 12.0.0.10
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
mount /dev/sr0 /mnt
vim local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
yum clean all
yum makecache
yum install -y httpd
systemctl start httpd
cd /var/www/html
vim index.html
wyx is a good girl
7-2
crul 192.168.210.101
iptables -t nat -A PREROUTING -i ens36 -s 12.0.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.210.101
7-3
curl 12.0.0.1
五.远程工具图形化
#补充知识
#字符界面 但是需要用到图形化时
yum install x11-forwarding -y #
systemctl start firewalld
export DISPLAY=192.168.2.1:0.0
#真机地址
yum install firewall-config -y
system-config-firewall