我想要实现的是在我的 OpenBSD 机器上访问一个有 IPv6 的网站,而我没有。为此,我使用了 Tunnel Broker,并且我可以使用其 IPv6 地址成功 ssh 进入 OpenBSD 机器。
这台机器的 8080 端口上运行着一个 Web 应用,我想从我的机器(使用 Tunnel Broker)访问它。OpenBSD 机器位于调制解调器/路由器后面,但我允许所有来自 Tunnel Broker 提供给我的 IPv6 的连接。
因此,我猜我的问题与 OpenBSD 防火墙有关...我尝试了许多不同的规则,但都没有奏效。这是我尝试的最后一个:
pass in proto tcp from any to nfe0 port 8080
每次我都会pfctl -nvf /etc/pf.conf
重新加载规则。为了测试连接,我这样做:
$ curl -6 http://[ipv6]:8080
curl: (7) Failed to connect to ... port 8080: Connection refused
我可以毫无问题地 ping 通机器...如能得到任何帮助我将非常感激:)。
我使用 OpenBSD 6.0,我的机器运行的是 macOS Sierra。
编辑
我用 Java 创建了一个非常简单的 HTTP 服务器,尝试监听 [::1]:8080,但出现以下错误:
$ java -Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Addresses=true SimpleServer ::1
Exception in thread "main" java.net.SocketException: Protocol family unavailable
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at SimpleServer.main(SimpleServer.java:13)
(当我尝试将 Tomcat 绑定到 ::1 时,我遇到了同样的错误)。我的代码:
public class SimpleHTTPServer {
public static void main(String args[]) throws Exception {
try (ServerSocket serverSocket = new ServerSocket(8080, 10, Inet6Address.getByName(args[0]))) {
String line;
String content = "Hello World!";
String response = "HTTP/1.0 200 OK\nContent-Type: text/plain\nContent-Length: " + content.length() + "\n\n" + content;
while (true) {
Socket socket = serverSocket.accept();
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeBytes(response);
}
}
}
}
编辑2
即使使用 with_ipv6 风格进行编译,OpenBSD 上的 JDK 和 IPv6 似乎也存在问题...目前,我正在使用 replyd(8) 将所有 IPv6 数据包传递到我的服务器正在监听的内部 IPv4 地址。
编辑3
该问题应该已在最新的 jdk 端口版本中得到修复。
答案1
该问题已修复。
消除 with_ipv6 FLAVOR。ipv6 现在将默认包含在主包中。但是 ipv4 将继续作为包中的默认地址系列。要启用 ipv6(并在此过程中禁用 ipv4),请参阅包自述文件。
自述:
ipv4 to ipv6 address mapping is disabled on OpenBSD. This means the
jdk can only use ipv4 addresses or ipv6 addresses but not both at
the same time. By default ipv4 addresses are enabled. To use ipv6
addresses set the following properties when you start java:
-Djava.net.preferIPv4Stack=false
-Djava.net.preferIPv6Stack=true
-Djava.net.preferIPv6Addresses=true