零入门kubernetes网络实战-9->在主网络命名空间中测试veth pair设备的连通性介绍

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

本篇文章主要是测试一下主网络命名空间里创建好的一对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、指定veth2网卡ping veth1网卡失败的原因

主要是Linux网络协议栈接收到IP报文后启动了源IP的安全验证机制。

当前创建的veth pair对是不符合源IP安全验证机制的默认规定的。

源IP安全验证机制主要是验证两方面

  • 对源IP地址路由的校验规则(rp_filter)
  • linux宿主机默认不接收源IP地址是本机的IP的报文(accept_local)

在这里插入图片描述

3.5.5、rp_filter内核参数介绍

对源IP地址路由的校验规则
有三个有效值。
rp_filter

  • 0
    • 不再检查源IP
  • 1
    • 默认值
    • 检查源IP地址是路由可达的
    • 入口接口正好是路由表查到的接口(应该是说宿主机上哪个网卡接收到的数据包返回包也是通过此网卡返回)
  • 2
    • 检查源IP地址是路由可达的
    • 宿主机上的任意一个网卡能够返回即可。要求降低了不再要求哪个网卡接收哪个网卡反馈了。

3.5.6、accept_local内核参数介绍

linux宿主机默认不接收源IP地址是本机的IP的报文

可以应对回环现象。

accept_local

  • 0
    • 默认值
    • 默认不允许接收源IP是本机的报文
  • 1
    • 允许Linux宿主机接收源IP是本机的报文

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

默认情况下是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后默认情况下的连通性。


点击 下面 返回 专栏目录

<<零入门kubernetes网络实战>>技术专栏之文章目录

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s

“零入门kubernetes网络实战-9->在主网络命名空间中测试veth pair设备的连通性介绍” 的相关文章