# 查看操作系统版本
cat /etc/centos-release
# 内核版本
uname -a
uname -r
# 查看网卡信息
ip a s eth0
2、网络拓扑
3、操作实战
3.1、操作命令
3.1.1、具体操作命令
ip netns add ns1ip link add veth1a type veth peer name veth1bip 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 upip addr add 10.244.1.3/24 dev veth1b
ip link set veth1b upip 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:9090echo 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 mainimport ("encoding/json""fmt""net/http"
)type Stu struct {Age intMsg string
}const ip = "0.0.0.0"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}
}
不用关心测试代码的具体逻辑,主要是关心请求后,是否有正常打印输出即可。
4.1.2、本地编译,上传到Master节点
Makefile
build:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o http-web main.goscp:scp http-web root@10.211.55.122:/rootall: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