2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import json
|
|
|
|
import socket
|
|
|
|
import threading
|
2024-10-08 20:29:52 +08:00
|
|
|
import time
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
import prot_codec as pc
|
2024-10-08 23:57:56 +08:00
|
|
|
from log import myprint
|
|
|
|
from log import log_init
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# tcp服务端脚本
|
|
|
|
# 一个连接远端转发服务器
|
|
|
|
# 另一个连接本地tcp服务器
|
|
|
|
|
|
|
|
|
2024-10-08 19:27:36 +08:00
|
|
|
# 保存连接代理服务器的端口
|
2024-05-22 19:03:17 +08:00
|
|
|
_remote_client=None
|
2024-10-08 19:27:36 +08:00
|
|
|
# 保存本地连接的tcp客户端端口列表
|
2024-10-08 20:29:52 +08:00
|
|
|
# 这个列表的ip和port地址和target_client.py中的同名变量一一对应
|
2024-05-22 19:03:17 +08:00
|
|
|
_local_client=[]
|
|
|
|
|
|
|
|
|
2024-05-23 11:14:17 +08:00
|
|
|
# LOCAL_SERVER_IP = ("192.168.3.166",80)
|
2024-05-22 19:03:17 +08:00
|
|
|
# LOCAL_SERVER_IP = ("192.168.3.167",22)
|
2024-10-08 23:57:56 +08:00
|
|
|
LOCAL_SERVER_IP = ("192.168.3.174",22)
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-08 20:29:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-05-22 19:03:17 +08:00
|
|
|
# 发送数据到指定ip地址和端口
|
|
|
|
def send_to(ip,port,data:bytearray):
|
|
|
|
for item in _local_client:
|
|
|
|
if(item[1]==ip and item[2]==port):
|
|
|
|
item[0].send(data)
|
|
|
|
break
|
|
|
|
|
|
|
|
# 关闭指定地址的端口
|
|
|
|
def close(ip,port):
|
2024-10-08 23:57:56 +08:00
|
|
|
global _local_client
|
2024-05-22 19:03:17 +08:00
|
|
|
for item in _local_client:
|
|
|
|
if(item[1]==ip and item[2]==port):
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint(f"断开连接 {ip}:{port}")
|
2024-05-22 19:03:17 +08:00
|
|
|
item[0].close()
|
2024-10-08 19:27:36 +08:00
|
|
|
# 删除已被关闭的条目
|
|
|
|
_local_client.remove(item)
|
2024-05-22 19:03:17 +08:00
|
|
|
break
|
|
|
|
|
2024-05-23 11:14:17 +08:00
|
|
|
# 关闭所有
|
|
|
|
def close_all():
|
2024-10-08 23:57:56 +08:00
|
|
|
global _local_client
|
2024-05-23 11:14:17 +08:00
|
|
|
for item in _local_client:
|
|
|
|
item[0].close()
|
2024-10-08 19:27:36 +08:00
|
|
|
# 关闭端口之后把列表置空
|
|
|
|
_local_client=[]
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint('连接列表已清空')
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
2024-10-09 09:28:57 +08:00
|
|
|
|
|
|
|
# 定时任务
|
|
|
|
def remote_keeplive():
|
|
|
|
cmd={'device':'server','option':'login'}
|
|
|
|
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
|
|
|
|
try:
|
|
|
|
_remote_client.send(data)
|
|
|
|
except Exception as e:
|
|
|
|
myprint(str(e))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-05-22 19:03:17 +08:00
|
|
|
# 本地数据处理,解包,把负载数据发送到本地服务器
|
2024-10-08 19:27:36 +08:00
|
|
|
# 每一个connect都会创建一个线程
|
2024-10-09 09:28:57 +08:00
|
|
|
def local_client_handler(tcp_server:socket.socket,ip,port):
|
2024-05-22 19:03:17 +08:00
|
|
|
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 23:57:56 +08:00
|
|
|
myprint("本地连接异常",str(e))
|
2024-05-22 19:03:17 +08:00
|
|
|
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 23:57:56 +08:00
|
|
|
myprint(f"发送数据到客户端 {ip}:{port}")
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
tcp_server.close()
|
2024-10-08 23:57:56 +08:00
|
|
|
close(ip,port)
|
2024-10-08 19:27:36 +08:00
|
|
|
# 发送连接断开的消息
|
2024-05-22 19:03:17 +08:00
|
|
|
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:
|
2024-10-08 23:57:56 +08:00
|
|
|
try:
|
|
|
|
myprint(f"发送断开通知到客户端 {ip}:{port}")
|
|
|
|
_remote_client.send(data)
|
|
|
|
except Exception as e:
|
|
|
|
myprint("远端连接异常",str(e))
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 远端数据处理,解包,把负载数据发送到本地服务器
|
2024-10-09 09:28:57 +08:00
|
|
|
def remote_client_handler(tcp_client_1:socket.socket):
|
2024-05-22 19:03:17 +08:00
|
|
|
global _remote_client
|
|
|
|
global _local_client
|
2024-10-08 20:29:52 +08:00
|
|
|
myprint("已连接代理服务器")
|
2024-10-09 09:28:57 +08:00
|
|
|
timer=threading.Timer(5,remote_keeplive,())
|
2024-05-22 19:03:17 +08:00
|
|
|
cmd={'device':'server','option':'login'}
|
|
|
|
data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default')
|
|
|
|
_remote_client.send(data)
|
2024-10-09 09:28:57 +08:00
|
|
|
timer.start()
|
2024-05-22 19:03:17 +08:00
|
|
|
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))
|
2024-05-22 19:03:17 +08:00
|
|
|
break
|
|
|
|
if recv:
|
2024-10-09 09:28:57 +08:00
|
|
|
timer.cancel()
|
|
|
|
timer.start()
|
2024-05-22 19:03:17 +08:00
|
|
|
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'))
|
2024-05-22 19:03:17 +08:00
|
|
|
try:
|
|
|
|
j=json.loads(cmd)
|
|
|
|
if(j['device']=='client'):
|
|
|
|
if(j['option']=='connect'):
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint("收到客户端的连接通知")
|
2024-05-22 19:03:17 +08:00
|
|
|
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'):
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint(f"收到客户端的断开通知 {j['ip']}:{j['port']}")
|
2024-05-22 19:03:17 +08:00
|
|
|
close(j['ip'],j['port'])
|
|
|
|
elif(j['option']=='data'):
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint(f"收到数据 {j['ip']}:{j['port']}")
|
2024-05-22 19:03:17 +08:00
|
|
|
send_to(j['ip'],j['port'],data)
|
2024-05-23 11:14:17 +08:00
|
|
|
elif(j['device']=='proxy'):
|
|
|
|
if(j['option']=='close'):
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint("收到代理服务器的断开通知")
|
2024-05-23 11:14:17 +08:00
|
|
|
close_all()
|
2024-05-22 19:03:17 +08:00
|
|
|
except Exception as e:
|
2024-10-08 20:29:52 +08:00
|
|
|
myprint(str(e))
|
2024-05-22 19:03:17 +08:00
|
|
|
recv_data=recv_data[end+1:]
|
|
|
|
else:
|
|
|
|
break
|
2024-10-09 09:28:57 +08:00
|
|
|
timer.cancel()
|
|
|
|
timer.join()
|
2024-05-22 19:03:17 +08:00
|
|
|
tcp_client_1.close()
|
2024-10-08 23:57:56 +08:00
|
|
|
myprint("与代理服务器的连接已断开")
|
2024-10-08 18:46:04 +08:00
|
|
|
close_all()
|
2024-05-22 19:03:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
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 23:57:56 +08:00
|
|
|
log_init("target_server.log")
|
2024-05-22 19:03:17 +08:00
|
|
|
main()
|
|
|
|
|