Прокси-сервер не работает с VPN в AndroidJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Прокси-сервер не работает с VPN в Android

Сообщение Anonymous »

Я пытаюсь создать прокси-сервер в Android, который я могу использовать для совместного использования моего VPN-соединения с другими устройствами, подключенными к той же сети. Таким образом, одно устройство имеет VPN-соединение, а другие могут подключаться к нему через прокси-сервер и пользоваться Интернетом через VPN.
Я пробовал несколько решений, которые либо работают без VPN, ИЛИ с обоими устройствами, подключенными к VPN. тот же VPN (который убивает вариант использования). Но когда я запускаю VPN на своем устройстве, а затем запускаю прокси-сервер и подключаю дочернее устройство через прокси, обычный интернет-трафик перестает работать. Однако такие приложения, как Whatsapp, по-прежнему могут отправлять/принимать звонки и сообщения, но обычный просмотр Chrome или YouTube и Instagram не работают на прокси-клиентском устройстве.
Я знаю, что это возможно. это более старая, теперь устаревшая версия моего приложения, предоставляющая эту функциональность, и в настоящее время каждое прокси-приложение предоставляет эту функциональность, но для ограниченного числа VPN. Вот почему мне нужно сделать это для моего собственного VPN на основе Wireguard, поскольку он не работает с приложением Every Proxy.
В своем коде я пытаюсь создать прозрачный HTTP-прокси с помощью Connect. Туннель, которому не нужны никакие сертификаты и который не перехватывает/блокирует трафик.
В настоящее время мой код следующий:
public class ConnectProxy {
private final int port;
private volatile boolean isRunning = false;
private Thread serverThread;

public ConnectProxy(int port) {
this.port = port;
}

public synchronized void start() {
if (isRunning) {
log("Server is already running.");
return; // Avoid starting multiple instances
}

isRunning = true;
serverThread = new Thread(() -> {
try (ServerSocket serverSocket = new ServerSocket(port,50, InetAddress.getByName("0.0.0.0"))) {
log("Proxy Server running on port " + port);

while (isRunning) {
try {
Socket clientSocket = serverSocket.accept();
new Thread(() -> handleClient(clientSocket)).start();
} catch (IOException e) {
if (isRunning) {
log("Error accepting client connection: " + e.getMessage());
e.printStackTrace();
}
}
}
} catch (IOException e) {
log("Server error: " + e.getMessage());
e.printStackTrace();
}
});

serverThread.start();
}

public synchronized void stop() {
if (!isRunning) {
log("Server is already stopped.");
return;
}

isRunning = false;
if (serverThread != null && !serverThread.isInterrupted()) {
serverThread.interrupt();
}
log("Proxy Server stopped.");
}

private void handleClient(Socket clientSocket) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
OutputStream clientOut = clientSocket.getOutputStream()) {

String requestLine = reader.readLine();
if (requestLine == null || !requestLine.startsWith("CONNECT")) {
clientOut.write("HTTP/1.1 400 Bad Request\r\n\r\n".getBytes());
log("Invalid request from client.");
return;
}

String[] parts = requestLine.split(" ");
String[] hostPort = parts[1].split(":");
String host = hostPort[0];
int port = Integer.parseInt(hostPort[1]);

log("Connection request for: " + host + ":" + port);

try (Socket targetSocket = new Socket(host, port)) {
clientOut.write("HTTP/1.1 200 Connection Established\r\n\r\n".getBytes());
clientOut.flush();

InputStream targetIn = targetSocket.getInputStream();
OutputStream targetOut = targetSocket.getOutputStream();

DataTracker tracker = new DataTracker();

Thread clientToServer = new Thread(() -> {
try {
relayData(clientSocket.getInputStream(), targetOut, tracker, true);
} catch (IOException e) {
log("Error relaying client to server data: " + e.getMessage());
e.printStackTrace();
}
});
Thread serverToClient = new Thread(() -> {
try {
relayData(targetIn, clientOut, tracker, false);
} catch (Exception e) {
log("Error relaying server to client data: " + e.getMessage());
e.printStackTrace();
}
});

clientToServer.start();
serverToClient.start();

clientToServer.join();
serverToClient.join();

log(String.format("Data for %s:%d - Uploaded: %.2f KB, Downloaded: %.2f KB",
host, port, tracker.uploaded / 1024.0, tracker.downloaded / 1024.0));
} catch (IOException | InterruptedException e) {
log("Error handling connection to: " + host + ":" + port + " - " + e.getMessage());
e.printStackTrace();
}
} catch (IOException e) {
log("Error handling client: " + e.getMessage());
e.printStackTrace();
}
}

private void relayData(InputStream input, OutputStream output, DataTracker tracker, boolean isUpload) {
try {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
output.flush();

if (isUpload) {
tracker.uploaded += bytesRead;
} else {
tracker.downloaded += bytesRead;
}
}
} catch (IOException e) {
log("Connection closed during data relay: " + e.getMessage());
}
}

private void log(String message) {
String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println("[" + timestamp + "] " + message);
}

private static class DataTracker {
long uploaded = 0;
long downloaded = 0;
}

public static void main(String[] args) {
ConnectProxy proxy = new ConnectProxy(8888);
proxy.start();

Runtime.getRuntime().addShutdownHook(new Thread(proxy::stop));
}
}



Подробнее здесь: https://stackoverflow.com/questions/792 ... in-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»