docker网络严重依赖于linux网络
容器之间相互隔离
为了支持网络协议栈的多实例,linux提供了一个网络名称空间(Network Namespace)。不同的网络名称完全隔离。
容器之间的网络互通问题?
实现两个不同的网络名称空间互联的方式
1、veth设备对
veth设备必须是成对出现。
1、创建名称空间
[root@localhost ~]# ip netns add test012、创建veth设备对
[root@localhost ~]# ip link add veth type veth peer name veth0013、绑定名称空间
[root@localhost ~]# ip link set veth001 netns test013.1进入名称空间
[root@localhost ~]# ip netns exec test01 bash4、分配IP
[root@localhost ~]# ip netns exec test01 ip addr add 10.0.0.111/20 dev veth001
[root@localhost ~]# ip addr add 10.0.0.112/20 dev veth5、重启
[root@localhost ~]# ip netns exec test01 ip link set dev veth001 down
[root@localhost ~]# ip netns exec test01 ip link set dev veth001 up
[root@localhost ~]# ip link set dev veth down
[root@localhost ~]# ip link set dev veth up6、测试
[root@localhost ~]# ping 10.0.0.1112、网桥
Linux可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决定报文的转发目标网口。
网桥设备br0绑定了eth0、eth1。对于网络协议的上层来说,只看得到br0。因为桥接是在数据链路层实现的,上层不需要关心桥接的细节,于是协议上层需要发送的报文被送到br0,网桥设备的处理代码判断报文该被转发到eth0还是eth1,或者两者皆转发。反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。而有时eth1也可能会作为报文的源地址或目的地址直接参与报文的发送与接收,从而绕过网桥。
3、iptables
我们知道,Linux络协议非常高效,同时比较复杂如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢?Linux提供了一套机制来为用户实现自定义的数据包处理过程。
在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络棋处理数据包的过程中对数据包进行些操作,例如过滤、修改、丢弃等整个挂接点技术叫作Netfilterlptables
Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中:而lptables是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表通过者的配合来实现整个Linux网络协议战中灵活的数据包处理机制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言