iptables(一)原理

本为的目的: 作为'虚拟网络'的第一篇章,为后续了解'docker、k8s网络'打好基础,后续学习'flannel、calico网络插件'学习打好基础

CSI  --> 'Container Storage Interface'  -->  标准化'容器存储接口'

CNI  --> 'Conteinre Network Interface'  -->  Google 和 CoreOS 主导制定的'容器网络接口'标准 -->'协议、规则的定制'

一    iptables相关概念

朱双印大神的理解

(1)iptables

'学习的驱动': 由于iptables在'Docker和Kubernetes网络中'应用甚广

'iptables实现的体现': Docker容器和宿主机的'端口映射'、'Kubernetes Service的默认模式'、'CNI相关的网络插件'、Kubernetes'网络策略'等

(2)netfilter

iptables的'底层实现'是netfilter,netfilter是'Linux内核2.4版'引入的一个子系统

特点: 作为一个'通用的、抽象'的框架,提供一整套hook'钩子'函数的管理机制

功能: '数据包过滤-->filter'、'包处理'(设置标志位、修改TTL等)、'地址伪装-->masquery'、'网络地址转换-->NAT'、'透明代理-->proxy'、'访问控制-->ACL'、基于协议类型的'连接跟踪-->track',带宽限速等功能

实质: netfilter的架构就是在整个'网络流程的若干位置'放置一些'钩子',并在每个钩子上'挂载一些处理函数'进行处理

(3)hook

理解'WebHook'机制  -->  一个条件的发生,'满足条件' --> '触发其它'事件的发生

------------  '分割线'  ------------ 

IP层的'5个钩子点'的位置,对应iptables就是'5条内置链'.

'5个钩子点'  <-->  '5条内置链'

'分别是':PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD

------------  '理解的再深刻点'  ------------ 

'钩子-->hooks'可以理解为'埋的地雷';'规则-->rules'可以理解为地雷触发的'条件','table 表-->属于小分队',每个小分队的埋的'地雷集合不一样'

                                                                                     netfilter原理图

注意: '数据流'的走向、先对'整体有个理解'

下面文字: 对'上面图的解释'

centos7 网卡命名规则

(1)  当'网卡上-->eth0'收到一个包'送达协议栈'时,最先经过的netfilter钩子是'PREROUTING'

细节: '判断用户是否埋了这个钩子函数',如果埋了,那么内核将在这里'对数据包'进行'目的地址转换'(DNAT)

思考: 用户'怎么埋钩子函数?'

(2)  不管在PREROUTING'有没有做过DNAT',内核都会通过'查本地路由表-->route',决定这个数据包是发送给'本地进程'还是发送给'其它机器'

--------------- '决策1-->发送给其它机器' ---------------

(3)  如果是发送给'其它机器'(或其他'network namespace') -->'可以通俗的理解成不同的协议栈',就相当于把'本地当作路由器',就会经过'netfilter的FORWARD钩子',用户可以在此处'设置包过滤钩子函数'

(4)  所有马上要'发送到协议栈外'的数据包就会经过'POSTROUTING钩子',用户可以在这里'埋下'源地址转换'SNAT'或源地址伪装'Masequery'的钩子函数

--------------- '决策2-->发送到本地进程' ---------------

(3)  如果经过上面的路由决策'route',内核决定把包发送给'本地进程',就会经过'INPUT钩子'

(4)  本地进程'收到数据包后','回程报文'会先经过'OUTPUT'钩子,然后经过一次'路由决策'(例如:决定从机器的'哪块网卡出去','下一跳地址'是多少等)

(5)  最后'出协议栈的网络包'同样会'经过POSTROUTING钩子'

(4)iptables的三板斧

table'表'、chain'链'、rule'规则'

iptables是'用户空间'的一个程序,'通过netlink'和'内核的netfilter框架'打交道

iptables负责:往'钩子上配置回调函数',一般情况下用于'构建Linux内核防火墙',特殊情况下也做'服务负载均衡'-->'这是Kubernetes的特色操作'

'往钩子配置回调函数'理解  -->  iptables -t nat -a INPUT -p icmp -j DROP

解释: 往'INPT钩子'上配置-->'回调函数-->规则'

下面讲解'iptables的工作原理'

(5)五表五链

常说的iptables'5X5',即'5张表(table)和5条链(chain)'

5条链即iptables的5条'内置链-->系统预定义的5条iptables链',对应上文介绍的netfilter的'5个钩子'。

---------  '5条链分别是'  ---------

INPUT链:一般用于'处理输入本地进程'的数据包

OUTPUT链:一般用于'处理本地进'程的'输出数据包'

FORWARD链:一般用于处理'转发到其他机器'/'network namespace'的数据包

PREROUTING链:可以在'此处进行DNAT'

POSTROUTING链:可以在'此处进行SNAT'

用户还可以在表中定义自己的链

------  '5张表解释如下'  ------

filter表:用于控制'到达某条链上'的数据包是'继续放行'(accept)、直接'丢弃'(drop)或'拒绝'(reject)

后续:补充drop和reject的'区别'?

nat表:用于'修改数据包的源和目的地址'

mangle表:用于修改数据包的IP头信息-->'目前先了解'

raw表:iptables是'有状态的',即iptables对数据包有'连接追踪'(connectiontracking)机制,而raw是用来'去除这种追踪机制'的

security表:最不常用的表(通常我们说iptables'只有4张表',security表是'新加入'的特性),用于在数据包上应用'SELinux'

------  '5张表优先级'  ------

从'高到低'是:raw、mangle、'nat、filter'、security

注意: iptables'不支持用户自定义表'

------  '不是每个链上都能挂表-->细细体会'  ------

iptables'表与链的对应关系'如下图所示

iptables 表和链的对应关系

1.'filter表'——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter

2.'Nat表'   ——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3.'Mangle表'——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块

4.'Raw表'   ——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理

image-20200303112614444 ip报文的格式

(6) 一个网络包经过iptables的处理路径

(7)概念深入理解

'iptables的链-->chain' <===> '对应netfilter的5处钩子'

-----------  'iptables的表(table)的作用'  -----------

iptables的表是来'分类管理'iptables规则(rule)的,系统所有的iptables规则都'被划分'到不同的'表集合'中

iptables的规则就是挂在netfilter钩子上的函数,用来修改数据包的内容或过滤数据包,iptables的表就是所有规则的5个逻辑集合!

-----------  '数据包匹配条件'  -----------

一条iptables规则包含两部分信息:匹配条件和动作。匹配条件很好理解,即匹配数据包被这条iptables规则“捕获”的条件,例如协议类型、源IP、目的IP、源端口、目的端口、连接状态等。每条iptables规则允许多个匹配条件任意组合,从而实现多条件的匹配,多条件之间是逻辑与(&&)关系。

-----------  '数据包匹配后动作'  -----------

DROP:直接'将数据包丢弃',不再进行后续的处理

应用场景: 是'不让'某个数据源'意识'到你的系统的存在,可以用来'模拟宕机'

               ------- '分割线' -------

REJECT:给客户端返回一个connectionrefused或destinationunreachable报文

应用场景:是不让某个数据源访问你的系统,'善意地拒绝':我这里没有你要的服务内容、

               ------- '分割线' -------

QUEUE:将数据包放入'用户空间的队列',供用户空间的程序处理

               ------- '分割线' -------

RETURN:跳出当前链,该链里后续的规则不再执行

               ------- '分割线' -------

ACCEPT:同意数据包通过,继续执行后续的规则

               ------- '分割线' -------

JUMP:'跳转到其他用户自定义的链'继续执行

               ------- '分割线' -------

REDIRECT:在本机上进行'端口映射'

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

效果:经过上述'规则映射后',当别的机器'访问本机的80端口'时,报文会被'重定向到本机的8080端口上'

REDIRECT规则'只能定义'在PREROUTING链或者OUTPUT链中

               ------- '自定义链' -------

用户'自定义链中的规则'和系统预定义的5条链里的规则'没有区别'

由于自定义的链'没有与netfilter里的钩子'进行'绑定',所以它'不会自动触发','只能'从其他链的规则中'跳转过来',这也是'JUMP动作'存在的意义

二    centos7 中iptables、firewalld 和 netfilter 的关系

centos7系统使用'firewalld服'务'替代'了'iptables服务',但是依然可以使用iptables来'管理内核'的netfilter-->'firewalld和iptables冲突问题'

说明:iptables服务和firewalld服务'都不是真正'的防火墙,只是用来定义'防火墙规则功能的管理工具'

原理:将定义好的规则'交由内核中的netfilter'(网络过滤器来读取)从而实现真正的'防火墙功能'

明确:用户'无法直接操作内核',都是通过相应的'工具'-->'使用相应的命令',调用'相应的内核接口'达到目标

展示:最后都以'iptables的规则'来体现

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值