在前面我们已经学习过了系统的防火墙,我们讲过redhat7以上的防火墙软件有两个,分别是firewalld和iptables,上一片我们讲的是firewalld,具体可见firewalld,那么今天我们来了解一下另一个防火墙软件iptables
iptables?
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。
iptables过滤规则的四表五链
在iptables中对于内外信息的规律时有一定的规则的,对于不同的需求有不同的规则结构,而我们常将这种规则结构称为“四表五链”
raw表
raw | 有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。 |
---|
filter表
filter | 主要和自身有关,主要负责防火墙功能 过滤本机流入流出的数据包是默认使用的表 |
---|---|
input | 负责过滤所有目标地址是本机地址的数据包,就是过滤进入主机的数据包 |
forward | 负责转发流经主机但不进入本机的数据包,和NAT关系很大 |
output | 负责处理源地址的数据包,就是对本机发出的数据包 |
NAT表
NAT | 负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务 |
---|---|
snat | 源地址转换 |
dnat | 目标地址转换 |
pnat | 目标端口转换 |
mangle表
mangle | 将报文拆开来并修改报文标志位,最后封装起来 |
---|
五链:
五链 | 多条链整合起来就叫做表 |
---|---|
PREROUTING | 数据包进入路由之前 |
INPUT | 目标地址为本机 |
FORWARD | 实现转发 |
OUTPUT | 源地址为本机,向外发送 |
POSTROUTING | 数据包进入路由之后 |
应用场景:
其中INPUT, OUTPUT链更多的应用在“主机访火墙”中,即主要针对服务器本机进出数据的安全控制:而FORWARD, PREROUTING, POSTROUTING链更多地应用在“网络防火墙”中,特别是防火墙服务器作为网关使用时的情况。
iptables传输数据包的过程:
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向上移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
iptables的配置
在配置实验之前我们要确定我们的实验环境,同firewalld一样,我们需要两台虚拟机,加上真机共三台主机
真机ip:172.25.254.77
server:eth0:172.25.254.97 eth1:1.1.1.97
client:eth0:1.1.1.117 网关:1.1.1.97
为了不让firewalld影响iptables的过滤规则,我们关闭firewalld
如上图所是我们在server上关闭了firewalld,开启了iptables并且设置为开机自启动,注:第三条命令unmask是因为我们在上一个实验中将iptables锁住了,所以我们得给他解锁,否则依旧用不了
1.iptables的防火墙策略文件
iptables的防火墙策略文件在/etc/sysconfig/iptables中
注意:firewalld也是有配置文件的,他的配置文件在/usr/lib/firewalld中
firewalld在配置文件中修改就等同用firewall-cmd --permanent一样
2.iptables命令的常用参数
iptable
-t ##指定表名称
-n ##不作解析
-L ##列出指定表中的策略
-A ##增加策略
-p ##网络协议
--dport ##端口
-s ##数据来源
-j ##动作
ACCEPT ##允许
REJECT ##拒绝
DROP ##丢弃
-N ##增加链
-E ##修改链名称
-X ##删除链
-D ##删除指定策略
-I ##插入
-R ##修改策略
-P ##修改默认策略
3.查看某个表的策略及清除表策略
iptables -t filter -nL #查看filter表中的策略
iptables -F #刷掉filter表中的所有策略,当没有用-t指定表名称时默认时filter
service iptables save #保存当前策略
关于保存的话我们先来看一下没有保存,重启iptables后是怎样的
我们发现重启iptables后又恢复默认了,那么我们刷新后则需要保存,就不会恢复默认了
4.更改表的默认策略
iptables -P INPUT DROP ##更改为DROP(丢弃),即不允许通过
iptables -P INPUT ACCEPT ##更改为ACCEPT(接受),即允许通过
我们通过ssh来实验,在INPUT状态下:
我们发现可以真机可以连接上server,那么我们更改为DROP
显而易见,我们修改过默认策略后ssh就连接不上了
最后我们恢复默认状态
5.给表中的链添加策略
例如:我们要添加策略使其他主机无法使用22端口(ssh)访问,那么我们需要添加iptables的就是filter表的input链了
iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT
在这里我们禁止的相当于是同一个网段的主机访问22端口,那么我们其实也是可以通过-s指定一个ip
iptables -R INPUT 1 -p tcp --dport 22 -s 172.25.254.77 -j REJECT ##修改INPUT的第一条策略为禁止172.25.254.77主机访问22端口
6.手动修改表的链中的策略顺序
我们的iptables的策略是按照上往下依次读取的,有些时候为了一定的功能我们得修改它的策略位置
例如:
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT ##插入允许所有主机访问22端口策略到第一条
我们发现添加了策略1后,我们的第二条策略就失效了
7.删除指定链中的策略
iptables -D INPUT 2 ##删除INPUT中的第二条策略
8.新建链,修改链名,删除链
iptables -N redhat ##增加链redhat
iptables -E redhat ljz ##改变链名称
iptables -X ljz ##删除链
9.源地址转换(火墙伪装)
实验前查看是否开启路由功能:
注:在这里我们是开启的,如果没有开启可以用命令echo “net.ipv4.ip_forward = 1” >>/etc/sysctl.conf追加修改即可,然后用命令sysctl -p刷新
实验命令:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.97
在路由后对eth0,ip为172.25.254.97做源地址转换
测试:用client去连接真机
分析:我们的client是通过网关1.1.1.97即server的eth1网咖进入server,然后经过路由转换到eth0,通过eth0将数据包发送到真机即172.25.254.77上,所以我们看到的77主机上连接者是server
10.目的地址地址转换(端口转发)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 1.1.1.117
测试:
用真机去访问server
分析:
我们的真机的ssh数据包首先从eth0进入server,再没有进行路由前将目的地址更改为1.1.1.117即client,那么就通过server的eth1网咖将数据包发送到client上
11.iptables状态设置
在我们的iptales中有一个state模块,他有四个状态
ESTABLISHED,NEW,RELATED,INVALID
NEW | 新的数据包请求 |
---|---|
RELATED | 已经完成的数据包请求 |
ESTABLISHED | 正在进行的数据包请求 |
INVALID | 状态不明的数据包,一般视为恶意的,丢弃 |
iptables -A INPUT -i lo -j ACCEPT ##允许回环端口,即本机登陆所有服务
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ##登陆过的和正在进行的可以允许
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT ##允许新的22端口
iptables -A INPUT -j REJECT ##禁止其他所有端口
在这里我们的client一直没有等路过server,所以他是一个新的登陆请求,端口为22,允许
对于第二条策略我们可以用smb或者nfs去实验,这里就不做具体实验了