# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r
# 查看网卡信息
ip a s eth0
2、网络拓扑
3、操作实战
3.1、操作命令
3.1.1、具体操作命令(master节点)
ip netns add ns1
ip link add veth1a type veth peer name veth1b
ip link set veth1a netns ns1
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns1 ip link set veth1a up
ip addr add 10.244.1.3/24 dev veth1b
ip link set veth1b up
ip netns exec ns1 route add default gw 10.244.1.3
iptables -t nat -A PREROUTING -d 10.211.55.122 -p tcp --dport 8090 -i eth0 -j DNAT --to 10.244.1.2:9090
echo 1 > /proc/sys/net/ipv4/ip_forward
3.1.2、查看一下当前环境
3.1.2.1、查看一下ns1里的路由情况
ip netns exec ns1 route -n
3.1.2.2、查看一下主网络空间里路由情况
route -n
4、具体测试
在ns1里,启动被测试服务http-web
4.1、被测试服务
4.1.1、被测试服务代码
package main
import("encoding/json""fmt""net/http")type Stu struct{
Age int
Msg string}const ip ="0.0.0.0"funcsayHello(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))}funcmain(){
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}}
不用关心测试代码的具体逻辑,主要是关心请求后,是否有正常打印输出即可。
4.1.2、本地编译,上传到Master节点
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
4.2、在master节点上,ns1命名空间里启动http-web服务
ip netns exec ns1 ./http-web
4.3、在slave节点上,发起http-web服务请求
curl 10.211.55.122:8090
5、观察一下ns1网络空间和主网络空间里的ARP表的变化
ip netns exec ns1 arp -n
6、分析一下,整个传输过程中数据包的报文变化
为了观察报文变化,需要对网络设备进行抓包分析。
6.1、对master节点上的网络设备进行抓包
6.1.1、对ns1网络空间里的veth1a进行抓包
ip netns exec ns1 tcpdump -nn -i veth1a
ip netns exec ns1 tcpdump -nn -i veth1a -w icmp-veth1a.pcap