Exemplo n.º 1
0
 async def __call__(self, sock):
     sock.setsockopt(socket.SOL_IP, IP_RECVORIGDSTADDR, True)
     sock.setsockopt(socket.SOL_IP, IP_TRANSPARENT, 1)
     listen_addr = sock.getsockname()
     while True:
         data, ancdata, msg_flags, addr = await sock.recvmsg(
             8192, socket.CMSG_SPACE(24))
         # info = await socket.getaddrinfo(
         #         *addr, 0, socket.SOCK_DGRAM, socket.SOL_UDP)
         taddr = self.get_origin_dst(ancdata)
         if taddr is None:
             if verbose > 0:
                 print("can not recognize the original destination")
             continue
         elif is_local(taddr[0]):
             if verbose > 0:
                 print(f"local addresses are forbidden: {taddr[0]}")
             continue
         if addr not in self.addr2client:
             via_client = self.via()
             self.addr2client[addr] = via_client
             if self.removed is not None:
                 await self.removed[1].close()
                 self.removed = None
         via_client = self.addr2client[addr]
         vaddr = via_client.raddr
         if verbose > 0:
             print(f"udp: {addr[0]}:{addr[1]} --> "
                   f"{listen_addr[0]}:{listen_addr[1]} --> "
                   f"{vaddr[0]}:{vaddr[1]} --> {taddr[0]}:{taddr[1]}")
         await via_client.sendto(data, taddr)
         await via_client.relay(addr, listen_addr)
Exemplo n.º 2
0
    async def __call__(self, sock):
        sock.setsockopt(socket.SOL_IP, IP_RECVORIGDSTADDR, True)
        sock.setsockopt(socket.SOL_IP, IP_TRANSPARENT, 1)
        while True:
            data, ancdata, msg_flags, addr = await sock.recvmsg(
                8192, socket.CMSG_SPACE(24))
            target_addr = self.get_origin_dst(ancdata)
            if target_addr is None:
                continue
            elif is_local(target_addr[0]):
                continue
            if addr not in self.via_clients:
                via_client = self.via.new()
                self.via_clients[addr] = via_client
                if self.removed is not None:
                    await self.removed[1].close()
                    self.removed = None
            via_client = self.via_clients[addr]
            await via_client.sendto(data, target_addr)

            async def sendfrom(data, from_addr):
                if from_addr not in self.bind_socks:
                    sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                    sender.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
                                      1)
                    sender.setsockopt(socket.SOL_IP, IP_TRANSPARENT, 1)
                    sender.bind(from_addr)
                    self.bind_socks[from_addr] = sender
                sender = self.bind_socks[from_addr]
                await sender.sendto(data, addr)

            await via_client.relay(target_addr, sendfrom)

        for via_client in self.via_clients.values():
            await via_client.close()
        for sender in self.bind_socks.values():
            await sender.close()