容器网络到底是怎么实现的呢?答:借助iptables,iptables是linux的一个防火墙机制,实现了防火墙的包过滤,提高宿主机网络的安全性。
iptables是基于linux的netfilter机制实现的,iptables就是一个用户态的工具,实际上都是在操作netfilter。
iptables的工作流程:
数据包从开始进入本机–>首先会进入iptable的NAT表中,prerouting链决定这个包要不要被修改,这个链是需要用户自定义的,如果匹配到了就去修改,如果不匹配就不修改–>然后再经过路由选择(包里有目标ip和目标端口),路由决定这个包到哪里(是需要将包发到宿主机的某个服务上,还是通过iptables将包转发到另一个地方)我们一般将规则放在INPUT链中,就是数据包的近战,就是谁可以访问我本机的应用,谁不可以访问我本地的应用。
iptables -vnL //查看当前filter中的所有路由表
iptables-save //查看所有的iptables执行命令
docker port 容器id
//查看容器的端口映射详情
iptables -t nat -vnL DOCKER
//查看nat表的路由详细信息,链docker
SNAT容器访问外部,修改元ip为宿主机ip向外发出:
iptables -t nat -vnL POSTROUTING
//查看放通了哪个网段出去,每创建一个容器就会放通一个网段。
当前主机所有数据包源ip来自于172.0.0.0/16这个网段的都要做源地址转换。
为甚么没有用SNAT,而是使用了MASQUERADE,因为MASQUERADE是动态源地址转换,SNAT是固定ip。
外部访问容器:
DNAT 目标地址转换,修改数据包目的ip: