我正在研究连接到用户指定的公共服务器的网络客户端程序.如果用户给我一个连接的主机名,它同时具有IPv4和IPv6地址(通常是包含两者A和AAAA记录的DNS名称),我不知道应该如何决定应该连接哪个地址.
问题是,机器支持IPv4和IPv6是很常见的,但只能通过IPv4实现全局连接.最常见的情况是仅配置IPv6链路本地地址.目前我能想出的最佳选择是:
我可以通过选项1看到的问题是连接可能不会立即失败 - 可能需要很长时间才能超时.
我想问一下ipv6网络和主机端的计算.
例如,我有IPv6地址2001:470:1f15:1bcd:34::41和前缀96.
你知道and在IPv6地址和前缀之间做一个简单的方法吗?
根据IPv4:
192.168.1.2 255.255.255.0 network : 192.168.1.0
Run Code Online (Sandbox Code Playgroud)
很简单.
我想对IPv6地址做同样的事情.但IPv6地址是16个字节,所以你不能使用unsigned int它.
有没有API可以做到这一点?或者我应该使用数组?
我用Request.UserHostAddress,只能获取IPv4地址,如何获取访问者的IPv6地址?
速率限制对于保护登录系统失败尝试或限制每个IP的客户端资源使用情况作为反滥用措施非常有用.它对IPv4地址也非常有效,因为只有拥有数千个强僵尸网络的人才能够绕过它足够长的时间来造成损害.
你如何在IPv6中实现这一目标?据我所知,现在专用主机为您提供了/ 64个块,大约是18个quintillion地址.住宅ISP怎么样?是否存在IPv6部署中使用的最小和/或最大块大小?甚至可以在IPv6中采用有效的速率限制方案吗?
Debian Wheezy(perl 5.14)
工作很好:
use LWP::Simple;
print get( 'http://ip6-localhost:80' );
Run Code Online (Sandbox Code Playgroud)
不工作(1)
use LWP::Simple;
print get( 'http://[::1]:80' );
Run Code Online (Sandbox Code Playgroud)
不工作(2)[返回:错误的主机名 ]
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
Run Code Online (Sandbox Code Playgroud)
不工作(3)[返回:连接被拒绝 ]
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
Run Code Online (Sandbox Code Playgroud)
为什么我需要它?因为ldirectord需要它.:(任何建议?
我在PHP中面临$ _SERVER ['REMOTE_ADDR']的问题即使服务器使用IPv4,它也会提供类似IPv6的值.
任何人都可以帮我解决这个问题.
我正在尝试在两个Android设备之间创建IPv6 TCP连接.但是,创建套接字总是失败.
如果我像这样实例化它:
Inet6Address dest = (Inet6Address) InetAddress.getByName(addressString);
Socket socket = new Socket(dest, portNumber);
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EINVAL (Invalid argument)
Run Code Online (Sandbox Code Playgroud)
如果我改为实例化我的IPv6Address对象,如下所示:
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface wifiInterface = null;
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
if (networkInterface.getDisplayName().equals("wlan0") || networkInterface.getDisplayName().equals("eth0")) {
wifiInterface = networkInterface;
break;
}
}
Inet6Address dest = Inet6Address.getByAddress(null, addressBytes, wifiInterface );
Socket socket = new Socket(dest, portNumber);
Run Code Online (Sandbox Code Playgroud)
我在调用Socket构造函数时遇到此错误:
java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EADDRNOTAVAIL …Run Code Online (Sandbox Code Playgroud) 我正在为数据库中的网络的各个方面建模.我们正在处理的一个更烦人的问题是创建子网范围,然后确定给定的IP集合是否在这些范围内.我们当前的模型通过以下列说明了IPv4和IPv6之间的差异:
[subnet_sk] [int] IDENTITY(1,1) NOT NULL,
[ipv6_network] [char](39) NULL,
[ipv6_broadcast] [char](39) NULL,
[ipv4_network] [char](15) NULL,
[ipv4_broadcast] [char](15) NULL,
[network_type] [char](4) NOT NULL
Run Code Online (Sandbox Code Playgroud)
上面的模式做了一些重要的假设,这些假设很重要.我们正在利用完全扩展的IP(192.168.001.001vs. 192.168.1.1)进行存储和比较.我们做出这个决定是因为围绕在SQL服务器中以数字方式存储IPv6地址的问题(bigints是无符号的,这意味着我们必须使用六列来表示IPv6).
给定此表模式,可以很容易地编写一个select语句来确定任一类型的IP是否在表中的范围之间:
select *
from subnet
where '1234:0000:0000:0000:fc12:00ab:0042:1050'
between ipv6_network
and ipv6_broadcast
-- or alternatively for IPv4
select *
from subnet
where '192.168.005.015'
between ipv4_network
and ipv4_broadcast
Run Code Online (Sandbox Code Playgroud)
更为困难的是,IP列表确定哪些IP位于子网范围之间.IP列表将由用户输入提供,不存储在数据库中.显然,对于存储在数据库中的数据,我可以进行类似的连接,如下例所示.
例如,用户可以提供1234:0000:0000:0000:fc12:00ab:0042:1050,192.168.001.001和192.168.1.1.我提出的唯一解决方案是使用表值函数来拆分 IP 列表并使用以下之间执行连接:
-- this only covers the IPv4 addresses from the …Run Code Online (Sandbox Code Playgroud) 我有一些仅限IPv6的主机.我可以通过curl成功执行curl请求
$ curl -I my.ip.v6.only.host
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
但是当我试图从java获取它时我有一个错误:
HttpGet httpget = new HttpGet("http://my.ip.v6.only.host");
CloseableHttpResponse response = httpclient.execute(httpget);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
INFO: I/O exception (java.net.NoRouteToHostException) caught when processing request to {}->http://my.ip.v6.only.host: No route to host
Mar 17, 2015 7:42:23 PM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->http://my.ip.v6.only.host
java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at …Run Code Online (Sandbox Code Playgroud) 我正在使用Ubuntu 18.04.1 Nginx 1.14.0和HTTP2以及PHP 7.2.7建立一个新服务器.这是我尝试在启用IPv4和IPv6时设置的第一台服务器.一切正常,直到我测试了一个包含大量缺失图像的页面.服务器似乎需要永远意识到它们丢失并响应http请求.一些丢失的文件的HTTP状态为"502 bad gateway".是DNS问题导致这些延迟和502错误,我应该在设置中更改什么?
编辑:这里可能有很多不必要的信息,但由于目前尚不清楚为什么服务器反应太慢,其中一些可能很重要.
PHP脚本应该不是问题,我的旧服务器,具有完全相同的页面,加载非常快.
区域文件包含IPv4和IPv6的记录.
编辑:下面的整个DNS理论可能不是原因,请参阅:为什么这个nginx服务器重定向到错误的域?. The server redirects to a wrong domain. When forcing the nginx server only to listen to IPv4 and surfing to server1.eu there's a SSL certificate mismatch (only valid for server2.eu) and after forcing accept the certificate there's a 301 redirect to server2.eu Now, when I remove the server "server2.eu" from sites-enabled and reload nginx, the SSL certificate mismatch and redirect doesn't happen. With server "server2.eu" removed from …