我们的主机网络防护是基于netfilter
实现。最近遇到需要对访问主机上Docker
容器的流量进行防护。几年前其实就处理过这个场景,时间久远忘记了,重新梳理一下记录下来。
我们的主机网络防护模块的hooknum
为LOCAL_IN
和POST_ROUTING
, 并且hook
的优先级为NF_IP_PRI_FIRST
, 也就是在hooknum
位置最先运行。
从宿主机外部访问主机上容器的场景
之前的文章<<从外部访问Docker桥接网络容器路径分析>>分析了从外部访问Docker
桥接网络的网络路径。
- 从外部到容器的数据包会流经
PRE_ROUTING
,FORWARD
和POST_ROUTING
阶段,在PRE_ROUTING
阶段会进行DNAT
, 将目的IP/PORT
, 修改为容器的IP/PORT
。 - 从容器到外部的数据包会流经
PRE_ROUTING
,FORWARD
和POST_ROUTING
阶段,在POST_ROUTING
阶段会进行SNAT
, 将源IP/PORT
修改为外部宿主机的IP/PORT
。
从网络路径来看,在POST_ROUTING
阶段数据包上的地址是容器本身的地址, 因而我们可以简单的将容器IP/PORT
端口在规则中配置,就可以实现对于访问容器内部流量的防护。