iptables是什么?
是ip table s
ip 表格 多个
就是
多个和ip有关系的表格
什么是ip?
每个网络设备的唯一标识
有这个,能和别的有ip的设备聊天
没这个,得想别的办法
拿四版本来说
ip是32个二进制数 比如:11101010 10101010 01010101 10101010
常用表示方法,四个点分十进制数 比如: 192.168.1.3
什么是点分十进制数?
就是用点隔开的,十进制的,数
192一个十进制数
168第二个十进制数
1第三个十进制数
3第四个十进制数
共四个
每个之间用点"."隔开
什么是表格?
确实,就长excel那样
上下左右都很整体,排列工整
捋一捋
交换机有mac地址表
路由器有路由表、连接状态表
ospf里面有邻居表,链路状态表
mysql里面有一大堆表
linux系统里有arp表,进程表
硬盘上面有MBR分区表
oracle里面有重做日志表Redo log
文件系统里有超级块,inode表,符号连接表
那么
iptables
作为防火墙,
有几个表格
不过分吧
这么看来,要公公整整的做事情
有个表格还是挺有用的
iptables 常说四表五链
raw mangle nat filter
这四个是四表,常用的是nat filter
nat主要是地址转换
还可以用来负载均衡,流量分发
filter是过滤表
相当于这几个表格里面更核心的那个
说五链之前,说一下
iptables防火墙,是Linux内核管的
外部流量进入一个服务器
是要先进物理网卡
然后进操作系统内核
内核让通过了
才会传递给用户空间
也就说是到达应用层
由于Linux操作系统内核有路由器的功能
所以在这里理解内核的数据过滤
应该可以暂时当它为一个路由器
五链:
prerouting 路由器看数据前,也就是数据刚从网卡到内核这
postrouting 路由器看数据后,准备邮寄的时候,”post“ 邮寄
input 进用户空间的时候
output 出用户空间的时候
forward 转发
常用的是filter表
也就是来访的数据,是要到操作系统的用户空间的
那么这个时候filter表出手
说
这种数据
我来管
input,数据进用户空间的时候怎么管,什么规则,什么数据能进站,什么数据得等一下
output,数据出站的时候,怎么管,什么数据能出站
forward,管转发,什么数据怎么转发,转发到哪
这个大概就是四表五连的一个基本情况
k8s中的networkPolicy
网络策略
也就是防火墙
k8s底层调用的防火墙是iptables
那么在k8s这个容器管理平台上
怎么调用防火墙呢
k8s的networkPolicy提供了
两个模块
一个是Ingress 进站流量管理模块
一个是Egress 出站流量管理模块
管理的项目有哪些?
ipBlock 网络层怎么管,也就是根据ip地址去管
port 传输层怎么管,TCP还是UDP,端口号多少
namespaceSelector 名称空间这里有两个点,一个是networkPolicy必须指定是在哪个名称空为作用域的,因为每个名称空间是相互隔离的,名称空间下的资源和别的名称空间下的资源是各干各的。大家的关系好像就是,都在一个集群,都在用这些集群的物理资源。从k8s集群外看,这些进程和文件都属于这个k8s集群。但是从k8s集群内部看,不同名称空间的资源是完全独立的,比如网络ip,文件系统,挂载,持久卷,用户和组,进程id,消息队列,信号量,主机名,这些如果不在同一个名称空间下,是看不到别的名称空间的这些资源的。也就是说,名称空间的核心概念就是隔离集群中的这些资源。整个集群给不同的名称空间分配资源,有的资源是要从物理层面分的,比如存储,分了之后,每个名称空间之间互不影响。有的资源是可以重复的,比如A名称空间有个服务帐号叫abc,B名称空间也有个服务帐号叫abc,互不影响。再比如A名称空间有个pod叫httpd,B名称空间也可以有个pod叫httpd。所以,在用kubectl管理k8s集群的时候,如果没有指定名称空间,比如kubectl get pods,看一下有哪些pod,这个是默认看的是default名称空间下的pod,如果要看lucky名称空间下的pod,就需要用kubectl -n lucky get pods来查看。所以名称空间的隔离作用,在k8s中还是很重要的。
namespaceSelector的第二个点是,在防火墙这边,是过滤名称空间是什么样的。往往分为两种,一种是和这个策略所在的名称空间的同一个名称空间来访问的数据,第二种是和这个策略所在的名称空间的不同的名称空间来访的数据。
刚才不是说,名称空间是相互隔离的吗
是啊
但是,有方式能让一个名称空间下的pod所运行的服务向外暴露
一般是nodeport和ingress两种方式
nodeport是端口转发
ingress常用的相当于nginx反向代理
这两个服务是把pod内的比如web进程向公网暴露
也就是集群外的主机都可以访问这个pod的服务
那么另一个名称空间的pod比如跑的就是web请求,那么也应当可以访问这个web服务
再怎么隔离,把别的名称空间的pod当成公网上的请求就行了,就没有必要隔离了。
当然,这个的条件是通过service将pod对外发布服务。
所以,namespaceSelector就是筛选,是跟网络策略在一个名称空间的,还是别的名称空间的,访问请求。如果是自己名称空间的,允许还是拒绝。如果是别的名称空间的,要说是哪个,怎么分辨?k8s一般喜欢用label也就是标签,来区分资源,对名称空间也一样。
带什么标签的名称空间,怎么弄
语法就是
- namespaceSelector:
matchLabels:
key: value
这里的key: value键值对,就是名称空间的标签。
在k8s里面,标签不是key,也不是value,而就是"key=vlaue" 这一对,就是标签。
还有一个筛选项目
就是
podSelector
跟名称空间一样,也是拿标签来区分
什么标签的pod,让出还是让进,还是怎么着
语法是
spec:
podSelector:
matchExpressions:
- key: xxxx
value: xxxxx
operator: In ( In NotIn Exists DoesNotExist ) 这几选一个
进站策略:
ingress
- from:
出站策略:
egress:
- to
图片来源:某站,技术蛋老师