python小工具-流量转发器
运行环境:windows/linux python3.6
依赖库:IPy
转发器原理:将远程客户端接收到的流量转发到另一个目标机器,达到流量转发的目的。
使用方法:只需要在类实例化填写对应的值就行(本机监听端口,远程ip地址,远程接收端口,本机监听地址)
这里提供一个思路,具体的扩展可以自己加上去,比如ipv6的流量转发等
# -*- encoding: utf-8 -*-
'''
@Author: Voyage
'''
from IPy import IP
from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
from threading import Thread
class NetForward(object):
def __init__(self, listen_port, remote_ipaddr, remote_port, listen_addr="0.0.0.0"):
#listen_addr 本机监听地址 0.0.0.0 代表接收所有的流量
#listen_port 本机监听端口
#remote_ipaddr远程ip地址
#remote_port 远程端口
self.listen_addr = listen_addr
self.listen_port = listen_port
self.remote_ipaddr = remote_ipaddr
self.remote_port = remote_port
def init_check(self):
try:
IP(self.listen_addr)._ipversion
IP(self.remote_ipaddr)._ipversion
except:
exit()
if not isinstance(self.listen_port, int) or not isinstance(self.remote_port, int):
print("端口必须为整数")
exit()
assert self.listen_port > 1 and self.listen_port <= 65535, "端口数必须在2-65535之间"
assert self.remote_port > 1 and self.remote_port <= 65535, "端口数必须在2-65535之间"
def socket_server(self): # 本机监听socket
local_server = socket(AF_INET, SOCK_STREAM)
local_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
try:
local_server.bind((self.listen_addr, self.listen_port))
except Exception as e:
print(e)
return
return local_server
def socket_client(self): # 本机客户端连接远程socket
remote_conn = socket(AF_INET, SOCK_STREAM)
try:
remote_conn.connect((self.remote_ipaddr, self.remote_port))
except Exception as e:
print(e)
return
return remote_conn
def deal_netflow(self, local_conn, remote_conn):
if not local_conn or not remote_conn:
return
while True:
try:
data = local_conn.recv(4096)
except Exception as e:
print(e)
break
if not data:
break
try:
remote_conn.sendall(data)
except Exception as e:
print(e)
break
local_conn.close()
remote_conn.close()
def tcp_request_deal(self, local_conn): # 流量请求处理
remote_conn = self.socket_client()
if not remote_conn:
return
Thread(target=self.deal_netflow, args=(
local_conn, remote_conn)).start()
Thread(target=self.deal_netflow, args=(
remote_conn, local_conn)).start()
def listen(self):
self.init_check()
local_server = self.socket_server()
if not local_server:
return
local_server.listen(30)
print("local listen port:{0} remoteip:{1} remoteport:{2}".format(
self.listen_port, self.remote_ipaddr, self.remote_port))
while True:
local_conn, local_addr = local_server.accept()
Thread(target=self.tcp_request_deal, args=(local_conn,)).start()
if __name__ == "__main__":
s = NetForward(12345, "************", 23456, "0.0.0.0")
s.listen()
第一次发帖 请大佬多指教 genzxc 发表于 2020-5-28 16:20
哎呀 那你这个东西引流是非常NB的吧 我想想啊 比如我两台机器 A B 设置A转到B 一个流量来了 我A B 各算一个 ...
最终的流量还是到B A只是代{过}{滤}理把流量转到B 。你说的引流,应该可以在一台机器上监听多个端口或者架多台机器 把流量都引到一个机器上 哎呀 那你这个东西引流是非常NB的吧 我想想啊 比如我两台机器 A B 设置A转到B 一个流量来了 我A B 各算一个流量还是只算到B? 类似于内网穿透吗 反向代{过}{滤}理? qwert12358 发表于 2020-5-28 15:44
类似于内网穿透吗
可以这么说,不过这个工具没法做到,只是将流量转到另一台机器上。 skyward 发表于 2020-5-28 15:50
反向代{过}{滤}理?
也可以这么说,因为访问到的并不是真实的服务器,而是转发后的服务器。 这个看起来有点厉害 NvidiaChina 发表于 2020-5-28 16:47
这个看起来有点厉害
没有没有:loveliness: 请问一下,这个流量转发,工作时是否需要一直运行呢?
{:301_986:}
页:
[1]
2