Reguła PF, otwarcie portu 8080 w OpenBSD z IPv6

0

Chcę uzyskać dostęp do strony internetowej na mojej maszynie OpenBSD, która ma IPv6, a ja nie. W tym celu używam programu Tunnel Broker i mogę pomyślnie ssh do maszyny OpenBSD przy użyciu adresu IPv6.

Aplikacja internetowa jest uruchomiona na tym komputerze na porcie 8080 i chciałbym uzyskać do niej dostęp z mojego komputera (używającego programu Tunnel Broker). Maszyna OpenBSD znajduje się za modemem / routerem, ale zezwalam na wszystkie połączenia pochodzące z IPv6 przekazane mi przez Tunnel Broker.

Dlatego zgaduję, że mój problem dotyczy zapory OpenBSD ... Próbowałem wielu różnych reguł, ale żadna z nich nie działała. Oto ostatni próbowałem:

pass in proto tcp from any to nfe0 port 8080

Za każdym razem używam pfctl -nvf /etc/pf.conf przeładować reguły. Aby przetestować połączenie:

$ curl -6 http://[ipv6]:8080
curl: (7) Failed to connect to ... port 8080: Connection refused

Mogę pingować maszynę bez problemu ... Każda pomoc byłaby bardzo mile widziane :)

Używam OpenBSD 6.0, a mój komputer jest na macOS Sierra.

EDYTOWAĆ

Stworzyłem bardzo prosty serwer HTTP w Javie, który próbuje nasłuchiwać na [:: 1]: 8080, ale pojawia się następujący błąd:

$ 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)

(Otrzymuję ten sam błąd, gdy próbuję powiązać Tomcat z :: 1). Mój kod:

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);
            }
        }
    }
}

EDIT2

Wygląda na to, że istnieje problem z JDK i IPv6 w OpenBSD, nawet gdy jest skompilowany ze smakiem with_ipv6 ... Na razie używam relayd (8) do przekazywania wszystkich pakietów IPv6 na wewnętrzny adres IPv4, do którego mój serwer jest słuchać.

EDIT3

Problem powinien zostać rozwiązany w najnowszej wersji portu jdk.

nyg
źródło
Musisz mieć coś nasłuchującego na porcie 8080. W tej chwili nie.
Michael Hampton
@MichaelHampton Cóż tak, mam aplikację Spring Boot, która nasłuchuje na porcie 8080. Czy to masz na myśli?
nyg
Skąd wiesz, że słucha na porcie 8080? Czy sprawdziłeś?
Michael Hampton
@MichaelHampton Tak, mogę na przykład zrobić curl 127.0.0.1:8080 (z maszyny OpenBSD, używając ssh) i strona została poprawnie zwrócona ...
nyg
Nonono, nie testowałeś połączenia IPv6! Nie nasłuchuje na IPv6. O co pytałeś!
Michael Hampton

Odpowiedzi:

0

Problem został rozwiązany.

http://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/devel/jdk/1.8/pkg/README-main?rev=1.2&content-type=text/x-cvsweb-markup

Eliminiate with_ipv6 FLAVOR. ipv6 zostanie dołączony do pakietu głównego   domyślnie teraz. Jednak ipv4 będzie nadal adresem domyślnym   rodzina w paczce. Aby włączyć IPv6 (i wyłączyć IPv4 w tym procesie),   zobacz pakiet README.

README:

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
nyg
źródło