一文带你读懂IPTABLES

  • 防火墙相关概念

从逻辑上分类:
主机防火墙:为单个主机进行防护
网络防火墙:对网络入口进行防护,服务防火墙背后的本地局域网
主机防火墙(个人)和网络防火墙(集体)相辅相成![](
从物理上分类:
硬件防火墙:硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台上的防火墙,性能低,成本低
IPTABLES:一个客户端代理,将用户的安全设定执行到对应的“安全框架——netfilter”中。
netfilter才是防火墙真正的安全框架(framework),位于内核空间
netfilter——内核空间
iptables ———— 用户空间的客户端代理
将用户空间的安全设定通过代理执行到Netfilter当中
netfilter/iptables组成Linux平台下的包过滤防火墙(免费)
Netfilter是Linux操作系统核心层的一个数据包处理模块(iptables并没有守护进程,
所以不是正真的服务,而是内核提供的功能),具有如下功能:
网络地址转换
数据包内容修改
数据包过滤的防火墙功能

  • IPTABLES基础

IPtables根据它的rule匹配而对数据包进行:放行(accept),拒绝(reject)和丢弃(drop)等动作
rule存储在内核空间的信息过滤表中,这些规则指定:源地址、目的地址、传输协议(TCP、UDP、ICMP等)和服务
类型(Http、FTP和SMTP)等
Netfilter位于内核空间中,是真正的防火墙,设置了“关卡”在Input、Output上(链)
网卡的驱动是在内核空间当中,Netfilter也是在内核空间当中,所以Iptables+netfilter 可以在内核空间当中
设置“关卡”,当用户去访问应用服务时,数据包是通过网卡流经内核空间之后到达用户空间。
如果我们需要报文转发,则不经过Input链,Outpup链
只需要:PREROUTING(路由前),转发(forward),路由后(postrouting)
常用应用场景,报文流向:
到本地某个进程的报文:PREROUTING‐‐> INPUT‐‐>OUTPUT ‐‐>POSTROUTING
由本机转发的报文:PREROUTING ‐‐> FORWARD ‐‐> POSTROUTING
由本机的某个进程发出报文(通常为响应报文): OUTPUT ‐‐> POSTROUTING

  • 链的概念

防火墙的作用在于对经过的报文匹配“规则”,然后执行对应的动作,如果有多个“规则”组合到一起,那么我们就叫它“链”,
每经过一条链则要把所有的规则都要匹配一遍!如果有符合条件的规则,则执行规则对应的动作
简单来说:多个规则组成链,经过的链的所有规则匹配一遍,符合条件的规则,执行相应的动作

  • 表的概念

每个链上都放置了一串规则,但是有许多类似的规则,这些规则可能是:
对IP或端口进行过滤,
对报文进行修改,
对网络地址进行转换等等
如果把这些实现相同功能的规则放在一起,它们的集合就叫做“表”
相同规则的集合叫做“表”,多张表的规则的集合叫做“链”
iptables提供的表:
raw表:关闭nat上启用的连接追踪机制;iptable_raw
mangle表:拆解报文,做出修改,并重新封装的功能;Iptables_mangle
nat表:网络地址转换;内核模块:Iptables_nat
filter表:负责过滤功能,防火墙;内核模块:iptable_filter
优先级也是这样:raw ‐‐> mangle ‐‐> nat ‐‐‐> filter
我们所有定义的规则,都在于这4张“表”中

  • 表链关系

是不是每种链都会有以上4张表???当然不是!!!每个链只能拥有某些规则,也就是某些表。
总结一下,每个“链”中的规则都存在于哪些“表”中
PREROUTING:raw,mangle,nat
INPUT:mangle,filter,nat(centos 7)
FORWARD:mangle,filter
OUTPUT:raw,mangle、nat、filter
POSTROUTING:mangle、nat
我们实际使用过程中,往往是通过“表”作为操作入口,对规则进行定义:iptables ‐t raw/nat/mangle/filter ‐L
表(功能)<‐‐‐‐‐‐> 链(钩子)
raw 表:PREROUTING, OUTPUT
mangle表:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
nat表:PREROUTING, OUTPUT, INPUT, POSTROUTING,
filter表:INPUT, FORWARD, OUTPUT
操作时,是通过表,查询所定义的规则,以及该表的规则所作用于的“链”
注意:当数据包经过一个“链”的时候,会将当前链的所有规则都依次匹配,而定义的规则汇聚在表中;匹配时,因
为总有优先匹配,所以表就拥有了优先级
当四张表处于同一条“链”时,执行的优先级为:raw ‐‐> mangle ‐‐‐> nat ‐‐‐> filter
注意:要想Linux主机支持转发,需要开启内核的IP_FORWARDING功能
/proc/sys/net/ipv4/ip_forward

image.png

  • 规则的概念

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进处 理
匹配条件
基本匹配条件:SIP、DIP等
扩展匹配条件:Sport,Dport等(‐m参数)
扩展条件也是Netfilter中的一部分,只是以模块的形式在,若要使用,则需要依赖对应的模块
处理动作
处理动作在iptables中称呼为target,分为基本动作和扩展动作
常用动作:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,无任何回应信息
REJECT:拒绝数据包通过,必要时会发给数据发送端一个响应的拒绝消息
SNAT:源地址转换,解决内网用户同一个公网地址上网问题
MASQUERADE:是SNAT的一种特殊形式,适用动态的、临时会变的IP上
DNAT:目标地址转换
REDIRECT:在本机做端口映射
LOG:/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,不对数据包进行任何
操作,只记录,让下一条规则去匹配。

  • 规则查询

规则查询:
以filter表进行实际操作,filter负责过滤功能,比如允许(禁止)哪些IP地址访问,允许(禁止)访问哪些端口
iptables ‐t filter ‐L
‐t : 指定表,默认是filter表
‐L : 列出表中的规则,默认所有规则
iptables ‐t filter ‐vxL INPUT
‐v : 显示详细信息
‐x : 展开数字
policy 当前链的默认策略
packets 当前链默认策略匹配到包的数量
bytes 当前链默认策略匹配到包的大小;‐x 显示精确的计数值!
pkts 对应匹配到报文的个数
bytes 对应匹配到的报文大小总和
target 规则对应的“处理动作”
prot 规则对应的协议,是否只针对某些协议应用此规则
opt 规则对应的选项
in 数据包由哪个接口(网卡)流入,设置哪块网卡流入的报文需要匹配当前规则
out 数据包由拿个接口(网卡)流出,设置哪块网卡流出的报文需要匹配当前规则
source 规则对应的源地址(IP或网段)
destination 规则对应的目标地址(IP或网段)
源地址和目标地址都是anywhere,因为iptables默认进行了名称解析,这样效率会比较低
iptables ‐‐line‐numbers ‐t filter ‐vnL INPUT
‐n 不对IP地址进行名称解析
‐‐line‐numbers 显示有序号

  • 规则操作

iptables ‐F INPUT
‐F:清除规则
增加规则
iptables ‐t filter ‐A INPUT ‐s x.x.x.x ‐j
‐A: 追加
‐I:插入
‐s:匹配条件中的源地址
‐j:匹配条件中的所对应动作
删除规则
方法一:根据规则的编号去删除规则
方法二:根据具体的匹配条件去删除规则
iptables ‐t filter ‐D INPUT 3
iptables ‐t filter ‐D INPUT ‐s x.x.x.x ‐j
‐D:删除指定链中的规则
‐F: 删除操作,冲刷指定的链
修改规则:
iptables ‐t filter ‐R INPUT ‐s x.x.x.x ‐j <action 大写>
iptables ‐t filter ‐P FORWARD DROP
‐R:修改规则
‐P:修改链的默认规则
保存规则:
iptables‐save > /etc/sysconfig/iptables-config
导入规则:
iptables ‐restore < /etc/sysconfig/iptables-config

  • 匹配条件

匹配条件:
‐s: 指定源地址
‐d :指定目标地址
‐p :指定协议类型
‐i / ‐o : 指定网卡流入和流出
-i:用于网卡流入,PREROUTING,INPUT,forward![ -o:用于网卡流出,OUPTUT, FORWARD,
POSTROUTING
扩展条件:
‐m [扩展模块]
tcp/udp扩展模块
‐‐dport
‐‐sport
iprange扩展模块:匹配报文的源/目的地址所在范围
‐‐src—range
‐‐dst‐range
string扩展模块:指定匹配报文中的字符串
‐‐algo:指定匹配算法,可选算法bm和kmp
‐‐string:执指定需要匹配的字符串
time模块:时间段匹配,如果报文在到达时间范围内,则符合匹配条件
‐m time ‐‐timestart [起始时间] ‐‐timestop [结束时间]
‐‐weekdays
‐‐mouthdays
‐‐datestart[其实日期] ‐‐datestop[结束日期]
connlimit模块:限制每个IP地址同时连接到server端的连接数量,不需要指定IP,默认就是针对每个客户IP
地址
‐m connlimit ‐‐connlimit‐above 2 ‐j REJECT
限制每个客户端IP的ssh并发链接数量高于2都被拒绝
‐p tcp ‐‐dport 22 ‐m connlimit ‐‐connlimit‐upto 2 ‐j ACCEPT
每个客户端IP的ssh并发链接数量只要不高于2都被接收
‐p tcp ‐‐dport 22 ‐m connlimit‐‐connlimit‐above 2 ‐‐connlimit‐mask 24 ‐j REJECT
限制24网段的链接数量为2,配合后更加的灵活
limit扩展模块:对“报文到达速率”进行限制的,就是限制单位时间内流入的包的数量
‐p icmp ‐m limit ‐‐limit 10/minute ‐j ACCEPT
每6秒放行一个包
/second
/minute
/hour
/day
‐‐limit‐burst 空闲时可放行的包的数量,默认为5;而默认生成令牌的速度为每6s一个!
state扩展模块:
当我们去访问服务端的时候,发送请求,服务端响应我们的请求,于是,作为客户端是不是应该放行该端
口?!
如果我们没有主动去发送请求,服务端发送了请求,我们是不是也能够接收到?!当然是可以的。那么安全性??
方案一:我们只为特定IP放行端口,如果主机量非常的多,工作量也就会增加!!
方案二:利用‐‐tcp‐flags去匹配tcp报文的标志位,把外来的“第一次握手”的请求拒绝掉,是不是就ok
了??如果他人利用UDP或ICMP协议呢??
方法三:我们通过判断报文的连接状态是请求还是回应,进行接收和拒绝,是不是就ok了??
对于state模块的连接报文中的状态可以分为:NET, ESTABLISHED, RELATED, INVALID, UNTARCKED
NEW:连接中的第一个包,状态就是NEW
ESTABLISHED:把NEW状态包后面的包的状态理解为ESTABLISHED,表示已经建立连接
RELATED:与“命令连接”中的报文有关系的,比如FTP服务,有两个进程,一个命令进程,一个数据进程
INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,我们是能够主动屏蔽状态为
INVALID的报文
UNTRACKED:表示报文未被追踪时的状态,当报文的状态为UNTRACKED时通常表示无法找到相关连接
iptables ‐t filter ‐I INPUT ‐m state ‐‐state ESTABLISHED,RELATED ‐j ACCEPT
iptables ‐t filter ‐I INPUT ‐m state ‐j REJECT
表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新报文,则无法通过防火墙。

  • 自定义链

当默认链的规则非常多的时候,不方便我们管理;如果INPUT链中存放几百条规则,有针对httpd服务的,有针对
sshd服务的,有针对私网IP的等等,当我们想去修改httpd规则时候,为了方便管理
iptables ‐t filter ‐N my_chain
‐N : 创建自定义链
增删改查同模式链的方法
iptables ‐t filter ‐I my_chain ‐s 192.168.139.1 ‐j REJECT
iptables ‐I INPUT ‐p icmp ‐j my_chain 表示引用链,禁ping!!
删除自定义链:
iptables ‐F my_chain
iptables ‐t filter ‐‐line ‐L INPUT
iptables ‐t filter ‐D input [num]
iptables ‐F INPUT
iptables ‐X my_chain
X:删除自定义链
但是删除自定义链的时候需要满足的条件:

  1. 自定义链中没有任何默认链引用,即自定义链的引用数为0
  2. 自定义链中没有任何规则,即自定义链为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值