Я пытаюсь создать прокси-сервер в 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
Прокси-сервер не работает с VPN в Android ⇐ JAVA
Программисты JAVA общаются здесь
1733133824
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));
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79243618/proxy-server-is-not-working-with-vpn-in-android[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия