vpn_proxy.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /*
  2. * =====================================================================================
  3. * PROXY VPN v6 TLS - EDICION PERSONALIZADA (NATIVA EN C)
  4. * Compilación en Ubuntu 24.04: gcc -o vpn_proxy vpn_proxy.c -lssl -lcrypto -lpthread
  5. * =====================================================================================
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include <arpa/inet.h>
  12. #include <sys/socket.h>
  13. #include <sys/select.h>
  14. #include <sys/time.h>
  15. #include <pthread.h>
  16. #include <openssl/ssl.h>
  17. #include <openssl/err.h>
  18. #include <time.h>
  19. #include <fcntl.h>
  20. // --- CONFIGURACIÓN BASE ---
  21. #define DEFAULT_PORT 443
  22. #define SSH_HOST "127.0.0.1"
  23. #define SSH_PORT 22
  24. #define CERT_FILE "/root/cert.pem"
  25. #define KEY_FILE "/root/key.pem"
  26. #define LOG_FILE "/root/proxy-ssl-c.log"
  27. // --- SEGURIDAD Y LIMITES ---
  28. #define MAX_CONNECTIONS 200
  29. #define BUFLEN 16384
  30. #define BAN_TIME 3600
  31. #define AUTO_BAN_STRIKES 3
  32. #define COOLDOWN_SEC 1
  33. // --- FAKE WEB RESPONSE (400 OK) ---
  34. const char *FAKE_WEB_RESPONSE =
  35. "HTTP/1.1 400 OK\r\n"
  36. "Server: nginx/1.21.0\r\n"
  37. "Content-Type: text/html; charset=UTF-8\r\n"
  38. "Connection: close\r\n\r\n"
  39. "<!DOCTYPE html>\n<html>\n<head><title>Error</title></head>\n"
  40. "<body style='text-align:center; padding:50px; font-family:sans-serif;'>\n"
  41. "<h1>Hola</h1>\n<p>400 Bad Request</p>\n"
  42. "</body>\n</html>\n";
  43. // --- MENSAJES ROTATIVOS ---
  44. const char *MENSAJES[] = {
  45. "🚀 CONEXION TLS ESTABLECIDA", "🛡️ CIFRADO MILITAR ACTIVO", "Pfsense", "OPNsense", "VyOS", "Claro"
  46. };
  47. #define NUM_MENSAJES (sizeof(MENSAJES) / sizeof(MENSAJES[0]))
  48. int mensaje_idx = 0;
  49. pthread_mutex_t msg_mutex = PTHREAD_MUTEX_INITIALIZER;
  50. // --- ESTADO GLOBAL ---
  51. int active_connections = 0;
  52. pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER;
  53. pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
  54. // Estructura para pasar datos al hilo
  55. typedef struct {
  56. int client_fd;
  57. struct sockaddr_in addr;
  58. SSL_CTX *ssl_ctx;
  59. } client_data_t;
  60. // --- FUNCIONES DE SOPORTE ---
  61. void write_log(const char *ip, const char *msg) {
  62. pthread_mutex_lock(&log_mutex);
  63. FILE *f = fopen(LOG_FILE, "a");
  64. if (f) {
  65. time_t now = time(NULL);
  66. struct tm *t = localtime(&now);
  67. char time_str[64];
  68. strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", t);
  69. fprintf(f, "[%s] [%s] %s\n", time_str, ip ? ip : "SISTEMA", msg);
  70. printf("[%s] [%s] %s\n", time_str, ip ? ip : "SISTEMA", msg);
  71. fclose(f);
  72. }
  73. pthread_mutex_unlock(&log_mutex);
  74. }
  75. SSL_CTX *create_context() {
  76. const SSL_METHOD *method = TLS_server_method();
  77. SSL_CTX *ctx = SSL_CTX_new(method);
  78. if (!ctx) {
  79. perror("No se pudo crear el contexto SSL");
  80. ERR_print_errors_fp(stderr);
  81. exit(EXIT_FAILURE);
  82. }
  83. return ctx;
  84. }
  85. void configure_context(SSL_CTX *ctx) {
  86. if (SSL_CTX_use_certificate_file(ctx, CERT_FILE, SSL_FILETYPE_PEM) <= 0) {
  87. ERR_print_errors_fp(stderr);
  88. exit(EXIT_FAILURE);
  89. }
  90. if (SSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, SSL_FILETYPE_PEM) <= 0 ) {
  91. ERR_print_errors_fp(stderr);
  92. exit(EXIT_FAILURE);
  93. }
  94. }
  95. // --- HILO DE CONEXIÓN (HANDLER) ---
  96. void *connection_handler(void *arg) {
  97. client_data_t *data = (client_data_t *)arg;
  98. int client_sock = data->client_fd;
  99. SSL_CTX *ctx = data->ssl_ctx;
  100. char client_ip[INET_ADDRSTRLEN];
  101. inet_ntop(AF_INET, &(data->addr.sin_addr), client_ip, INET_ADDRSTRLEN);
  102. free(data); // Liberar la memoria de la estructura
  103. SSL *ssl = SSL_new(ctx);
  104. SSL_set_fd(ssl, client_sock);
  105. if (SSL_accept(ssl) <= 0) {
  106. // Fallo en el Handshake SSL (Probablemente un escáner no-TLS)
  107. SSL_free(ssl);
  108. close(client_sock);
  109. pthread_mutex_lock(&conn_mutex); active_connections--; pthread_mutex_unlock(&conn_mutex);
  110. pthread_exit(NULL);
  111. }
  112. // Configurar timeout de lectura inicial (3 segundos)
  113. struct timeval tv;
  114. tv.tv_sec = 3; tv.tv_usec = 0;
  115. setsockopt(client_sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  116. char buffer[BUFLEN];
  117. int bytes_read = SSL_read(ssl, buffer, sizeof(buffer) - 1);
  118. int target_sock = -1;
  119. if (bytes_read > 0) {
  120. buffer[bytes_read] = '\0';
  121. // Conectar al destino SSH local
  122. struct sockaddr_in target_addr;
  123. target_sock = socket(AF_INET, SOCK_STREAM, 0);
  124. target_addr.sin_family = AF_INET;
  125. target_addr.sin_port = htons(SSH_PORT);
  126. inet_pton(AF_INET, SSH_HOST, &target_addr.sin_addr);
  127. if (connect(target_sock, (struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
  128. write_log(client_ip, "❌ Error conectando a SSH local");
  129. goto cleanup;
  130. }
  131. if (strncmp(buffer, "SSH-", 4) == 0) {
  132. write_log(client_ip, "✅ Túnel (Modo SSH Directo)");
  133. send(target_sock, buffer, bytes_read, 0);
  134. } else if (strstr(buffer, "HTTP/") != NULL && strstr(buffer, "Upgrade: websocket") == NULL) {
  135. write_log(client_ip, "🕵️ Escáner detectado. Respondiendo 400 OK Fake Web.");
  136. SSL_write(ssl, FAKE_WEB_RESPONSE, strlen(FAKE_WEB_RESPONSE));
  137. goto cleanup;
  138. } else {
  139. // Modo Websocket / Inyector HTTP
  140. pthread_mutex_lock(&msg_mutex);
  141. const char *status_msg = MENSAJES[mensaje_idx];
  142. mensaje_idx = (mensaje_idx + 1) % NUM_MENSAJES;
  143. pthread_mutex_unlock(&msg_mutex);
  144. char response[1024];
  145. snprintf(response, sizeof(response),
  146. "HTTP/1.1 101 %s\r\n"
  147. "Server: nginx/1.21.0\r\n"
  148. "X-Proxy-Agent: Gemini-Ultra-Robust-C-Native\r\n"
  149. "Connection: Upgrade\r\n"
  150. "Upgrade: websocket\r\n\r\n", status_msg);
  151. SSL_write(ssl, response, strlen(response));
  152. char log_msg[256];
  153. snprintf(log_msg, sizeof(log_msg), "✅ Túnel (Modo WebSocket HTTP): %s", status_msg);
  154. write_log(client_ip, log_msg);
  155. // Si el payload tiene más datos después de las cabeceras HTTP, enviarlos
  156. // (En este proxy simplificado, asumimos que el handshake viene limpio)
  157. }
  158. } else {
  159. // Conexión vacía (Modo Stunnel Silencioso)
  160. struct sockaddr_in target_addr;
  161. target_sock = socket(AF_INET, SOCK_STREAM, 0);
  162. target_addr.sin_family = AF_INET;
  163. target_addr.sin_port = htons(SSH_PORT);
  164. inet_pton(AF_INET, SSH_HOST, &target_addr.sin_addr);
  165. if (connect(target_sock, (struct sockaddr *)&target_addr, sizeof(target_addr)) == 0) {
  166. write_log(client_ip, "✅ Túnel (Modo Stunnel Silencioso)");
  167. } else {
  168. goto cleanup;
  169. }
  170. }
  171. // --- BUCLE DEL TÚNEL (I/O MULTIPLEXING) ---
  172. tv.tv_sec = 0; // Quitar timeout para el túnel
  173. setsockopt(client_sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  174. int max_fd = (client_sock > target_sock) ? client_sock : target_sock;
  175. long tx_bytes = 0, rx_bytes = 0;
  176. while (1) {
  177. fd_set readfds;
  178. FD_ZERO(&readfds);
  179. FD_SET(client_sock, &readfds);
  180. FD_SET(target_sock, &readfds);
  181. struct timeval select_tv;
  182. select_tv.tv_sec = 300; // 5 minutos de inactividad máxima
  183. select_tv.tv_usec = 0;
  184. // Validar si OpenSSL tiene datos pendientes en memoria desencriptada
  185. int pending = SSL_pending(ssl);
  186. if (pending == 0) {
  187. int activity = select(max_fd + 1, &readfds, NULL, NULL, &select_tv);
  188. if (activity <= 0) break; // Error o Timeout
  189. }
  190. // Datos del Cliente (SSL) -> SSH
  191. if (pending > 0 || FD_ISSET(client_sock, &readfds)) {
  192. int bytes = SSL_read(ssl, buffer, sizeof(buffer));
  193. if (bytes <= 0) break;
  194. send(target_sock, buffer, bytes, 0);
  195. rx_bytes += bytes;
  196. }
  197. // Datos del SSH -> Cliente (SSL)
  198. if (FD_ISSET(target_sock, &readfds)) {
  199. int bytes = recv(target_sock, buffer, sizeof(buffer), 0);
  200. if (bytes <= 0) break;
  201. SSL_write(ssl, buffer, bytes);
  202. tx_bytes += bytes;
  203. }
  204. }
  205. double total_mb = (double)(tx_bytes + rx_bytes) / (1024.0 * 1024.0);
  206. if (total_mb > 0.05) {
  207. char log_close[256];
  208. snprintf(log_close, sizeof(log_close), "[*] Cierre de sesión. Tráfico: %.2f MB", total_mb);
  209. write_log(client_ip, log_close);
  210. }
  211. cleanup:
  212. if (target_sock != -1) close(target_sock);
  213. SSL_shutdown(ssl);
  214. SSL_free(ssl);
  215. close(client_sock);
  216. pthread_mutex_lock(&conn_mutex);
  217. active_connections--;
  218. pthread_mutex_unlock(&conn_mutex);
  219. pthread_exit(NULL);
  220. }
  221. // --- BUCLE PRINCIPAL ---
  222. int main(int argc, char **argv) {
  223. int port = DEFAULT_PORT;
  224. if (argc > 1) port = atoi(argv[1]);
  225. // Inicializar OpenSSL
  226. SSL_load_error_strings();
  227. OpenSSL_add_ssl_algorithms();
  228. SSL_CTX *ctx = create_context();
  229. configure_context(ctx);
  230. int server_sock = socket(AF_INET, SOCK_STREAM, 0);
  231. int opt = 1;
  232. setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  233. struct sockaddr_in server_addr;
  234. server_addr.sin_family = AF_INET;
  235. server_addr.sin_addr.s_addr = INADDR_ANY;
  236. server_addr.sin_port = htons(port);
  237. if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
  238. perror("Fallo el Bind");
  239. exit(EXIT_FAILURE);
  240. }
  241. if (listen(server_sock, 600) < 0) {
  242. perror("Fallo el Listen");
  243. exit(EXIT_FAILURE);
  244. }
  245. write_log(NULL, "=====================================================");
  246. char init_msg[256];
  247. snprintf(init_msg, sizeof(init_msg), "🚀 Servidor v6 TLS en NATIVO (C) - Puerto %d", port);
  248. write_log(NULL, init_msg);
  249. write_log(NULL, "🛡️ Máximo Rendimiento | Anti-Probing: 400 OK");
  250. write_log(NULL, "=====================================================");
  251. while (1) {
  252. struct sockaddr_in client_addr;
  253. socklen_t addr_len = sizeof(client_addr);
  254. int client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &addr_len);
  255. if (client_sock < 0) continue;
  256. pthread_mutex_lock(&conn_mutex);
  257. if (active_connections >= MAX_CONNECTIONS) {
  258. pthread_mutex_unlock(&conn_mutex);
  259. close(client_sock);
  260. continue;
  261. }
  262. active_connections++;
  263. pthread_mutex_unlock(&conn_mutex);
  264. // Crear datos para el hilo
  265. client_data_t *data = malloc(sizeof(client_data_t));
  266. data->client_fd = client_sock;
  267. data->addr = client_addr;
  268. data->ssl_ctx = ctx;
  269. // Desplegar Hilo
  270. pthread_t thread_id;
  271. pthread_attr_t attr;
  272. pthread_attr_init(&attr);
  273. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // Auto-limpieza del hilo al terminar
  274. if (pthread_create(&thread_id, &attr, connection_handler, (void *)data) != 0) {
  275. write_log(NULL, "Error creando hilo. Cerrando socket.");
  276. close(client_sock);
  277. free(data);
  278. pthread_mutex_lock(&conn_mutex); active_connections--; pthread_mutex_unlock(&conn_mutex);
  279. }
  280. pthread_attr_destroy(&attr);
  281. }
  282. close(server_sock);
  283. SSL_CTX_free(ctx);
  284. EVP_cleanup();
  285. return 0;
  286. }