#!/usr/bin/env python3 import socket import threading import argparse BUF = 4096 def pipe(a, b): def forward(src, dst): try: while True: data = src.recv(BUF) if not data: break dst.sendall(data) except: pass finally: try: src.close() except: pass try: dst.close() except: pass threading.Thread(target=forward, args=(a, b), daemon=True).start() threading.Thread(target=forward, args=(b, a), daemon=True).start() def main(): p = argparse.ArgumentParser() p.add_argument("--listen", default="0.0.0.0") p.add_argument("--listen_port", type=int, default=7777) p.add_argument("--target_host", default="homehosted.net") p.add_argument("--target_port", type=int, default=1234) args = p.parse_args() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((args.listen, args.listen_port)) s.listen(5) while True: c, addr = s.accept() t = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: t.connect((args.target_host, args.target_port)) except Exception as e: print("Target connect error:", e) c.close() continue pipe(c, t) if __name__ == "__main__": main()