我有一个 ipv4 服务器,它只接受通过本地主机的连接(使用INADDR_LOOPBACK)。我想将此服务器转换为双栈 ipv6/ipv4。但是,使用in6addr_loopback仅接受到 的连接::1。
我发现我可以使用同时接受 ipv4 和 ipv6 连接in6addr_any,但是因为这也允许来自任何地方的连接,所以它对我的特定情况没有用处。
是否可以同时绑定到 ipv6 localhost ( ::1) 和 ipv4 localhost ( 127.0.0.1) ?
我可以使用 Jersey Client 连接到使用 IPv6 的 REST 资源吗?
我收到此错误:
com.sun.jersey.api.client.ClientHandlerException: java.net.MalformedURLException: For input string: ":94ea:d2bc:c189:209c%10:8100"
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:128)
at com.sun.jersey.api.client.Client.handle(Client.java:551)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:556)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:69)
at com.sun.jersey.api.client.WebResource$Builder.put(WebResource.java:475)
at com.bmc.aps.agent.jersey.JerseyClient.put(JerseyClient.java:168)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.net.MalformedURLException: For input string: ":94ea:d2bc:c189:209c%10:8100"
at java.net.URL.<init>(URL.java:601)
at java.net.URL.<init>(URL.java:464)
at java.net.URL.<init>(URL.java:413)
at java.net.URI.toURL(URI.java:1081)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:139)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:126)
... 8 more
Run Code Online (Sandbox Code Playgroud)
在例外情况下,ip 被切断(:94ea:d2bc:c189:209c%10而不是fe80::94ea:d2bc:c189:209c%10)。在调试中,我可以看到 Web 资源 URI 正常。
我正在开发一个使用 Google API(自定义搜索引擎)的 Ruby 应用程序。它与公共 API 访问密钥配合得很好。
我刚刚将互联网升级到 Uverse,突然 Google API 停止工作。我发现问题出在IP地址上。我的 Uverse 调制解调器使用 IPv6。
不幸的是,Google Developer Public API 访问密钥似乎只接受 IPv4 地址,因此当我尝试添加 IPv6 地址时,我收到错误消息:“IP 地址无效”。
有人能够让它发挥作用吗?如果可以避免的话,我宁愿不实现 oAuth。
我目前正在一个基于 PHP 的项目中使用 IPv4 和 IPv6 地址,并且我需要能够比较两个 IP 以确定哪一个数字更大。例如,192.168.1.9 大于 192.168.1.1。为了做到这一点,我使用inet_pton和unpack将 IP 转换为二进制字符串(我熟悉ip2long,但它仅限于 IPv4)。
这种方法一开始似乎工作正常,但我很快发现,当我将任何以 .32 结尾的 IP 与较低的 IP 地址进行比较时,我得到的结果不正确。例如,如果我将 192.168.1.0 与 192.168.1.32 进行比较,我的脚本会告诉我 192.168.1.0 大于 192.168.1.32。仅当其中一个 IP 以 0.32 结尾时才会发生这种情况。IP 的前三个八位字节可以更改,结果是相同的。
以下 PHP 代码生成一个说明此问题的页面:
// Loop through every possible last octet, starting with zero
for ($i = 0; $i <= 255; $i++) {
// Define two IPs, with second IP increasing on each loop by 1
$IP1 = "192.168.1.0";
$IP2 = "192.168.1.".$i; …Run Code Online (Sandbox Code Playgroud) 所以我一直在开发一个连接到另一台机器上的 postgresql 服务器的 Web 应用程序。一切正常。
然后我将 Web 应用程序部署到运行 postgresql 服务器的同一台计算机上,并收到一条错误消息:
FATAL: 28000: no pg_hba.conf entry for host "fe80::ccee:154f:18f5:418f%11", user "myuser", database "mydb", SSL off
Run Code Online (Sandbox Code Playgroud)
我的 pg_hba-conf 已经有这一行:
# IPv6 local connections:
host all all ::1/128 md5
Run Code Online (Sandbox Code Playgroud)
那应该是 ipv6 的环回地址,对吗?
我可以通过添加这一行来修复它(纯粹猜测):
#host all all fe80::/16 md5
Run Code Online (Sandbox Code Playgroud)
我怀疑这可以让每个人都连接起来吗?
那么问题是为什么要使用 ipv6 而不是 ipv4?
为什么环回不起作用?
我正在尝试通过 C Linux 中的 RAW 套接字发送自定义 IPv6 标头。
我已经使用 IP_HDRINCL 套接字选项在 IPv4 中取得了成功,但是,IPv6 没有等效的选项。
我在这里找到了一个解决方法,建议使用socket(AF_INET6, SOCK_RAW, IPPROTO_RAW)与启用 IP_HDRINCL 套接字选项具有相同的效果。套接字已成功创建,并且在使用带有修改后的标头的函数
之前我不会收到任何错误。sendto
我这样设置套接字:
static int socketFd = 0;
static struct sockaddr_in6 remote;
int main()
{
socketFd = socket (PF_INET6, SOCK_RAW, IPPROTO_RAW);
if (socketFd < 0)
{
printf ("An error ocurred while creating the socket.\n");
exit (2);
}
remote.sin6_family = AF_INET6;
remote.sin6_port = htons (25000);
if (inet_pton (AF_INET6, "fd00:c0de::70d6:4ab9:115d:8cda", &(remote.sin6_addr)) != 1)
{
close (socketFd);
printf ("Unable to …Run Code Online (Sandbox Code Playgroud) 我遇到了一些关于在 Android 上以编程方式获取IPv4 和 IPv6 地址的讨论。这些其他问题和答案的问题是:
有没有人可以告诉我如何在没有冗长方法的情况下以简短而整洁的方式完成它(如果可能的话)?
我有一个 Docker 服务容器暴露于*:8080.
localhost:8080. Chrome /curl无限期挂断。127.0.0.1这让我很困惑,因为在我的hosts文件中,localhost重定向到127.0.0.1.
为什么会这样?它是否以某种方式与 IPv4/IPv6 双栈相关?
我在 PopOS(基于 Ubuntu)上,启用了 Docker Swarm。我正在使用这个测试堆栈文件,traefik.docker-compose.yml:
version: '3'
services:
reverse-proxy:
image: traefik # The official Traefik docker image
command: --api --docker # Enables the web UI and tells Traefik to listen to docker
ports:
- "80:80" # The HTTP port
- "8080:8080" # The Web UI (enabled by --api)
volumes:
- /var/run/docker.sock:/var/run/docker.sock # …Run Code Online (Sandbox Code Playgroud) 据我了解,IPv6地址是按块分配的。每台机器都会获得一个 IPv6 地址范围,该范围内的任何 IPv6 地址都将指向它。
这一假设的基础: https ://stackoverflow.com/a/15266701/681671
/64 是前缀长度。地址中的位数是固定的。因此 /64 表示 128 位 IPv6 地址的前 64 位是固定的。其余位(本例中为 64 位)很灵活,您可以使用所有这些位。这意味着当您的 ISP 为您提供 /64 时,他们会为您提供 264 个地址(即 18,446,744,073,709,551,616 个地址)。
编辑:我使用 Wireshark 确认发送到该 /64 范围内任何 IP 的数据包确实会路由到我的服务器。
ifconfig从输出中查看这一行
inet6 2a01:2e8:d2c:e24c::1 prefixlen 64 scopeid 0x0<global>
Run Code Online (Sandbox Code Playgroud)
我的结论是所有带前缀的 IPv6 地址都2a01:2e8:d2c:e24c将指向我的机器。
但是我无法将任何服务绑定到除 IPv6 地址之外的任何服务
2a01:2e8:d2c:e24c:0000:0000:0000:0001
nc -l 2a01:2e8:d2c:e24c:0000:0000:0000:0002 80不起作用
nc -l 2a01:2e8:d2c:e24c:0000:0000:0001:0001 80不起作用
nc -l 2a01:2e8:d2c:e24c:1000:0000:0000:0001 80不起作用
nc -l 2a01:2e8:d2c:e24c:0000:0000:0000:0001 80 只有这个有效
nc -l <IP> <PORT>在指定的 IP 和端口上打开一个简单的 TCP …
注意:我在这里广泛查看了一个类似(但不重复)的问题:GetAddrInfo cannot resolve ipv6.google.com (but nslookup can)。这个问题已有 9 年历史,OP 没有遇到与我完全相同的行为,并且已经接受的答案并没有解决我的问题——事实上,我特意遵循了那个答案的建议,但在样本中没有用下面的代码,我得到的错误与那个问题不同。此外,我仅仅通过评论就成功地让任何人参与到一个古老的问题中的可能性为零。这与我今天遇到的问题不同,所以我创建了一个新的、更详细的问题。
我有一台运行 Visual Studio 2017 的 Windows 10 机器和一台运行 Visual Studio 2019 的 Windows Server 2016 机器。两台机器都配置了 IPv4 和 IPv6 地址。在两台机器上,nslookup.exe返回三个不同域的预期结果:
> nslookup www.google.com
...
Addresses: 2607:f8b0:4002:80a::2004
172.217.3.228
...
> nslookup ipv4.google.com
...
Addresses: 74.125.136.102
...
> nslookup ipv6.google.com
...
Addresses: 2607:f8b0:4002:812::200e
...
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编写一个示例程序,用于GetAddrInfo查找这三个相同的域:
#include <iostream>
#include <sstream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"WS2_32.Lib")
int main(int argc, char* argv[])
{
WORD wVersionRequested = MAKEWORD(2, 2); …Run Code Online (Sandbox Code Playgroud) ipv6 ×10
ipv4 ×3
docker ×2
networking ×2
android ×1
api ×1
c ×1
c++ ×1
docker-swarm ×1
getaddrinfo ×1
google-api ×1
inet ×1
java ×1
jersey ×1
linux ×1
npgsql ×1
php ×1
postgresql ×1
raw-sockets ×1
rest ×1
sendto ×1
ubuntu ×1
visual-c++ ×1
windows ×1