Pythonv1.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. # -*- coding: utf-8 -*-
  2. # ==============================================================================
  3. # PROXY MULTIFILAMENTADO PROFESIONAL - VERSIÓN ULTRA-ROBUSTA (PYTHON 3)
  4. # ==============================================================================
  5. #screen -dmS badvpn2 /bin/badvpn-udpgw --listen-addr 127.0.0.1:7300 --max-clients 1000 --max-connections-for-client 100
  6. #screen -dmS pydic-80 python3 /root/Pythonv1.py 8080
  7. import socket
  8. import threading
  9. import select
  10. import sys
  11. import time
  12. import logging
  13. import logging.handlers
  14. import itertools
  15. # --- CONFIGURACIÓN DE RED ---
  16. IPV4_ADDR = '0.0.0.0'
  17. IPV6_ADDR = '::'
  18. LISTENING_PORT = int(sys.argv[1]) if sys.argv[1:] else 8080
  19. DEFAULT_HOST = '127.0.0.1:223'
  20. # --- CONFIGURACIÓN DE SEGURIDAD AVANZADA ---
  21. MAX_CONNECTIONS = 1000
  22. CONNECTION_COOLDOWN = 0.5
  23. TIMEOUT = 60
  24. BUFLEN = 16384
  25. # 🛡️ LISTA BLANCA DE IPs (Si está vacía, permite todas)
  26. # Ejemplo: ALLOWED_IPS = ['127.0.0.1', '192.168.1.50']
  27. ALLOWED_IPS = []
  28. # 🚫 LISTA NEGRA DE DOMINIOS (Bloquea conexiones a estos hosts)
  29. BLOCKED_HOSTS = ['sitio-prohibido.com', 'anuncios.malware.net']
  30. # 📑 ENCABEZADOS A INYECTAR (Se añaden a la comunicación con el destino)
  31. CUSTOM_HEADERS = {
  32. "X-Proxy-Agent": "Gemini-Ultra-Robust-v3",
  33. "X-Forwarded-For-Proxy": "True"
  34. }
  35. # --- MENSAJES ROTATIVOS ---
  36. MENSAJES = [
  37. "Pfsense",
  38. "OPNsense",
  39. "VyOS",
  40. "Claro",
  41. "Windows Server",
  42. "BSD Free",
  43. "VyOS",
  44. "Altice",
  45. "Viva",
  46. "Google",
  47. "VyOS",
  48. "TNSR"
  49. ]
  50. mensaje_cycle = itertools.cycle(MENSAJES)
  51. cycle_lock = threading.Lock()
  52. # --- SISTEMA DE LOGS ---
  53. LOG_FILE = 'proxy_avanzado.log'
  54. def setup_logger():
  55. logger = logging.getLogger("ProxyAvanzado")
  56. logger.setLevel(logging.INFO)
  57. formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
  58. handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=10*1024*1024, backupCount=5)
  59. handler.setFormatter(formatter)
  60. console = logging.StreamHandler()
  61. console.setFormatter(formatter)
  62. logger.addHandler(handler)
  63. logger.addHandler(console)
  64. return logger
  65. log = setup_logger()
  66. conn_limit = threading.Semaphore(MAX_CONNECTIONS)
  67. ip_history = {}
  68. ip_lock = threading.Lock()
  69. class ConnectionHandler(threading.Thread):
  70. def __init__(self, client_socket, addr):
  71. super().__init__(daemon=True)
  72. self.client = client_socket
  73. self.addr = addr
  74. self.target = None
  75. self.log_id = "{}:{}".format(addr[0], addr[1])
  76. def finish(self):
  77. for s in [self.client, self.target]:
  78. if s:
  79. try: s.close()
  80. except: pass
  81. conn_limit.release()
  82. def is_ip_allowed(self, ip):
  83. if not ALLOWED_IPS: return True
  84. return ip in ALLOWED_IPS
  85. def is_host_blocked(self, target_str):
  86. host = target_str.split(':')[0].lower()
  87. return host in BLOCKED_HOSTS
  88. def run(self):
  89. try:
  90. # Validar IP en lista blanca
  91. if not self.is_ip_allowed(self.addr[0]):
  92. log.warning("[{}] IP no autorizada. Cerrando.".format(self.log_id))
  93. return
  94. data = self.client.recv(BUFLEN)
  95. if not data: return
  96. headers_text = data.decode('latin-1', errors='ignore')
  97. target_info = self.extract_header(headers_text, 'X-Real-Host') or DEFAULT_HOST
  98. # Validar dominio bloqueado
  99. if self.is_host_blocked(target_info):
  100. log.warning("[{}] Intento de acceso a host bloqueado: {}".format(self.log_id, target_info))
  101. self.client.sendall(b"HTTP/1.1 403 Forbidden\r\n\r\n")
  102. return
  103. with cycle_lock:
  104. msg = next(mensaje_cycle)
  105. if not self.connect_to_target(target_info):
  106. log.error("[{}] Error conectando a {}".format(self.log_id, target_info))
  107. return
  108. # Respuesta al cliente
  109. resp = "HTTP/1.1 101 {}\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\r\n".format(msg).encode('utf-8')
  110. self.client.sendall(resp)
  111. log.info("[{}] OK -> {} | Msg: {}".format(self.log_id, target_info, msg))
  112. self.bridge()
  113. except Exception as e:
  114. log.error("[{}] Error: {}".format(self.log_id, e))
  115. finally:
  116. self.finish()
  117. def extract_header(self, text, header_name):
  118. for line in text.split('\r\n'):
  119. if line.lower().startswith(header_name.lower() + ":"):
  120. return line.split(':', 1)[1].strip()
  121. return None
  122. def connect_to_target(self, target_str):
  123. try:
  124. host, port = (target_str.split(':') + [22])[:2]
  125. port = int(port)
  126. infos = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM)
  127. for res in infos:
  128. af, socktype, proto, _, sa = res
  129. try:
  130. self.target = socket.socket(af, socktype, proto)
  131. self.target.settimeout(10)
  132. self.target.connect(sa)
  133. return True
  134. except:
  135. if self.target: self.target.close()
  136. continue
  137. return False
  138. except: return False
  139. def bridge(self):
  140. sockets = [self.client, self.target]
  141. while True:
  142. try:
  143. readable, _, error = select.select(sockets, [], sockets, TIMEOUT)
  144. if error or not readable: break
  145. for s in readable:
  146. other = self.target if s is self.client else self.client
  147. chunk = s.recv(BUFLEN)
  148. if not chunk: return
  149. other.sendall(chunk)
  150. except: break
  151. def main():
  152. listeners = []
  153. for af, addr in [(socket.AF_INET, IPV4_ADDR), (socket.AF_INET6, IPV6_ADDR)]:
  154. try:
  155. s = socket.socket(af, socket.SOCK_STREAM)
  156. s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  157. if af == socket.AF_INET6:
  158. try: s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
  159. except: pass
  160. s.bind((addr, LISTENING_PORT))
  161. s.listen(128)
  162. listeners.append(s)
  163. log.info("Escuchando en {}:{}".format(addr, LISTENING_PORT))
  164. except Exception as e:
  165. log.debug("Interfaz {} ocupada: {}".format(addr, e))
  166. if not listeners:
  167. log.critical("No se pudo iniciar ningun listener.")
  168. return
  169. try:
  170. while True:
  171. r, _, _ = select.select(listeners, [], [])
  172. for s in r:
  173. client, addr = s.accept()
  174. ip = addr[0]
  175. with ip_lock:
  176. now = time.time()
  177. if now - ip_history.get(ip, 0) < CONNECTION_COOLDOWN:
  178. client.close()
  179. continue
  180. ip_history[ip] = now
  181. if not conn_limit.acquire(blocking=False):
  182. client.close()
  183. continue
  184. ConnectionHandler(client, addr).start()
  185. except KeyboardInterrupt:
  186. log.info("Servidor detenido.")
  187. finally:
  188. for s in listeners: s.close()
  189. if __name__ == "__main__":
  190. main()