Поймал очень странную проблему с соединением по HTTP из JAVA приложения.
Задача: с клиента A необходимо получить ответ на HTTP запрос от веб-сервера Б (10.13.0.69)
Важный момент: сервер Б находится за VPN туннелем, при этом все сетевые правила корректно настроены и клиенту A обеспечен доступ к серверу Б. Это легко проверить тем-же curl'ом:
[root@Test-LAPP01 test]# curl http://10.13.0.69:7878/testGet && echo ""
{"result":["\"AlertServer testGet ok\" "]}
Проблемы начинаются когда я пытаюсь выполнить тот-же самый запрос из java приложения: оно падает с ошибкой
SocketException: Unexpected end of file from server.
Естественно сначала я предположил, что проблема в JAVA коде, но если изменить url например на http://google.com, то приложение отрабатывает нормально.
Ещё интересный момент: если java приложение запускать в одной подсети с сервером Б (т.е. без VPN туннеля), то запрос также отрабатывает без проблем.
В качестве дебага запустил tcpdump на обоих машинах и теперь я смущён ещё больше: я вижу, что пакеты как уходят с клиента A, так и приходят на веб-сервер Б
Непосредственно сама ошибка:
[root@Test-LAPP01 test]# cat contest.java
import java.net.*;
import java.io.*;
public class contest {
public static void main(String[] args) throws Exception {
String url = "http://10.13.0.69:7878/testGet";
try {
URL alert = new URL(url);
HttpURLConnection con = (HttpURLConnection) alert.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "chrome");
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
[root@Test-LAPP01 test]# curl http://10.13.0.69:7878/testGet && echo ""
{"result":["\"AlertServer testGet ok\" "]}
[root@Test-LAPP01 test]# java contest
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at contest.main(contest.java:12)
[root@Test-LAPP01 test]#
tcpdump с клиента: https://dpaste.de/brNW
tcpdump на сервере: https://dpaste.de/1O2b
Кратко суть проблемы: Из JAVA приложения недоступен URL, размещённый за VPN, но доступен с хостового ПК.