我们的一个Java程序启动时,它只监听IPv6(8080)
e.g。
# netstat -ntpl
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::8080 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
问题是它无法从外部访问(localhost除外),为了解决这个问题,我手动添加
-Djava.net.preferIPv4Stack=true
但这使得该程序仅适用于IPv4网络。
是否可以像上面那样执行 sshd ,同时支持IPv4和IPv6?
答案 0 :(得分:21)
我怀疑它不像操作系统网络堆栈/操作系统网络配置问题那样是Java编程问题:
http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html
在某些操作系统上,单个本机TCP套接字可以侦听两者上的端口 IPv4和IPv6同时进行。它能够接受来自的连接 远程IPv4和远程IPv6客户端。在其他操作系统(如WinXP)上 操作系统原生套接字不能这样做,但只能接受来自IPv4或 IPv6,而不是两者。在这些操作系统上,有两个必须听 套接字,以便能够接受来自远程IPv4的连接 和IPv6客户端,一个用于侦听IPv4连接的套接字和一个用于侦听IPv4连接 的IPv6。
Windows 7和Windows Server 2008处理双栈很好; Windows XP并非如此:)
你似乎在Linux上 - 大多数现代Linux桌面和服务器也可以处理双ipv4 ipv6而没有任何问题。
这是一篇关于互操作性的好文章:
您知道如何为您的Java应用程序“关闭”IPV6:-Djava.net.preferIPv4Stack=true
您还可以强制您的服务器使用IPV6,如下所示:echo 0 > /proc/sys/net/ipv6/bindv6only
这可以说是你最好的来源:
除非受到外部网络问题的限制,否则你绝对应该能够完成你想要的任务(至少在Java编程层面):
Nodes) V4 Only V4/V6 V6 Only
------- ----- -------
V4 Only x x
V4/V6 x x x
V6 Only x x
PS:
这是一个更好的链接,它解释了套接字级别发生的事情。它不是Java(它是C),但完全适用于样本原则: