我使用多种语言和一些平台开发应用程序.从我正在阅读的内容来看,IPv6将在未来5到10年内成为主流,并且一些ISP甚至提供与IPv6互联网的直接连接.在我的专用网络上,所有计算机都具有双栈连接,并在可能的情况下使用IPv6进行相互通信.
我的问题是:我的新应用程序是否应该支持IPv6?如果是这样,我需要考虑哪些事情?现在支持IPv6有什么缺点吗?
我不知道这是否会有所帮助或伤害,但这里有一些更具体的细节可能会指出一些答案:
我的应用程序将在Windows/Linux/Mac上运行,它将包含为每个平台单独编写的特定于平台的组件,以及以解释语言编写的通用"核心"组件.
我的应用程序应该能够找到在三个平台中的任何一个上运行的自身的其他实例,并且支持任何两台机器之间的TCP和UDP.
My local header /usr/include/linux/if_ether.h has the following define:
#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
Run Code Online (Sandbox Code Playgroud)
What is bluebook? I've never heard this term, and a cursory internet search didn't reveal anything related to network programming.
我需要从网络命名空间访问外部 IPv6 地址。
在我的主机中,我设置了一个 SIT 隧道 (IPv6-in-IPv4),它对 IPv6 数据包进行隧道传输并通过默认接口 (eth0) 发送它。SIT 隧道依赖于 Hurricane Electric 隧道代理服务。我可以从主机 ping 外部 IPv6 地址。
$ ping6 ipv6.google.com
PING ipv6.google.com(lis01s13-in-x0e.1e100.net) 56 data bytes
64 bytes from lis01s13-in-x0e.1e100.net: icmp_seq=1 ttl=57 time=98.1 ms
64 bytes from lis01s13-in-x0e.1e100.net: icmp_seq=2 ttl=57 time=98.7 ms
Run Code Online (Sandbox Code Playgroud)
以下是有关隧道的一些详细信息:
$ ip -6 route sh
2001:470:1f14:10be::/64 dev he-ipv6 proto kernel metric 256
default dev he-ipv6 metric 1024
Run Code Online (Sandbox Code Playgroud)
有趣的部分来了。由于超出此问题范围的原因,我需要从网络命名空间内执行相同的操作(ping ipv6.google.com)。
以下是我创建和设置网络命名空间的方法:
ns1.sh
#!/bin/bash
set -x
if [[ $EUID -ne 0 ]]; then
echo "You must run this …Run Code Online (Sandbox Code Playgroud) 来自 node.js 我可以这样做来告诉 node.js 使用 ipv6 和 ipv4 发出请求
var http = require("http");
var options = {
hostname: "google.com",
family: 4, // set to 6 for ipv6
};
var req = http.request(options, function(res) {
.. handle result here ..
});
req.write("");
req.end();
Run Code Online (Sandbox Code Playgroud)
设置family为4强制 ipv4,将其设置为6强制 ipv6。不设置它可以让任何一个工作。
我如何在 C# (.NET 3.5) 中做同样的事情
我可以想到一种方法,即自己为 A 或 AAAA 记录发出 DNS 请求,发出直接 IP 请求并设置host:标头。有没有更好的办法?
我有maxmind的ipv6数据。这是我当前的表(带有示例数据):
+---------------+------------+
| network | geoname_id |
+---------------+------------+
| 2001:208::/32 | 123 |
| 2001:218::/32 | 4312 |
+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
使用他们的转换器,我可以创建一个network_start_ip和network_last_ip列:
+------------------+----------------------------------------+------------+
| network_start_ip | network_last_ip | geoname_id |
+------------------+----------------------------------------+------------+
| 2001:200:: | 2001:200:ffff:ffff:ffff:ffff:ffff:ffff | 123 |
| 2001:208:: | 2001:208:ffff:ffff:ffff:ffff:ffff:ffff | 4312 |
+------------------+----------------------------------------+------------+
Run Code Online (Sandbox Code Playgroud)
我期待这样的事情会起作用(尽管它可能比其他方法慢):
SELECT b.geoname_id FROM blocks b
WHERE HEX(INET6_ATON('2001:201:ffff:ffff:ffff:ffff:ffff:ffff')) BETWEEN HEX(b.network_start_ip) AND HEX(b.network_last_ip)
Run Code Online (Sandbox Code Playgroud)
那么,我错过了什么?另外,存储 ipv6 地址(范围)的最佳方式是什么
谢谢
如果我有一个地址10.3.3.2,将它映射到 v6 将导致 0:0:0:0:0:ffff:a03:302。我可以 ping 10.3.3.2,但是 ping 0:0:0:0:0:ffff:a03:302 会出现“No route to host”错误。现在,我无法从我的网络中 ping 任何 IPv6 地址,因此预计会出现错误。
我很好奇
ping6 0:0:0:0:0:ffff:a03:302
如果 IPv6 流量完美无缺。
我无法让 zmq 服务器和客户端与 IPv6 进行通信,而它可以通过 C++ 轻松地与 IPv4 配合使用。
这是我的 ip a 显示的:
2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 1c:1b:0d:0c:d7:bc brd ff:ff:ff:ff:ff:ff
inet 192.168.35.208/24 brd 192.168.35.255 scope global dynamic enp0s31f6
valid_lft 7193sec preferred_lft 7193sec
inet6 fe80::fb7:c6df:9d3a:3d7b/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
服务器:
zmq::context_t context(1);
zmq::socket_t server (context, ZMQ_REP);
server.setsockopt( ZMQ_IPV6, 1);
server.bind("tcp://*:5555%enp0s31f6");
Run Code Online (Sandbox Code Playgroud)
客户:
zmq::context_t context(1);
zmq::socket_t client (context, ZMQ_REQ);
client.setsockopt( ZMQ_IPV6, 1);
client.connect("tcp://[fe80::fb7:c6df:9d3a:3d7b]:5555%enp0s31f6");
Run Code Online (Sandbox Code Playgroud)
服务器等待监听,客户端发送消息,服务器永远不会收到它。IPv4 运行良好。
怎么了?
我使用 Lambda 和 API Gateway 来构建 API。而且,我了解到 AWS CloudFront 支持 IPv6。我想使用自定义域,并根据 API 网关的要求使用 ACM 创建了证书。
但是,当我使用http://ready.chair6.net测试是否找到 CloudFront URL 的 AAAA 记录时,未找到 AAAA 记录。
许多博客文章假设 CloudFront 分发设置是可访问的。但是,当我们使用 API Gateway 创建 CloudFront 分配时,您无法更改分配的设置 - 不能从控制台更改。
如何为 API 网关启用 IPv6?
我已为我的私有子网分配了仅出口互联网网关。现在我可以连接 IPV6 网站,但不能连接 IPV4 地址。
我是否需要 NAT 网关才能从我的 EC2 计算机访问 IPV4 地址?(仅限传出流量)
ipv6 ×10
ipv4 ×2
networking ×2
amazon-ec2 ×1
architecture ×1
azure ×1
c# ×1
dns ×1
ethernet ×1
firewall ×1
linux-kernel ×1
mariadb ×1
mysql ×1
zeromq ×1