零入门容器云网络-1:在主网络命名空间中测试veth pair设备的连通性

发布于:2022-10-31 ⋅ 阅读:(371) ⋅ 点赞:(0)

已发表的技术专栏(订阅即可观看所有专栏)
0  grpc-go、protobuf、multus-cni 技术专栏 总入口

1  grpc-go 源码剖析与实战  文章目录

2  Protobuf介绍与实战 图文专栏  文章目录

3  multus-cni   文章目录(k8s多网络实现方案)

4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


本篇文章主要是测试一下,主网络命名空间里创建好的一对veth pair的网络情况?

是否能跟宿主机通信?

是否能访问本局域网的其他宿主机?

1、测试环境介绍

一台centos虚拟机

# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r 
# 查看网卡信息
ip a s eth0

在这里插入图片描述

2、网络拓扑图

创建好的关系图,如下

在这里插入图片描述

2.1、创建veth pair

ip link add veth1 type veth peer name veth2

2.1.1、给veth pair 设置ip

ip addr add 10.244.1.2/24 dev veth1
ip addr add 10.244.1.3/24 dev veth2

2.1.2、将veth pair 设置为启动状态

ip link set veth1 up
ip link set veth2 up

3、测试

测试执行,先对veth1,veth2进行抓包,以观察测试时的数据包变化

3.1、分别打开两个xshell终端,分别抓取veth1, veth2的数据包

tcpdump -i veth1 -nn icmp 
tcpdump -i veth2 -nn icmp 

在这里插入图片描述

在这里插入图片描述

3.2、测试veth1是否能ping通?

ping -c 1 10.244.1.2

在这里插入图片描述

虽然,能够ping通,但是数据包并没有发送给网卡veth1,

当然,也是正常现象。

如,在宿主机上,直接ping宿主机的对外网卡eth0,同样,使用tcpdump也抓取不到的

ping 10.211.55.122 
#下面的方式也不行的
ping 10.211.55.122 -I eth0

抓包命令

tcpdump -nn -i eth0 icmp

很惭愧,具体原因,我个人也不是非常了解。

3.3、测试veth2是否能ping通?

ping -c 1 10.244.1.3

在这里插入图片描述

3.4、提供一个http类型的测试服务,服务IP绑定到10.244.1.2上?

查看一下,是否可以使用

3.4.1、测试代码

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type Stu struct {
	Age int
	Msg string
}

const ip = "10.244.1.2"

func sayHello(w http.ResponseWriter, r *http.Request) {
	stu := Stu{Age: 12, Msg: "hello world! this is DNAT+bridge+veth pair Test!"}
	stuJson, e := json.Marshal(&stu)
	if e != nil {
		panic(e)
	}

	w.Write(stuJson)

	fmt.Printf("Reply MSG:%v\tlen(Msg):%d\n", string(stuJson), len(stuJson))
}

func main() {
	http.HandleFunc("/", sayHello)
	fmt.Printf(fmt.Sprintf("App URL: http://%s:%d\n", ip, 9090))

	err := http.ListenAndServe(fmt.Sprintf("%s:%d", ip, 9090), nil)
	if err != nil {
		fmt.Printf("http server failed, err:%v\n", err)
		return
	}
}

3.4.2、编译,启动服务

Makefile文件

build:
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o http-web main.go

scp:
	scp http-web root@10.211.55.122:/root

all:
	make build && make scp

编译命令

make all

3.4.3、登录到122节点上,启动http-web服务

./http-web

在这里插入图片描述

3.4.4、在122节点上,使用curl来测试

在同节点上,使用curl命令来测试一下

curl 10.244.1.2:9090

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当然,如果想让本宿主机上的所有IP都可以访问的,可以修改一下代码:

在这里插入图片描述

在这里插入图片描述

3.5、指定网卡去测试

3.5.1、测试通过veth2网卡ping自己,测试连通性?

ip a s veth2
ping 10.244.1.3 -I veth2

在这里插入图片描述

3.5.2、测试通过veth2网卡去ping veth1网卡,测试连通性?

通过-I参数,来指定使用哪个网卡来发送数据包

ping 10.244.1.2 -I veth2

在这里插入图片描述

默认不通

3.5.3、测试通过veth2是否能ping通本宿主机的对外网卡eth0?

ping -c 1 10.211.55.122 -I veth2

在这里插入图片描述

3.5.4、设置内核参数,来更新默认的连通性

默认情况下是ping不通的,需要修改默认的路由策略

# 设置是否允许接收从本机IP地址上发送给本机的数据包
echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local
echo 1 > /proc/sys/net/ipv4/conf/veth2/accept_local
# 关闭反向路由监测
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth2/rp_filter

在这里插入图片描述

重新测试

ping -c 1 10.211.55.122 -I veth2
ping 10.244.1.2 -I veth2

在这里插入图片描述

查看抓包情况

在这里插入图片描述

这几个内核参数的含义,可以参考下面的文章
https://zhuanlan.zhihu.com/p/50071964

4、提供一下,完整的测试命令

4.1、具体网络构建命令

ip link add veth1 type veth peer name veth2

ip addr add 10.244.1.2/24 dev veth1
ip addr add 10.244.1.3/24 dev veth2

ip link set veth1 up
ip link set veth2 up

# 设置是否允许接收从本机IP地址上发送给本机的数据包
echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local
echo 1 > /proc/sys/net/ipv4/conf/veth2/accept_local
# 关闭反向路由监测
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth2/rp_filter

4.2、测试命令

ping 10.244.1.2 -I veth2

5、总结

  • 一般不会单独使用veth pair虚拟网卡的,必须结合其他网络资源使用。比方说
    • 结合网桥、namespace使用;从而将不同的网络空间链接在一起
  • 在主网络空间里,创建好的veth pair,默认情况下是支持http协议的。
  • 当然,肯定是不能跨主机访问本局域网的其他节点的。
    • 如何跨主机通信,再后续的文章中,再介绍

主要是了解了一下,创建好的veth pair后,默认情况下的连通性。


网站公告

今日签到

点亮在社区的每一天
去签到