背景
去年11月底,欧洲信息网络中心宣布,他们最后一个/22段的IPv4地址也已经分配出去了,宣告了他们获取的IPv4地址段正式耗尽。
这意味着IPv6离我们越来越近了,那么我们要怎么先体验一下IPv6呢?
如果你的宽带运营商直接支持IPv6并且给了你一个双栈的路由器,那恭喜你,你的电脑开机就能拿到IPv6地址了。
但是如果只有IPv4地址要怎么体验IPv6网络呢?NAT64技术来帮你。
NAT64网关
NAT64技术就是把IPv6数据翻译成IPv4数据的技术,如果想知道更多可以翻我之前的文章。
今天主要是教教大家如何通过我的NAT64网关体验IPv6网络。网络拓扑如下图所示,需要一个nat64的路由,这里其实是一个虚拟机。它一端接路由器的IPv4网络,能够正常上网,另一段接一个vlan网络,这个vlan网络就是一个IPv6网络。在这个vlan网络的主机将能够自动获取IPv6地址和网关以及DNS,并且通过NAT64网关访问互联网!
配置NAT64网关
我把我的NAT64网关程序打包成了一个docker镜像,所以运行只需要docker就可以。
下面是一个简单的配置文件:
$ cat config.yml
device: "tun0"
#mtu: 1500
buffer_size: 10000
nat_timeout: 30
post_cmd:
- "ifconfig tun0 up"
- "ip -6 addr add 2019::1/64 dev ens160"
- "ip -6 route add 2017::/96 dev tun0"
- "ip route add 10.0.0.0/24 dev tun0"
- "iptables -t nat -F"
- "iptables -t nat -A POSTROUTING -j MASQUERADE"
clat:
enable: false
src: "2018::/96"
dst: "2019::/96"
plat:
enable: true
src:
- "10.0.0.5-10.0.0.6"
dst: "2017::/96"
ra:
enable: true
interface: "ens160"
prefixes: ["2019::/64"]
rdnss: "2019::1"
dns64:
enable: true
forwarders: ["114.114.114.114"]
prefix: "2017::/96"
api:
enable: true
dhcp6:
enable: true
interface: "ens160"
dns:
- "2019::1"
我来简单说一下相关的配置项:
- plat: 是指有状态的NAT64翻译技术,会把目标地址是“2017::/96”这个网段的数据包,做一个源地址转换(NAT64),变成成“10.0.0.5-10.0.0.6”这个网段的IPv4地址。
- ra:管理地址下发,需要指定下发的端口,这里是连接到IPv6 vlan网络的ens160。下发的IPv6地址段为“2019::/64",也就是连到IPv6网络的主机都会拿到一个2019开头的地址。rdnss是IPv6网络的dns服务器,也就是我的NAT64网关。
- dhcp6:主要是给win7用的,win7不支持无状态IPv6获取,所以需要dhcp6来获取dns信息。
- api: 这是debug用的,用来查看目前的映射情况。
- clat:是指无状态的NAT64翻译技术,在这里没有用到。
- post_cmd:是给相关的网卡加上路由,把需要翻译的数据包发往翻译程序管理的tun0设备。
启动NAT64网关
启动命令,这个命令会启动NAT64翻译程序,这个程序会创建一个tun0接口,发往tun0接口的IPv6数据包将会被转换成IPv4数据包。
$ docker run -d --name=nat64 --privileged=true --network=host -v /home/vagrant/config.yml:/etc/xlat/config.yml elynn/nat64:latest
启动完成之后我们看一下网卡信息,多了一块tun0设备。
$ ifconfig
ens33 Link encap:Ethernet HWaddr 00:50:56:89:b5:86
inet addr:172.22.0.158 Bcast:172.22.255.255 Mask:255.255.0.0
inet6 addr: fe80::250:56ff:fe89:b586/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:118787 errors:0 dropped:0 overruns:0 frame:0
TX packets:68624 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:169672800 (169.6 MB) TX bytes:11710930 (11.7 MB)
ens160 Link encap:Ethernet HWaddr 00:50:56:89:45:dc
inet6 addr: 2019::1/64 Scope:Global
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
同时看到2017::/64地址段会被路由到tun0设备,这是因为这个网关的DNS64设备会把所有的IPv4域名都解析成2017开头的地址。
$ ip route
default via 172.22.0.1 dev ens33
10.0.0.0/24 dev tun0 scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.22.0.0/16 dev ens33 proto kernel scope link src 172.22.0.158
$ ip -6 route
2017::/96 dev tun0 metric 1024 pref medium
2019::/64 dev ens160 proto kernel metric 256 linkdown pref medium
fe80::/64 dev ens33 proto kernel metric 256 pref medium
Win10主机测试
启动之后能够自动拿到IPv6地址和DNS信息
来ping一下bilibili
打开bilibili看个视频~
Win7主机测试
启动之后直接能拿到IPv6地址和DNS
来ping一下bilibili
Ubuntu主机测试
这一用了ubuntu16.04,虽然能够获得IPv6地址,但是没有办法拿到DNS信息。要获取DNS信息,还需要安装rdnssd这个软件。
$ apt install rdnssd
安装后之后就能正常连接网络了。
API
只有一个API,主要是为了调试和性能测试用,下图显示了目前NAT64的翻译表。
源代码
写得很潦草,毕竟懒~
https://github.com/lynic/xlat