Iptables笔记

话不多说,先上图:

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插件,可以绕过网络层甚至链路层直接处理包:

iptables

关于XDP相关,可以参考 这里,目前有4个操作:

  • XDP_DROP:把包丢掉不进行处理,常常用于过滤一些恶意流量。
  • XDP_PASS:把包传递给常规的网络协议栈处理,传递之前可以对包进行修改。
  • XDP_TX:把包(可能已被修改)转发到接收它的同一个网络接口。
  • XDP_REDIRECT:绕过常规的网络协议栈,将数据包通过另一个网卡重定向到网络。