Files
tcp_port_tran/target_server.py

188 lines
4.5 KiB
Python
Raw Normal View History

import os
import sys
import json
import socket
import threading
2024-10-08 20:29:52 +08:00
import time
import prot_codec as pc
# tcp服务端脚本
# 一个连接远端转发服务器
# 另一个连接本地tcp服务器
# 保存连接代理服务器的端口
_remote_client=None
# 保存本地连接的tcp客户端端口列表
2024-10-08 20:29:52 +08:00
# 这个列表的ip和port地址和target_client.py中的同名变量一一对应
_local_client=[]
# LOCAL_SERVER_IP = ("192.168.3.166",80)
# LOCAL_SERVER_IP = ("192.168.3.167",22)
LOCAL_SERVER_IP = ("10.0.24.251",80)
2024-10-08 20:29:52 +08:00
_log_fp=None
def _time():
return '['+time.strftime("%Y-%m-%d %H:%M:%S")+']'
def myprint_dec(func):
def wrapper(*args, **kwargs):
# 在这里添加额外的功能
# print(_time(), str(e),file=_log_fp)
kwargs["file"]=_log_fp
result = func(_time(),*args, **kwargs)
_log_fp.flush()
return result
return wrapper
myprint=myprint_dec(print)
# 发送数据到指定ip地址和端口
def send_to(ip,port,data:bytearray):
for item in _local_client:
if(item[1]==ip and item[2]==port):
2024-10-08 20:29:52 +08:00
myprint(f"recv from remote {ip},{port}")
item[0].send(data)
break
# 关闭指定地址的端口
def close(ip,port):
for item in _local_client:
if(item[1]==ip and item[2]==port):
2024-10-08 20:29:52 +08:00
myprint(f"remote close:{ip},{port}")
item[0].close()
# 删除已被关闭的条目
_local_client.remove(item)
break
# 关闭所有
def close_all():
for item in _local_client:
item[0].close()
# 关闭端口之后把列表置空
_local_client=[]
2024-10-08 20:29:52 +08:00
myprint('remote close all')
# 本地数据处理,解包,把负载数据发送到本地服务器
# 每一个connect都会创建一个线程
def local_client_handler(tcp_server:socket,ip,port):
global _remote_client
global _local_client
self_info=(tcp_server,ip,port)
_local_client.append(self_info)
while True:
try:
recv = tcp_server.recv(4096)
except Exception as e:
2024-10-08 20:29:52 +08:00
myprint("local:",str(e))
break
if recv:
cmd={'device':'server','option':'data','ip':ip,'port':port}
data=pc.encode(json.dumps(cmd).encode('utf-8'),recv)
if _remote_client is not None:
_remote_client.send(data)
2024-10-08 20:29:52 +08:00
myprint(f"send to remote {ip},{port}")
else:
break
tcp_server.close()
_local_client.remove(self_info)
# 发送连接断开的消息
cmd={'device':'server','option':'disconnect','ip':ip,'port':port}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
if _remote_client is not None:
_remote_client.send(data)
# 远端数据处理,解包,把负载数据发送到本地服务器
def remote_client_handler(tcp_client_1:socket):
global _remote_client
global _local_client
2024-10-08 20:29:52 +08:00
myprint("已连接代理服务器")
cmd={'device':'server','option':'login'}
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
_remote_client.send(data)
recv_data=bytearray()
while True:
try:
recv = tcp_client_1.recv(4096)
except Exception as e:
2024-10-08 20:29:52 +08:00
myprint("remote:",str(e))
break
if recv:
recv_data+=recv
while True:
start=recv_data.find(b'\xff')
end=recv_data.find(b'\xfe')
if(start == -1 or end == -1):
break
cmd,data=pc.decode(recv_data[start:end+1])
2024-10-08 20:29:52 +08:00
myprint(cmd.decode('utf-8'))
try:
j=json.loads(cmd)
if(j['device']=='client'):
if(j['option']=='connect'):
temp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
temp.connect(LOCAL_SERVER_IP)
thd = threading.Thread(target = local_client_handler, args = (temp,j['ip'],j['port']))
thd.start()
elif(j['option']=='disconnect'):
close(j['ip'],j['port'])
elif(j['option']=='data'):
send_to(j['ip'],j['port'],data)
elif(j['device']=='proxy'):
if(j['option']=='close'):
close_all()
except Exception as e:
2024-10-08 20:29:52 +08:00
myprint(str(e))
recv_data=recv_data[end+1:]
else:
break
tcp_client_1.close()
2024-10-08 20:29:52 +08:00
myprint("proxy close.")
2024-10-08 18:46:04 +08:00
close_all()
def main():
global _remote_client
global _local_client
_remote_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
_remote_client.connect(("1.92.113.30",5345))
# thd = threading.Thread(target = remote_client_handler, args = (_remote_client,))
# thd.start()
# thd.join()
remote_client_handler(_remote_client)
if __name__ == "__main__":
2024-10-08 20:29:52 +08:00
_log_fp=open("target_server.log",mode="w+",encoding="utf-8")
main()