![Как получить доступ к Jetty Server из-за пределов локальной сети?](https://rvso.com/image/770109/%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20Jetty%20Server%20%D0%B8%D0%B7-%D0%B7%D0%B0%20%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2%20%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D1%81%D0%B5%D1%82%D0%B8%3F.png)
Первоначально я разместил этот вопрос на stackoveflow, но мне посоветовали, что он больше подойдет для этого сайта.
Я пытаюсь получить доступ к Jetty Server, развернутому на одной машине, с другой машины за пределами локальной сети, но это не работает. Я прочиталэта темаи последовал совету, предложенному@Йоаким Эрдфельтоднако это не сработало. Мой код ниже:
Server server = new Server();
// HTTP connector
ServerConnector serverConnector = new ServerConnector(server, 1, 1);
serverConnector.setHost("0.0.0.0"); <-
serverConnector.setPort(8080);
serverConnector.setIdleTimeout(30000);
// Set the connector
server.addConnector(serverConnector);
Я попробовал получить доступ к серверу с другого удаленного сервера с помощью следующего кода:
String postUrl = "http://" + myIP + ":8080"; // myIP is set to the public IP address of Jetty Server
System.out.println("Post URL: " + postUrl);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(120 * 1000).build();
try (CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();) {
HttpPost httpPostRequest = new HttpPost(postUrl);
...
Однако это приводит к следующему исключению:
HttpPostConnectException: Connect to 123.4.56.78:8080.. failed: Connection refused: connect
Что вызывает эту ошибку? Я разрешил доступ к брандмауэру, когда он был запрошен, поэтому я не думаю, что это проблема брандмауэра. Порт 8080
также не используется для других процессов. Я пробовал несколько портов, но безрезультатно.
Спасибо
решение1
Я перенесу некоторые из своих рекомендаций в ответ. Вам не хватает базовых знаний о сетях, пожалуйста, попробуйте немного почитать об этом (здесьнапример). Некоторые основы:
- Локальные IP-адреса (сети 192.168.xx, 10.xxx и т. д.) недоступны из Интернета, из Интернета доступен только тот прибор, который напрямую подключен к вашему интернет-провайдеру (ваш домашний маршрутизатор).
- когда вы подключены к домашнему маршрутизатору и просматриваете интернет, происходит несколько вещей: поскольку ваш локальный IP недоступен из интернета, ваш домашний маршрутизатор скрывает ваш локальный IP и заменяет его вашим публичным IP. После этого маршрутизатор учитывает соединение, чтобы иметь возможность обработать ответ. Когда приходит ответ, тот же процесс выполняется в обратном порядке: если маршрутизатор находит соответствующее соединение в своей таблице для входящего пакета, публичный IP заменяется вашим частным IP, и ответ пересылается на правильное устройство внутри вашей сети. Этот процесс называетсяНАТ(трансляция сетевых адресов)
- NAT — это защита для ваших устройств внутри вашей домашней сети (ваши устройства могут подключаться к Интернету, но Интернет не может подключаться к вашим устройствам!), но это также усложняет задачу, если вы хотите, чтобы устройство из вашей домашней сети было доступно из Интернета. Это связано с тем, что ваш маршрутизатор должен знать, что с каждым входящим пакетом данных делать. И по умолчанию: если ни одно устройство внутри вашей домашней сети не открыло это соединение, входящий пакет данных отбрасывается!
Теперь должно быть понятно, почему у вас несколько IP: Google видит только ваш публичный IP. Для того, чтобы ваш сервер jetty был доступен из интернета, вам нужноПеренаправление порта. По сути, вы создадите правило внутри вашего домашнего маршрутизатора.пересылать каждый TCP-пакет, полученный через порт 8080, на внутреннее устройство XY". Вам нужно будет проверить руководство по вашему маршрутизатору, чтобы узнать, как это сделать, большинство маршрутизаторов имеют веб-интерфейс для настройки. Надеюсь, это прояснит ваше недоумение...