IE盒子

搜索
查看: 87|回复: 0

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

[复制链接]

2

主题

7

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-3-3 07:18:09 | 显示全部楼层 |阅读模式
已发表的技术专栏(订阅即可观看所有专栏) 0  grpc-go、protobuf、multus-cni 技术专栏 总入口
1  grpc-go 源码剖析与实战  文章目录
2  Protobuf介绍与实战 图文专栏  文章目录
3  multus-cni   文章目录(k8s多网络实现方案)
4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录
<hr/>本篇文章主要是测试一下,主网络命名空间里创建好的一对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 veth22.1.1、给veth pair 设置ip

ip addr add 10.244.1.2/24 dev veth1
ip addr add 10.244.1.3/24 dev veth22.1.2、将veth  pair 设置为启动状态

ip link set veth1 up
ip link set veth2 up3、测试

测试执行,先对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 all3.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_filter4.2、测试命令

ping 10.244.1.2 -I veth25、总结


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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表