Task 1: Network Setup
在宿主机/docker 1.1.1.1上执行以下命令:
开启容器
dcup
然后dockps 查看容器ID 之后docksh <ID>
我们连接server-router、host-192.168.60.5、client-10.9.0.5三个容器。
实验网络拓扑如下:
- 在hostU上ping VPN server,测试两者通信
在Host V(192.168.60.5)上ping VPN Server,
- 测试两者通信:
在HostU上ping HostV,
- 两者不可通信:
- 在Server上运行tcpdump,监听eth0网卡,然后在Host U上ping Server,执行得到如下图结果:
Wireshark的
捕获:
- 在Server上运行tcpdump,监听eth1网卡,然后在Host V上ping Server,如图所示:
Wireshark的
捕获:
综上综述,通过执行以上操作,我们完成了Network Setup任务。
Task 2: Create and Confifigure TUN Interface
Task2.a: Name of the Interface
将tun.py中的网卡名称tun修改为name。
在Host U上为tun.py添加运行权限并运行。
另开一个shell进入Host U容器,查看容器内的网卡。
Task 2.b: Set up the TUN Interface
在网卡可用之前,需要做两件事,一是为其分配地址,二是开启网卡:
在tun.py中添加以下黑色部分内的代码分配IP地址:
再次在Host U上运行tun.py文件。
另开shell在Host U上执行ip address
执行得到如下图结果:
注意黑色标出部分,可以看到已经有地址了。
这就是与2.a现象的区别!
Task 2.c: Read from the TUN Interface
- 修改tun.py文件,修改while循环:
2.在Host U上运行tun.py文件。
另开shell在Host U上ping 192.168.53.0/24子网的地址:192.168.53.1:
查看tun.py的输出:
在shell上继续ping 192.168.60.0/24的地址,192.168.60.1:
查看tun.py的输出:
可以看到是没有输出的。
针对实验手册中提出的问题,我们回答如下:
• On Host U, ping a host in the 192.168.53.0/24 network. What are printed out by the tun.py program? What has happened? Why?
答:输出:IP / ICMP 192.168.53.99 > 192.168.53.1 echo-request 0 /Raw
这是从TUN interface中读取的数据。
• On Host U, ping a host in the internal network 192.168.60.0/24, Does tun.py print out anything? Why?
答:没有输出
192.168.60.0/24是我们的内网,并没有从TUN interface中读到数据。
Task 2.d: Write to the TUN Interface
修改tun.py while循环内容如下,收到ICMP request后写入
- echo reply packet:
运行tun.py,另开shell在Host U上ping 192.168.53.1,结果如下:
发现有回应了,Tun.py输出如下:
- 再次修改while循环如下:
再次运行tun.py,另开shell 同样ping 192.168.53.1,结果如下:
发现ping不通了。
综上综述,通过执行以上操作,我们完成了Create and Confifigure TUN Interface任务
Task 3: Send the IP Packet to VPN Server Through a Tunnel
- 在VPN Server容器创建tun_server.py文件,内容如下:
在Host U上创建tun_client.py文件,在VPN Server(10.9.0.11)上运行tun_server.py,在Host U上运行tun_client.py:
然后另开shell,在Host U上Ping 192.168.53.0/24:192.168.53.1:
然后查看VPN server的输出,如下所示:
解释: ping的流量进入name0网卡之后被tun_client.py程序读取,然后发送给了tun_server。
然后在Host U上继续ping 192.168.60.5也就是Host V:
查看结果:
发现VPN Server没有输出了,因为流量没有被name0网卡接收,也就送不到VPN server了。
既然无法被网卡name0接收,我自己设定路由,使流量转到name0网卡上在Host U上运行以下命令:
ip route add 192.168.60.0/24 dev name0
然后再ping 192.168.60.5:
查看tun_server.py的输出
如下图结果:
发现在VPN Server上tun_server.py有了关于192.168.60.5的输出。
综上综述,通过执行以上操作,我们完成了Send the IP Packet to VPN Server Through a Tunnel任务
Task 4: Set Up the VPN Server
修改tun_server.py文件,在VPN Server上运行tun_server.py文件,在Host U上运行tun_client.py文件,在Host V(192.168.60.5)上开启监听:
tcpdump -i eth0 -n
另开shell,在Host U上ping 192.168.60.5,查看Host V上是否有输出
执行得到如下图结果:
综上所述,通过执行以上操作,我们完成了Set Up the VPN Server任务
Task 5: Handling Traffific in Both Directions
修改一下tun_server.py文件内容,修改tun_client.py,在VPN Server上运行tun_server.py,在Host U上运行tun_client.py。
在ping 192.168.60.5之前,使得ip route中有关于192.168.60.0/24的条目,输入指令:
Ip route add 192.168.60.0/24 dev name0
在Host U上ping 192.168.60.5,结果如下:
发现有回复了。
7.开启wireshark,选择any 网卡选项,然后再次ping 192.168.60.5,wiresahrk结果如下:
可以看出整个流是从10.9.0.5 -> 10.9.0.11 -> 192.168.60.5的。
8.从Host U telnet连接Host V时:
如下图:
综上综述,通过执行以上操作,我们完成了Handling Traffific in Both Directions任务
Task 6: Tunnel-Breaking Experiment
- 像上个实验那样从Host U发起对Host V的telnet连接:
终止tun_client.py程序的运行:
在Host U上输入一些内容,然后看是否有结果:
发现命令不会显示
重新运行tun_client.py,在Host U的telnet连接中查看结果:
发现刚才输入的命令重现了。
综上综述,通过执行以上操作,我们完成了Tunnel-Breaking Experiment任务
Task 7: Routing Experiment on Host V
- 进入容器
- 执行如下命令:
ip route del default
- 接着执行如下命令:
- 然后ping 202.108.22.5
- 打开Wireshark,执行得到如下图结果:
综上所述,通过执行以上操作,我们完成了Routing Experiment on Host V任务
Task 8: VPN Between Private Networks
在宿主机/docker 1.1.1.1上执行以下命令:
进入容器,修改tun_server.py:
进入容器,创建文件tun_client.py,执行tun_server.py和tun_client.py,可以相互ping通:
综上所述,通过执行以上操作,我们完成了VPN Between Private Networks任务