零入门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后默认情况下的连通性。
点击 下面 返回 专栏目录 |