Skip to content

Instantly share code, notes, and snippets.

@snower
Created August 19, 2021 14:14
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save snower/f2852ea703b2ddffbec48b0fa294ffff to your computer and use it in GitHub Desktop.
Save snower/f2852ea703b2ddffbec48b0fa294ffff to your computer and use it in GitHub Desktop.
tcp2proxys
# -*- coding: utf-8 -*-
# 2021/8/19
# create by: snower
import argparse
import logging
import sevent
from sevent.helpers import tcp2proxy
class Argument(object):
def __init__(self, bind, port, timeout, proxy_type, proxy_host, forward_host):
self.bind = bind
self.port = port
self.timeout = timeout
self.proxy_type = proxy_type
self.proxy_host = proxy_host
self.forward_host = forward_host
async def run(args):
arguments = [
Argument("0.0.0.0", 9090, args.timeout, "socks5", args.proxy_host, "github.com:443"),
# sudo echo '192.30.255.112 github.com' >> /etc/hosts
# sudo iptables -t nat -A OUTPUT -d 192.30.255.112 -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:9090
Argument("0.0.0.0", 9091, args.timeout, "socks5", args.proxy_host, "raw.githubusercontent.com:443"),
# sudo echo '185.199.109.133 raw.githubusercontent.com' >> /etc/hosts
# sudo iptables -t nat -A OUTPUT -d 185.199.109.133 -p tcp --dport 443 -j DNAT --to-destination 127.0.0.1:9091
]
for argument in arguments:
server = sevent.tcp.Server()
server.enable_reuseaddr()
server.listen((argument.bind, argument.port))
sevent.current().call_async(tcp2proxy.tcp_accept, server, argument)
logging.info("listen server at %s:%d to %s", argument.bind, argument.port, argument.forward_host)
await sevent.Future()
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)1.1s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', filemode='a+')
tcp2proxy.config_signal()
parser = argparse.ArgumentParser(description='forword tcp ports to remote hosts from http or socks5 proxy')
parser.add_argument('-P', dest='proxy_host', default="127.0.0.1:8088",
help='proxy host, accept format [proxy_host:proxy_port] (default: 127.0.0.1:8088)')
parser.add_argument('-t', dest='timeout', default=7200, type=int, help='no read/write timeout (default: 7200)')
args = parser.parse_args()
try:
sevent.run(run, args)
except KeyboardInterrupt:
exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment