目录
前言
一、iptables防火墙基础
1.1?netfilter和iptables关系
1.2?iptables的四表五链
1.2.1?四表
1.2.2?五链?
1.3?数据包控制的匹配流程
1.3.1?入站
1.3.2?转发
1.3.3?出站?????
二、iptables的配置及相关规则
?2.1?命令格式
2.2?常用控制类型
2.3?常用的管理选项
2.4?匹配条件
2.5?iptables语法总结
?2.6?案例
三、规则的匹配
?3.1?通用匹配
?3.2?隐含匹配
3.2.1 端口匹配
?3.2.2 TCP标记匹配
?3.2.3 ICMP类型匹配
3.3?显示匹配
总结
前言
保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。
iptables | centos 5/6? 系统默认防火墙 | firewalld | centos 7/8? 系统默认防火墙 | iptables用的较多,在7和8上也是有的,现在流行的k8s就是基于iptables |
一、iptables防火墙基础
- 硬件防火墙:性能好,用图形化?管理,一般公司用硬件(华为E9000)
- 软件防火墙:做辅助,做在服务器上,用命令管理
Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成
主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口、协议等信息的处理上
1.1?netfilter和iptables关系
Linux中称为包过滤防火墙,iptables和firewalld都有两个组件netfilter和iptables,这两种称呼都可以表示Linux防火墙。
注意:与netfilter相提并论的iptables是iptables防火墙的组件,可以认为是iptables防火墙的分支,但是名字一样
- 位于Linux内核中的包过滤功能体系
- 称为Linux防火墙的“内核态”(又称内核空间)
- 位于/sbin/iptables,用来管理防火墙规则的工具
- 称为Linux防火墙的“用户态”(又称用户空间)
netfilter/iptables后期简称为iptables, iptables是基于内核的防火墙,其中内置了raw、mangle、nat和filter四个规则表。
表中所有规则配置后,立即生效,不需要重启服务。
1.2?iptables的四表五链
规则表的作用 | 容纳各种规则链 | 规则链的作用 | 容纳各种防火墙规则 | 总结 | 表中有链,链中有规则 |
1.2.1?四表
表 | 含义 | 包含的规则链 | raw表 | 确定是否对该数据包进行状态跟踪 | OUTPUT、PREROUTING | mangle表 | 修改数据包内容,用来做流量整形的,给数据包设置标记 | INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUING | nat表 | 负责网络地址转换,用来修改数据包中的源、目标IP地址或端口 | OUTPUT、PREROUTING、POSTROUING | filter表 | 负责过滤数据包,确定是否放行该数据包(过滤) | INPUT、FORWARD、OUTPUT |
在iptables的四个规则表中,?mangle表和raw表的应用相对较少
filter表是防火墙的默认表
1.2.2?五链?
链 | 作用 | INPUT链 | 处理入站数据包,匹配目标IP为本机的数据包 | OUTPUT链 | 处理出站数据包,一般不在此链上做配置 | FORWARD链 | 处理转发数据包,匹配流经本机的数据包 | PREROUTING链 | 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上 | POSTROUING链 | 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网 |
规则链之间的匹配顺序:
主机型防火墙:
入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING --> INPUT -->本机的应用程序
出站数据(从防火墙本机向外部地址发送的数据包) :本机的应用程序--> OUTPUT --> POSTROUTING
网络型防火墙:
转发数据(需要经过防火墙转发的数据包) : PREROUTING --> FORWARD --> POSTROUTING
规则链内的匹配顺序:
自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)
若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
1.3?数据包控制的匹配流程
标红的代表该链的规则通常在这个表上配置?
1.3.1?入站
入站数据包从A网络发到B网络,首先发到防火墙,先后顺序经过有PREROUTING链的三个表(raw、mangle、nat),如果都是放通状态的会经过路由选择,然后根据目的地址一层一层往上送,经过有INPUT的两个表(mangle、filter),一直送到应用程序
1.3.2?转发
目的地不是本机,数据包先从A网络过滤,经过PREROUTING链,看是否是自己的目的地址,如果是外网到内网需要用nat转换成内网IP,找到内网用户,经过FORWARD链进行过滤,允许放通的到达POSTROUING链,再把内网地址转换成公网,这样数据包才能回去;如果是内网往外网发顺序就是反过来
1.3.3?出站?????
从本机的应用程序发出来,?经过路由选择,让路由知道从哪里发,先后顺序经过有OUTPUT链的四个表(raw、mangle、nat、filter),都放通后到达POSTROUING链的两个表(mangle、nat),如果没有什么转换地址,就出站
二、iptables的配置及相关规则
#centos7中是可以敲iptables的命令的,但是无法进行管理,因为默认是用firewalld进行管理的
[root@localhost ~]# which iptables
/usr/sbin/iptables
[root@localhost ~]#
#若想使用iptables防火墙,必须先关闭 firewalld防火墙,再安装iptables
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# yum install -y iptables iptables-services
已加载插件:fastestmirror, langpacks
local | 3.6 kB 00:00
Loading mirror speeds from cached hostfile
软件包 iptables-1.4.21-18.0.1.el7.centos.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 iptables-services.x86_64.0.1.4.21-18.0.1.el7.centos 将被 安装
--> 解决依赖关系完成
依赖关系解决
=============================================================================
Package 架构 版本 源 大小
=============================================================================
正在安装:
iptables-services x86_64 1.4.21-18.0.1.el7.centos local 51 k
事务概要
=============================================================================
安装 1 软件包
总下载量:51 k
安装大小:25 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : iptables-services-1.4.21-18.0.1.el7.centos.x86_64 1/1
验证中 : iptables-services-1.4.21-18.0.1.el7.centos.x86_64 1/1
已安装:
iptables-services.x86_64 0:1.4.21-18.0.1.el7.centos
完毕!
#可以看到iptables默认是已安装的
[root@localhost ~]# systemctl start iptables.service
#安装完后启动服务
在centos6中可以通过图形化界面(如下图)来管理,但是在centos7中没有反应,只能通过命令行来管理?
?2.1?命令格式
iptables [-t?表名]?管理选项? [链名]? [匹配条件]? [-j? ?控制类型]
注意事项:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 控制类型使用大写字母,其余均为小写
2.2?常用控制类型
ACCEPT | 允许数据包通过 | DROP | 直接丢弃数据包,不给出任何回应信息 | REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 | SNAT | 修改数据包的源地址 | DNAT | 修改数据包的目的地址 | MASQUERADE | 伪装成一个非固定公网IP地址 | LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包 |
2.3?常用的管理选项
-A | 在指定链的末尾追加(--append)一条新的规则 | -I | 在指定链的开头插入(--insert)一条新的规则,未指定序号时默认作为第一条规则 | -R | 修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容 | -P | 设置指定链的默认策略(--policy) | -D | 删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容 | -F | 清空(--flush)指定链中的所有规则,若未指定链名,则清空表中的所有链 | -L | 列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链 | -n | 使用数字形式(--numeric)显示输出结果,如显示IP地址而不是主机名 | -v | 显示详细信息,包括每条规则的匹配包数量和匹配字节数 | --line-numbers | 查看规则时,显示规则的序号 |
2.4?匹配条件
匹配条件 | 说明 |
---|
-p | 指定要匹配的数据包的协议类型 | -s | 指定要匹配的数据包的源IP地址 | -d | 指定要匹配的数据包的目的IP地址 | -i | 指定数据包进入本机的网络接口 | -o | 指定数据包离开本机做使用的网络接口 | –sport | 指定源端口号 | –dport | 指定目的端口号 |
2.5?iptables语法总结
?2.6?案例
-nL可以合起来写,但是n必须放在前面,放在后面会报错,如上图所示的报错?
?
0.0.0.0/0? 代表所有主机都生效?
?
?案例5:添加
?案例6:插入
不指定默认是在第一行插入添加?
案例7:删除
?如果有多条一样的规则,是先删序号小的那条
案例8:设置默认规则
?
三、规则的匹配
?3.1?通用匹配
可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件
协议匹配 | -p??协议名 | 地址匹配 | -s? 源地址、-d目的地址 #可以是IP、网段、域名、空(任何地址) | 接口匹配 | -i 入站网卡、-o? 出站网卡 |
iptables -A FORWARD ! -p icmp -j ACCEPT
#没有-t指定表,就是指默认表filter表
#!代表条件取反,不是ICMP的都放通
iptables -A INPUT -s 192.168.109.132 -j DROP
#拒绝从哪个主机发数据包过来
iptables -I INPUT -i ens33 -s 192.168.109.0/24 -j DROP
#在行首插入 禁止该网段从ens33网卡进来
?3.2?隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
3.2.1 端口匹配
--sport?源端口? ? --dport? 目的端口
可以是个别端口、端口范围 | --sport 1000 | 匹配源端口是1000的数据包 | --sport 1000:3000 | 匹配源端口是1000-3000的数据包 | --sport? :3000 | 匹配源端口是3000及以下的数据包 | --sport? 1000: | 匹配源端口是1000及以上的数据包 | 注意:--sport和--dport必须配合-p? <协议类型>? 使用 |
?3.2.2 TCP标记匹配
--tcp-flags? TCP标记
#丢弃SYN请求包,放行其他包
# SYN,RST,ACK SYN 前面三个包逗号,然后空格跟一个,表明前面的三个里面除了这空格后面的SYN,其他都放行
[root@localhost ~]# iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x16/0x02
DROP all -- 192.168.109.132 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:20:21
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
?3.2.3 ICMP类型匹配
--icmp-type? ICMP类型
可以是字符串、数字代码
Echo-Request(代码为8) | 请求 | Echo-Reply (代码为0) | 回显 | Destination-Unreachable(代码为3) | 目标不可达 | 其他可用的icmp协议类型,可以执行iptables -p icmp -h? 查看帮助信息 |
Request--(ping)
Reply --(pong)
有点类似乒乓,一个请求一个回显
iptables -A INPUT -p icmp -j DROP
#增加了此条规则不仅别人ping不通自己,自己也ping不通别人,这是因为回复回不来,数据有ping和pong一来一回,ping出去了,pong不回来,被防火墙拦截了
#如果我们想要双标,别人ping不通自己,但是自己也能ing通别人,怎么操作呢
3.3?显示匹配
要求以"-m扩展模块"的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
-m multiport --sport? ?源端口列表
-m multiport --dport? ?目的端口列表
#m扩展模块可以一次指定多个端口,不必一条条写了
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,22,21,20,53
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-m iprange --src-range? 源IP范围
-m iprange --dst-range? 目的IP范围
#禁止转发源地址位于192.168.109.100-192.168.109.200的udp数据包
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 192.168.109.100-192.168.109.200 -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,22,21,20,53
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP udp -- 0.0.0.0/0 0.0.0.0/0 source IP range 192.168.109.100-192.168.109.200
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-m mac --mac-source? ?源MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:Xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
-m state --state连接状态
常见的连接状态:
NEW | 主机连接目标主机,在目标主机上看到的第一个想要连接的包 | ESTABLISHED | 主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 | RELATED | 主机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED配合使用 | INVALID | 无效的封包,例如数据破损的封包状态 |
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#第一个包我只看22端口的包
#-p tcp是隐含匹配,可以省略-m tcp
iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
#允许放通tcp的这些端口号
#-m multiport加载多个端口模块
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT
#表示与上述连接相关的数据我都放通
iptables -P INPUT DROP
#默认关闭,将以上的设置设为白名单
总结
Linux防火墙系统
组成 内核态 netilter(保存包过滤处理的规则集);用户态 iptables(防火墙规则管理工具)
四表
raw? ? ? ? ?对数据包进行状态跟踪
mangle? ?修改数据包内容,给数据包设置标记
nat? ? ? ? ? 地址转换,转换源/目的IP或者端口
fileter? ? ? ?过滤数据包 放行 丢弃
五链
INPUT? ? ? ? ? ? ? ? 入站
OUTPUT? ? ? ? ? ? 出站
FORWARD? ? ? ? ?转发
PREROUTING? ? 路由前修改目的地址
POSTROUTING? 路由后修改源IP
链中的规则集:从上往下一次匹配,匹配到规则即停止,若都没有匹配到则按默认策略处理
iptables? -t? 表? -A?在末尾添加? -j? 控制类型
? ? ? ? ? ? ? ? ? ? ? ? ?-I? 在前面插入
? ? ? ? ? ? ? ? ? ? ? ? ?-D?删除
? ? ? ? ? ? ? ? ? ? ? ? ? -F?清空
? ? ? ? ? ? ? ? ? ? ? ? ? -R?改
? ? ? ? ? ? ? ? ? ? ? ? ? -nL? 查
? ? ? ? ? ? ? ? ? ? ? ? ? ?-P?设置默认规则
匹配条件
-p tcp|udp|icmp
-s 源IP
-d 目的IP
-i 入站网卡
-o 出站网卡
数据包通信要素?
四要素 | 五要素 | 源IP? ? ? ? 目的IP | +协议? UDP/TCP | 源端口? ? ? ? 目的端口 |
|