一、前言

在基于虚拟化的云系统中,网络虚拟化是不可或缺的关键部分。虚拟化的网络可以自由的在本地进行基于单机的网络配置或者借助一些互联技术(underlay、overlay或者点对点技术)在虚拟网络内部空间实现跨节点和数据中心的网络互联,但是如果虚拟网络内部的服务要对外进行暴露,就不得不借助地址转换或者端口转换等数据包修改技术。而在现有的container管理框架中,iptables更是承担了服务暴露和服务后端负载均衡等功能,是诸如kubernetes、Openshift等平台上很重要的组成模块。

 

二、iptables基本概念

1.iptables的chain、table和rule

iptables基本概念包括五个链、四个表和若干规则。链由一些列规则组成、表则由一系列链组成。

五个链分别是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

四个表分别是filter、nat、mangle、raw

4个表的优先级由高到低的顺序为:raw > mangle > nat > filter

2. 四个表的功能特点

  • filter表:匹配数据包以进行过滤
  • nat表:修改数据包进行地址或者端口的转换
  • mangle表:用于修改数据包IP头信息中TOS、TTL、或者对数据包进行Mark以实现QoS或者特定路由策略
  • raw表:不经过iptables的状态跟踪功能而进行快速处理(iptables是一个有状态的系统,会在raw表之后mangle表之前,对数据包进行connection tracking,而由于raw表是优先级最高的表,数据包如果满足raw表的内容匹配之后,便不会再经过后续connection tracking和地址端口转换等操作,可以提高特定类型包的处理效率)

3. 五个链的功能特点

  • PREROUTING,作用在数据包进入内核网络模块之后,获得路由之前
  • INPUT,作用在数据包被决定路由到本机之后
  • FORWARD,作用在数据包被决定路由到其他主机之后
  • OUTPUT,作用在离开本机的数据包进入内核网络模块之后
  • POSTROUTING,作用在对于离开本机或者FORWARD的数据包,当数据包被发送到网络之后

4. 链、表、路由和连接跟踪的组合关系

kuberntes 无法ping通容器ip kubernetes iptables_docker

转载自

三、关于connection tracking

很多iptables的功能需要借助connection tracking实现,所以当数据包经过iptables在raw表处理之后mangle表处理之前,会进行connection tracking处理,从iptables的connection tracking机制可以得知当前数据包所对应的连接的状态:



  • NEW,该包请求一个新连接,现在没有对应该数据包的连接
  • ESTABLISHED,数据包已经属于某个连接
  • RELATED,数据包已经属于某个连接,但是又请求一个新连接
  • INVALID,数据包不属于任何连接

/proc/net/ip_conntrack里面保存了所有被跟踪的连接,单个纪录如下:

tcp 4 202713 ESTABLISHED src=192.168.166.103 dst=192.168.166.101 sport=3377 dport=11232 packets=22 bytes=17720 src=192.168.166.101 dst=192.168.166.103 sport=11232 dport=22 packets=92 bytes=4490 [ASSURED] mark=0 secmark=0 use=1

可以通过ip_conntrack_max和ip_conntrack timeout来调整系统connection tracking的能力:

net.ipv4.ip_conntrack_max =
net.ipv4.netfilter.ip_conntrack_max =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait =

可以在raw表里面设置-j NOTRACK跳过其它表和connection tracking处理,比如:

iptables -t raw -A PREROUTING -d A.B.C.D -p tcp --dport 80 -j NOTRACK


 


四、数据包流程

1.进入的数据包

在数据包由网卡进入协议栈之后,会依次经由raw、connectiong tracking、mangle、nat三个表的PREROUTING链进行处理,并进行路由选择。路由结果如果是给本机的,则经由mangle、filter两个表的INPUT链处理之后发给上层应用程序;如果是要转发给其它主机的,则会经过mangle、filter两个表的FORWAR链处理之后,再经由mangel、nat表的POSTROUTING链处理之后由网卡对外发送

2.出去的数据包

数据包由上层应用程序进入协议栈之后现进行路由选择,然后经由raw、connectiong tracking、mangle、nat、filter表的OUTPUT链的处理,再经由mangel、nat表的POSTROUTING链处理之后由网卡对外发

3.更详细的iptables包处理流程请参看下图

https://en.wikipedia.org/wiki/File:Netfilter-packet-flow.svg

kuberntes 无法ping通容器ip kubernetes iptables_kubernetes_02