11.4 流量转换
Windows中的IPv6支持两类IPv6到IPv4的流量过渡技术。
NAT64/ DNS64。
PortProxy(端口代理)。
11.4.1 NAT 64/DNS64
NAT64定义在RFC 6146中。当纯IPv6节点发起流量时,NAT64可以在IPv6和IPv4流量之间提供状态化转换。NAT64会从纯IPv6节点中获得IPv6流量,并将其转换给可以发送给IPv4节点的IPv4流量,反之亦然。这种地址转换采取的工作方式类似于传统IPv4网络的地址转换(NAT)。如果进一步了解IPv4 NAT设备转换的工作方式,请参见本书的第14章。
NAT64的作用通常是让纯IPv6节点能够访问纯IPv4计算机。例如,一台基于Windows Server 2012的DirectAccess服务器可以使用NAT64让DirectAccess客户端(从本质上讲,该客户端就是一台通过DirectAccess连接发送信息的纯IPv6节点)访问内联网中那些只能通过IPv4进行访问的服务器和资源。如需进一步了解相关信息,请参见本书的第18章。
DNS64定义在RFC 6147中,它是一种将纯IPv6地址记录(AAAA)DNS查询消息映射为IPv4地址记录(A)查询消息的方式,因此它能够实现纯IPv6节点和纯IPv4节点之间的通信。当一台纯IPv6节点发送DNS查询消息来查询某个域名的IPv6地址时,DNS64会在这个过程中充当中间设备。它可以将AAAA域名查询变为一个A域名查询和一个AAAA域名查询,并将这两条查询消息发送给一台内联网DNS服务器。如果只收到了A记录,那么它就会将解析出来的IPv4地址表达为IPv6地址,并将它返回给请求方的客户端设备。然后,客户端设备就可以尝试使用这个IPv6地址来发起通信了,而这个通信的过程会由NAT64进行转换。
将NAT64和DNS64结合起来使用,可以让纯IPv6节点向纯IPv4节点发起通信,而无需对纯IPv6节点和纯IPv4节点本身进行任何改变。DNS64会将一个纯IPv4计算机的查询域名映射为一个IPv6地址。NAT64会将去往该IPv6地址的IPv6流量转换为去往一个IPv4地址的IPv4流量。注意,DNS64和NAT64组件必须具有相同的IPv6地址空间转换规则,才能正常工作。不过,它们并没有任何共享状态,而且也可以部署在不同的计算机上。
在Windows Server 2012中,管理员可以使用Windows PowerShell命令中的命令New-NetNatTransitionConfiguration、Set-NetNatTransition Configuration和Remove-NetNatTransit ion Configuration来配置NAT64组件,同样可以使用命令New-NetDnsTransitionConfiguration、 Set-NetDnsTransitionConfiguration和Remove-NetDnsTransitionConfiguration来配置DNS64组件。如需进一步了解相关信息,请参阅本书的第16章。
注释
在默认情况下,NAT64和DNS64不允许纯IPv4节点向纯IPv6 节点发起通信。例如,对于一台运行Windows Server 2012和Windows 8的DirectAccess服务器不允许一台内联网中的纯IPv4计算机(比如一台管理服务器)向DirectAccess客户端发起通信。此外,也不能在DNS64中使用DNSSEC(DNS安全扩展)。
11.4.2 端口代理
为了让无法使用普通互联网层协议(IPv4或IPv6)建立连接的节点或应用之间能够进行通信,Windows的IPv6协议提供了“端口代理(PortProxy)”,这个组件可以代理下列流量。
- IPv4到IPv4:将去往一个IPv4地址的TCP流量代理为另一个IPv4地址的流量。
- IPv4到IPv6:将去往一个IPv4地址的TCP流量代理为某个IPv6地址的流量。
- IPv6到IPv6:将去往一个IPv6地址的TCP流量代理为另一个IPv6地址的流量。
- IPv6到IPv4:将去往一个IPv6地址的TCP流量代理为某个IPv4地址的流量。
IPv6最需要且最有用的代理是从IPv4到IPv6和从IPv6到IPv4的代理,它们能实现下述方案。
- 纯IPv4节点可以直接访问纯IPv6节点:在纯IPv4节点的IPv4 DNS架构中,纯IPv6节点的域名会解析为分配给端口代理计算机某个接口的IPv4地址。这可能需要在DNS中手动配置一个A记录。当将端口代理计算机配置为代理IPv4到IPv6时,所有由纯IPv4节点发送的TCP流量都会用一种类似于Internet代理服务器的方式进行代理:纯IPv4节点与端口代理计算机建立一个TCP连接,然后端口代理计算机再与纯IPv6节点建立另一条连接。端口代理计算机在纯IPv4节点和纯IPv6节点之间传输TCP连接数据。
- 纯IPv6节点可以访问纯IPv4节点:在纯IPv6节点的IPv6 DNS架构中,纯IPv4节点的域名会解析为分配给端口代理计算机某个接口的IPv6地址。这可能需要在DNS中手动配置一个AAAA记录。当端口代理计算机配置为代理IPv6到IPv4时,端口代理则代理会在纯IPv6节点和纯IPv4节点之间(通过转换)发送流量。
- IPv6节点可以访问在IPv6/IPv4节点上运行的纯IPv4节点:在纯IPv6节点的IPv6 DNS架构中,IPv6/IPv4节点的域名会解析为分配给端口代理计算机的某个接口的IPv6地址。当端口代理计算机配置为代理IPv6到IPv4时,端口代理会代理在纯IPv6节点和端口代理计算机上运行的纯IPv4服务或程序之间发送的流量。
可以用netsh interface portproxy add|set|delete v4tov4|v4tov6|v6tov4|v6tov6命令来配置端口代理组件。
netsh interface portproxy add v6tov4命令的语法如下。
netsh interface portproxy add v6tov4 [listenport=]LPortNumber|LportName [[connectaddress=] IPv4Address|IPv4HostName] [[connectport=]CPortNumber|CPortName] [[listenaddress=]IPv6Address |IPv6HostName]
- LPortNumber|LportName是端口代理侦听的TCP端口号或服务的名称。
- IPv6Address|IPv6HostName是端口代理侦听的IPv6地址或主机名称(如果未指定,就假定是所有分配给端口代理计算机的IPv6地址)。
- CPortNumber|CPortName是端口代理试图连接的TCP端口号或服务名称(如果未指定,就会将连接端口设为侦听端口)。
- IPv4Address|IPv4HostName是端口代理试图连接的IPv4地址或主机名称(如果未指定,就假定为loopback地址)。
netsh interface portproxy add v4tov6命令的语法如下。
netsh interface portproxy add v4tov6 [listenport=]LPortNumber|LportName [[connectaddress=]IPv6Address |IPv6HostName] [[connectport=]CPortNumber|CPortName] [[listenaddress=]IPv4Address|IPv4HostName]
LPortNumber|LportName是端口代理侦听的TCP端口号或服务名称。
- IPv4Address|IPv4HostName是端口代理侦听的IPv4地址或主机名称(如果未指定,就假定是所有分配给端口代理计算机的IPv4地址)。
- CPortNumber|CPortName是端口代理试图连接的TCP端口号或服务名称(如果未指定,就会将连接端口设为侦听端口)。
- IPv6Address|IPv6HostName是端口代理试图连接的IPv6地址或主机名称(如果未指定,就假定为loopback地址)。
注释
端口代理只能用于TCP流量,以及没有在TCP连接数据中内嵌地址或端口信息的应用层协议。与NAT不同,端口代理没有类似NAT编辑器的东西。因此,有些协议无法通过端口代理计算机运行(如FTP),因为该协议在使用FTP端口命令时内嵌了IPv4地址。