今天终于完全地把aftr给搞定了。
刚开始的时候,建了三台机器,甲,乙,丙,甲和乙通过ipv6相连,甲的ipv6地址为2001:0:0:1::2/64,乙的ipv6地址为2001:0:0:1::1/64,乙和丙通过ipv4相连,乙的ipv4地址为219.243.40.40/24,丙的地址为219.243.40.35/24。如上所述,已经在丙上面建立了一个http服务器。
在甲上面配置好隧道,端点为2001:0:0:1::2和2001::1,隧道的地址为10.0.1.24,然后在乙上面运行aftr,./aftr -g。aftr是ISC的一个软件,有兴趣可以看看www.isc.org/software/aftr。然后在甲上面访问丙上面的http服务器,http://219.243.40.35。
刚开始的时候,是使用ping 219.243.40.35,可以检测到发过去的包被转发的,可能看到转发回来的包,但是ping程序没有任何响应,不知道怎么回事,以为是对icmp的支持不好,后来选择了通过web来连接,发送tcp协议的报文,才发现所有被转发的文件都是错误的,校验码不对。我非常奇怪,然后看了看转发后的包和原来的包,发现都短了4个byte,我非常奇怪,怎么是4个byte,然后我看了看aftr.c发现在给ipv6封装头部的时候,使用的len是原来的len,但是后来又加入了一个gre头部,改过来之后,tcp能够被正确转发了。
但是突然发现了另外一个问题,就是发送完了第一个http get命令之后,后面的包全部收不到,而且从乙机器上面检测到ipv6的碎片,我突然非常慌,难道是linux不支持ipv6的分片?晚上睡觉都在想解决的办法。
还好,今天我看了看linux发现里面有一个reassembly.c的文件,上面定义了对ipv6分片的重组。然后看到Makefile文件里面写的是已经把它集成到ipv6的内核模块里面去了,所以觉得应该是aftr里面的分片写得有问题。终于写好,从甲访问丙上面的http服务器完全没有问题,可以给交差了。
有时间介绍介绍Ds-lite场景的配置,使用linux自带的ipip6隧道和aftr.c。