防火墙iptables
1.火墙介绍
什么是防火墙?有什么作用?
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
netfilter/iptables 关系:
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
netfilter/iptables 后期简称为:iptables;
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。所有规则配置后,立即生效,不需要重启服务。
2.火墙管理工具iptables的切换
在rhel8中默认使用的是firewalld
firewalld----->iptables 火墙转换
dnf install iptables-services -y
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl enable --now iptables
3.火墙默认策略
默认的3张表
filter
filter表:经过本机内核的数据,负责过滤数据包
包括的规则链有:input ,output, forward
nat
nat表:涉及到网络地址转换,不经过内核的数据
包括的规则链有:postrouting,prerouting,input,output
mangle
mangle表:主要应用在修改数据包内容上,用来做流量整形的,给数据包打个标识(当filter和nat表不够用时使用)
默认的规则链有:input output forward postrouting,prerouting
默认策略中的5条链
input ##输入
output ##输出
forward ##转发
postrouting ##路由之后
prerouting ##路由之前
4. iptables 的使用
1.火墙策略的保存
火墙策略的永久保存
/etc/sysconfig/iptables #iptables 策略记录文件
永久保存策略
iptales-save > /etc/sysconfig/iptables 导入策略文件
service iptables save
2.iptables命令
(1)iptables命令的格式:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :表名(filter nat mangle)
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
iptables
-t ##指定表名称
-n ##不做解析
-L ##查看
-A ##添加策略
-p ##协议
--dport ##目的地端口
-s ##来源
-j ## 动作
ACCEPT ##允许
DROP ##丢弃
REJECT ##拒绝
SNAT ##源地址转换
DNAT ##目的地地址转换
-N ##新建链
-E ##更改链名称
-X ##删除链
-D ##删除规则
-I ##插入规则
-R ##更改规则
-P ##更改默认规则 (-P不能修改为REJECT)
数据包状态
RELATED ##建立过连接的
ESTABLISHED ##正在连接的
NEW ##新的
INVALID
(2)详解COMMAND
1.链管理命令(这都是立即生效的)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT) 默认是关的/默认是开的
比如:
iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
-F: FLASH,清空规则链的(注意每个链的管理权限)
iptables -F 默认清空filter
systemctl restart iptables 后可以重新查看到表中数据
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有链
-N:NEW 支持用户新建一个链
iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X: 用于删除用户自定义的空链
使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
-E:用来Rename chain主要是用来给用户自定义的链重命名
-E oldname newname
-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
iptables -Z :清空
2.规则管理命令
-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
-I 3 :插入为第三条
-R num:Replays替换/修改第几条规则
格式:iptables -R 3 …………
-D num:删除,明确指定删除第几条规则
iptables -L INPUT --line-numbers 查看输入的所有规则编号
iptables -D INPUT 2 即删除编号为2的规则
3.查看管理命令 “-L”
附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
–line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息
注意事项:
不指定表名时,默认表示filter表
不指定链名时,默认表示该表内所有链
除非设置规则链的缺省策略,否则需要指定匹配条件
(3)详解匹配标准
1.通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
例如:
iptables -A INPUT -m state --state NEW ! -s 172.25.254.40 -p tcp --dport 22 -j ACCEPT 接受所有通过22端口,使用tcp协议进行访问请求的新的数据包,除了ip:172.25.254.40的主机
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
例如:
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT 接受所有来自本机回环接口的新的数据包
iptables -t nat -A PREROUTING -i ens3 -j DNAT --to-dest 172.25.254.30 DNAT目的地地址转换
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
iptable -t nat -A POSTROUTING -o ens3 -j SNAT --to-source 172.25.254.140 SNAT源地址转换
(4)扩展匹配
4.1隐含扩展:对协议的扩展
-p tcp :TCP协议的扩展
一般有三种扩展
–dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
–dport 21 或者 --dport 21-23 (此时表示21,22,23)
–sport:指定源端口
-p udp:UDP协议的扩展
--dport
--sport
-p icmp:icmp数据报文的扩展
--icmp-type:
4.2显式扩展(-m)
扩展各种模块
-m multiport:表示启用多端口扩展
之后我们就可以启用比如 --dports 21,23,80
(5)详解-j ACTION
常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
拓展:
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
3.SNAT和DNAT的实现
当我们的IP地址快分配完紧张时我们必须要进行地址转换,来节省IP资源,所以我们要通过iptables来实现NAT的地址转换;
SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
我们将所有172.25.254.0/24网段的IP在经过服务器的时候全部转化成172.25.254.140这个外网地址:
iptable -t nat -A POSTROUTING -o ens3 -j SNAT --to-source 172.25.254.140
只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.25.254.140这个IP.
地址伪装
如果我们使用的网络IP是随即生成的外网IP(动态变化)
我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。
我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 172.25.254.0/24 -j MASQUERADE
这里要注意:地址伪装并不适用于所有的地方。
DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端 通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器
在外网IP想访问我们时,会自动匹配到我们转换的地址设备当中去:
例如:
iptables -t nat -A PREROUTING -i ens3 -j DNAT --to-dest 172.25.254.30