Iptables笔记
话不多说,先上图:
上图中的渐变色分别代表了iptables中的4个表:raw、nat、mangle、filter。按照功能来看:
- filter:负责过滤,防火墙。
- nat:网络地址转换功能,也就是network address translate。
- mangle:拆解报文,做出修改,并重新封装。
- raw:关闭nat表上启用的连接追踪机制。
有了表,下一个概念就是链chain,iptalbes中有5条链,链表关系如下:
- raw:PREROUTING、OUTPUT
- mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
- nat:PREROUTING、OUTPUT、POSTROUTING
- filter:INPUT、FORWARD、OUTPUT
当4个表的规则同时出现在OUTPUT链上时,顺序为:raw—>mangle—->nat—>filter。
使用iptables的k8s集群中,kube-proxy的功能就是监听集群变化后修改对应的iptablse规则,比如在k8s集群的节点上执行iptables -S -t nat
,可以看到很多类似如下输出:
....
-A KUBE-SERVICES -d 10.254.14.132/32 -p tcp -m comment --comment "default/nginx:port-0 cluster IP" -m tcp --dport 80 -j KUBE-SVC-KGNXTN5LYZ3QY2T2
-A KUBE-SERVICES -d 10.254.142.34/32 -p tcp -m comment --comment "default/nginx:port-1 cluster IP" -m tcp --dport 80 -j KUBE-SVC-RCXM3E5S5T3I3MHF
-A KUBE-SERVICES -d 10.254.162.80/32 -p tcp -m comment --comment "default/nginx:port-2 cluster IP" -m tcp --dport 9600 -j KUBE-SVC-RLOOB7F7RE447VMG
....
这也是为什么能在集群节点上访问svc对应的ClusterIP的原理。
但也因为如此,当集群规模、服务规模过大时,iptables规则过多导致性能下降。
而cilium等基于eBPF技术的cni插件,可以绕过网络层甚至链路层直接处理包:
关于XDP相关,可以参考 这里,目前有4个操作:
- XDP_DROP:把包丢掉不进行处理,常常用于过滤一些恶意流量。
- XDP_PASS:把包传递给常规的网络协议栈处理,传递之前可以对包进行修改。
- XDP_TX:把包(可能已被修改)转发到接收它的同一个网络接口。
- XDP_REDIRECT:绕过常规的网络协议栈,将数据包通过另一个网卡重定向到网络。