SonDanmbi 发表于 2020-4-11 22:49

python实现tcp daili服务

本帖最后由 SonDanmbi 于 2020-4-11 22:53 编辑

好久没发帖了
问题场景:服务器A的IP能连数据库,应用放在服务器A上,但是开发调试在本地,本地无法直接连接数据库,需要在服务器A上挂个daili
用python弄了个tcp daili,源代码是在网上东拼西凑找的,但是不能用,改了改基本实现了我需要的功能,试用了下感觉没啥问题了分享给大家




import select
import socket
from concurrent.futures import ThreadPoolExecutor

BUFFER_SIZE = 2 ** 12


def ip_to_tuple(ip):
    ip, port = ip.split(':')
    return ip, int(port)


def process(s_src, _s_dst):
    print('_s_dst==', _s_dst, type(_s_dst))
    s_dst = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s_dst.connect(_s_dst)
    try:
      while True:
            s_read, _, _ = select.select(, s_dst], [], [])
            for s in s_read:
                data = s.recv(BUFFER_SIZE)
                if not data:
                  break
                if s == s_src:
                  s_dst.sendall(data)
                elif s == s_dst:
                  s_src.sendall(data)
    except Exception as e:
      print('e==', e)
    try:
      s_dst.shutdown(socket.SHUT_RDWR)
      s_dst.close()
    except Exception as e_s_dst:
      print('e_s_dst==', e_s_dst)
    try:
      s_src.shutdown(socket.SHUT_RDWR)
      s_src.close()
    except Exception as e_s_src:
      print('e_s_src==', e_s_src)
    pass


def tcp_proxy(src, dst):
    print('Starting TCP proxy...')
    print('Src: %s' % src)
    print('Dst: %s' % dst)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(ip_to_tuple(src))
    s.listen(5)
    pool = ThreadPoolExecutor(128)
    while 1:
      s_src, _s_dst = s.accept()
      print('s_src==', s_src)
      print('_s_dst==', _s_dst)
      pool.submit(process, s_src, ip_to_tuple(dst))
      # process(s_src, ip_to_tuple(dst))

if __name__ == '__main__':
    #效果:访问127.0.0.1:11011 相当于访问127.0.0.1:3306,可用于数据库限制连接IP的情况,在能连数据库的服务器上运行这个脚本即可
    tcp_proxy('127.0.0.1:11011', '127.0.0.1:3306')

whh19921024 发表于 2020-4-12 16:26

楼主可以用ssh隧道。比这个方便多了

games 发表于 2020-4-12 21:06

本帖最后由 games 于 2020-4-12 21:20 编辑

端口转发,ssh隧道都行
转发TCP
将本地6789端口穿透到公网的9876端口中,使用命令:#可以自行设置公网端口,这里默认6789,如果你要转发SSH端口,那就改成你的SSH端口ssh -p 3333 -R 9876:localhost:6789 moerats.com

三滑稽甲苯 发表于 2020-4-12 21:53

虽然目前用不到,但还是收藏备用:handshake
页: [1]
查看完整版本: python实现tcp daili服务