
在 容器间通信 一节中,由于两个 Network Namespace 与主机之间隔离,是无法访问外网的,那么如何访问外网呢。可以想到这样一种网络方案,因为 veth1 和 veth2 是连通的,所以 veth1 的数据是可以传递到 veth2 的,那么此时如果 veth2 的数据能传递给 eth0,借助 eth0 的外网访问能力,就能实现 veth1 的外网访问。
省略容器创建和链接命名空间,分别为容器中的网卡 veth1 和主机网卡 veth2 配置ip
可以看到这两块网卡能
可以看到,当我们直接 ping 时,不会有 ICMP 报文发出,提示网络不可达。这是因为 10130034和veth1不在同一网段,在没有配置网关的情况下,也不知道应该如何发出去。
正常情况下,为了让 veth1 ping 通 eth0,可以给 veth1 配置默认的路由规则,告诉它如果找不到合适的规则,就把数据包从 veth1 扔给 veth2。
配置好路由规则后,就能够 ping 通 10130034 了。
ping 通10130034 并不代表数据到达了 eth0 网卡 ,因为 linux 内部网络交换和外部不一样。梳理一下数据流程。
至此,整个 ICMP 通信完成。自始至终网卡 eth0 未参与。
上一部配置好路由,我们测试了 veth1 能够和主机任意一个 IP 地址通信。本节将借助 eth0 访问到网关。
其中的关键点在于,如何把 veth2 的数据包传递给 eth0
先尝试 ping 一下网关,然后抓取 veth2 的数据包,发现只有请求报文,没有响应报文。
再抓取物理网卡(我这里是物理网卡名称是 enp0s3f0,也就是图式的 eth0,统一用 eth0 代表物理网卡)上的数据包。发现没有任何数据包。
为了让数据包从虚拟网卡 veht2 发到 eth0,需要用到 ip_forward ,也就是启用内核的数据包转发功能。数据转发功能能够让内核接收到不属于本机的数据包时,根据 数据包的目的 ip 地址将数据包通过合适的网卡转发出去。
sysctl -w netipv4ip_forward=1
ping 网关测试,可以连通,抓取物理网卡信息,同时存在请求和响应报文。
既然 ping 通了网关,就意味着数据包已经转发出去了,那么可以访问局域网其他主机或者公网吗。
首先测试一下局域网访问,ping 不通,我们在局域网的 179 这台主机上抓包。可以看到 179 收到了 ICMP 请求包,也将应答包发给了网关。
再抓取一下本机网卡,可以看见本机确实没有收到 ICMP 应答包。
这个问题就比较有意思,前一节,网关收到了 ICMP 请求,能够封装 ICMP 应答包回复给主机,而如果网关收到其他主机的 ICMP 回程报文,则由于网关不能正确传递。
其实不传递才是正常的,当网关收到 179 发来的 ICMP 应答报文时,需要投递给 1921680101,但是网关上没有这样一个匹配的规则,只能走默认路由或者丢弃。
当我们 ping 网关时,猜测应答有一些特殊 *** 作,能够正确将应答包原路返回 这个问题我暂时也不清楚 。
为了让数据包能正确的被路由,需要使用到 SNAT 技术。
SNAT 功能比较简单,就是将源地址在 19216800/24 这个网段的数据包,将其源地址转换以后,发送出去,用 iptables 规则就可以实现。
root@merore ~$ iptables -t nat -A POSTROUTING -s 19216800/24 -j MASQUERADE
此时再 ping 一下其他主机和公网。均能正常访问。
抓取本机网卡数据包,可以看到发出去的数据包源ip地址都被替换为了实际的物理网卡地址 10130034
至此,就手动完成了单主机下容器与外网通信的整个流程。
容器网络与外网通信用到的技术
其实这里还遗留了一个问题,在配置 SNAT 之后, 我们能够理解数据包能正确的发出去,eth0 网卡也能正确的收到回程报文,但此时回程报文的源地址是 101300179,目的地址是 10130034 。这样一个数据包又是如何正确的回传给 虚拟网卡veth2,然后传递 veth1 的呢。可以参考以下链接。
>
第一步:去百度搜索Fiddler第二步:去到Download找到图中的软件安装第三步:打开软件,在工具栏,找到Tools-》 Fiddler Options第四步:在HTTs选项卡中选中decrypt >
方法如下:
安装抓包软件,win自带也有抓包工具,我装了比较通用的ethereal,抓包的结果基本所有的抓包软件都能打开和分析。
抓包的笔记本需要与被抓设备位于同一广播域下,就是说位于同一个HUB下,同一交换机下的不同端口就是不同广播域,貌拟现在交换机好找,HUB难觅。、
首先要指定抓包用的网卡,在最上层菜单先中capture栏目,然后在d出菜单中选择option
在d出菜单中,选择用于抓包的网卡,一般软件模拟的网卡也会显示在这里,不要选择错了
所有配置都完成后,就可以点击start键开始抓包。
进入抓包环节,如下图,注意包数量是会一直往上增长的,如果没有,一般是选择错了网卡或接线不对。点击stop后,会进入分析包介面,在那个介面也可以存抓包文件,哪怕不会分析,至少转包工作是完成了。
以上就是关于容器网络 - 与外网访问全部的内容,包括:容器网络 - 与外网访问、如何抓取一个局域网的所以的网络流量数据包、怎样使用 fiddler抓取网络数据包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)