|
已发表的技术专栏(订阅即可观看所有专栏) 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 (
&#34;encoding/json&#34;
&#34;fmt&#34;
&#34;net/http&#34;
)
type Stu struct {
Age int
Msg string
}
const ip = &#34;10.244.1.2&#34;
func sayHello(w http.ResponseWriter, r *http.Request) {
stu := Stu{Age: 12, Msg: &#34;hello world! this is DNAT+bridge+veth pair Test!&#34;}
stuJson, e := json.Marshal(&stu)
if e != nil {
panic(e)
}
w.Write(stuJson)
fmt.Printf(&#34;Reply MSG:%v\tlen(Msg):%d\n&#34;, string(stuJson), len(stuJson))
}
func main() {
http.HandleFunc(&#34;/&#34;, sayHello)
fmt.Printf(fmt.Sprintf(&#34;App URL: http://%s:%d\n&#34;, ip, 9090))
err := http.ListenAndServe(fmt.Sprintf(&#34;%s:%d&#34;, ip, 9090), nil)
if err != nil {
fmt.Printf(&#34;http server failed, err:%v\n&#34;, 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后,默认情况下的连通性。 |
|