IPv6|IPv6 初体验 -- over MacOS

最近开始听很多朋友说 IPv6 已经逐渐普及了,经过这十几二十年的发展。于是我也蠢蠢欲动,尝试在自己的老笔记本上运行一个 IPv6 服务。
首先介绍一下我家的网络情况:联通宽带的光猫,因为信号太差,连了一个 TP-Link 的路由器。宽带是提供了 IPv6 的,在路由器配置里选择开启 IPv6。笔记本是 Macbook-pro,手持一台 iphone,两者连接同一个 WiFi。
我在 iphone 上安装了一个叫 Net Analyzer 的应用,免费的,可以看 IP 地址信息,发起 ping 请求,挺好用的。从这个应用里我看到手机从 WiFi 获取到的 IP 地址(以下皆指v6地址)是 2048 开头。
IPv6|IPv6 初体验 -- over MacOS
文章图片

【IPv6|IPv6 初体验 -- over MacOS】在笔记本上,通过 ifconfig 命令可以查到我在 en0 下有一个同样以 2048 开头的 IP 地址:

inet6 2408:..:..:..:..:..:..:.. prefixlen 64 autoconf secured// 安全起见,省略掉具体地址

推测出这两个地址应该是同属与一个路由。prefixlen 64 表示 IP 地址的前 64bits 是路由给的前缀,autoconf 表示这个地址是自动配置的, secured 表示这个地址是通过密码学手段生成的(可能是采用 CGA,但我暂时找不到更多信息)。
接下来我决定用 python 在笔记本上建立一个简单的 HTTP 服务:
import socket from BaseHTTPServer import HTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandlerclass MyHandler(SimpleHTTPRequestHandler): def do_GET(self): if self.path == '/ip': self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write('Your IP address is %s' % self.client_address[0]) return else: return SimpleHTTPRequestHandler.do_GET(self)class HTTPServerV6(HTTPServer): address_family = socket.AF_INET6def main(): server = HTTPServerV6(('::', 8080), MyHandler) server.serve_forever()if __name__ == '__main__': main()

代码来自 https://gist.github.com/akoro... 。
将代码保存到一个文件,执行 python [文件名],即可在 8080 端口启动简易的Http服务器。
接下来在手机上访问我们笔记本的 IP 地址,从浏览器访问时需要对格式做一些修改:
http://[2048:..:..:..:..:..:..:..]:8080

访问成功!
附录 尽管我从网上找到了一些资料,证明 Apple 实现了 CGA(cryptographically generated addresses) 地址的生成,但是我找不到如何获取对应的私钥,所以没办法做其它的事情。
All Apple operating systems support IPv6, implementing several mechanisms to protect the privacy of users and the stability of the networking stack. When Stateless Address Autoconfiguration (SLAAC) is used, the IPv6 addresses of all interfaces are generated in a way that helps prevent tracking devices across networks and at the same time allows for a good user experience by ensuring address stability when no network changes take place. The address generation algorithm is based on cryptographically generated addresses as of RFC 3972, enhanced by an interface-specific modifier to warrant that even different interfaces on the same network eventually have different addresses.
我试着将 IP 地址配置从自动模式改为手动,可以正常使用。但 ifconfig 里的 secured 标签也就随之消失了。

    推荐阅读