Voyage 发表于 2020-5-28 15:22

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()

第一次发帖 请大佬多指教

Voyage 发表于 2020-5-28 16:32

genzxc 发表于 2020-5-28 16:20
哎呀 那你这个东西引流是非常NB的吧 我想想啊 比如我两台机器 A B 设置A转到B 一个流量来了 我A B 各算一个 ...

最终的流量还是到B A只是代{过}{滤}理把流量转到B 。你说的引流,应该可以在一台机器上监听多个端口或者架多台机器 把流量都引到一个机器上

genzxc 发表于 2020-5-28 16:20

哎呀 那你这个东西引流是非常NB的吧 我想想啊 比如我两台机器 A B 设置A转到B 一个流量来了 我A B 各算一个流量还是只算到B?

qwert12358 发表于 2020-5-28 15:44

类似于内网穿透吗

skyward 发表于 2020-5-28 15:50

反向代{过}{滤}理?

Voyage 发表于 2020-5-28 15:52

qwert12358 发表于 2020-5-28 15:44
类似于内网穿透吗

可以这么说,不过这个工具没法做到,只是将流量转到另一台机器上。

Voyage 发表于 2020-5-28 15:55

skyward 发表于 2020-5-28 15:50
反向代{过}{滤}理?

也可以这么说,因为访问到的并不是真实的服务器,而是转发后的服务器。

NvidiaChina 发表于 2020-5-28 16:47

这个看起来有点厉害

Voyage 发表于 2020-5-28 18:03

NvidiaChina 发表于 2020-5-28 16:47
这个看起来有点厉害

没有没有:loveliness:

hj170520 发表于 2020-5-28 19:58

请问一下,这个流量转发,工作时是否需要一直运行呢?
{:301_986:}
页: [1] 2
查看完整版本: python小工具-流量转发器