def onudp(self): self.tick() ip_header_bytes = self.udp_listener.recv(20) if len(ip_header_bytes) >= 20: ip_header = struct.unpack(udp_thread.ip_packet_format, ip_header_bytes) ip_header_length = (ip_header[0] & 0xF) * 4 total_length = ip_header[2] source = ip_header[8] destination = ip_header[9] if ip_header_length > 20: self.udp_listener.recv(ip_header_length - 20) # Skip IP options and stuff udp_packet = self.udp_listener.recv(total_length - ip_header_length) if not helpers.islocal(socket.inet_ntoa(source)): return if len(udp_packet) >= 8: udp_header = struct.unpack("!HHHH", udp_packet[:8]) source_port = udp_header[0] destination_port = udp_header[1] udp_content = udp_packet[8:] debug2( "UDP packet to %s:%d of %d bytes\n" % (socket.inet_ntoa(destination), destination_port, len(udp_packet)) ) chan = self.openchannel(source, source_port, destination, destination_port) self.mux.send( chan, ssnet.CMD_UDP_OUT, struct.pack("!H4sH", source_port, destination, destination_port) + udp_content, )
def _handle_diversion(divertsock, dnsport): p, tag = divertsock.recvfrom(4096) src, dst = _udp_unpack(p) debug3('got diverted packet from %r to %r\n' % (src, dst)) if dst[1] == 53: # outgoing DNS debug3('...packet is a DNS request.\n') _real_dns_server[0] = dst dst = ('127.0.0.1', dnsport) elif src[1] == dnsport: if islocal(src[0]): debug3('...packet is a DNS response.\n') src = _real_dns_server[0] else: log('weird?! unexpected divert from %r to %r\n' % (src, dst)) assert(0) newp = _udp_repack(p, src, dst) divertsock.sendto(newp, tag)
def _handle_diversion(divertsock, dnsport): p, tag = divertsock.recvfrom(4096) src, dst = _udp_unpack(p) debug3('got diverted packet from %r to %r\n' % (src, dst)) if dst[1] == 53: # outgoing DNS debug3('...packet is a DNS request.\n') _real_dns_server[0] = dst dst = ('127.0.0.1', dnsport) elif src[1] == dnsport: if islocal(src[0], divertsock.family): debug3('...packet is a DNS response.\n') src = _real_dns_server[0] else: log('weird?! unexpected divert from %r to %r\n' % (src, dst)) assert(0) newp = _udp_repack(p, src, dst) divertsock.sendto(newp, tag)
sock, srcip = listener.accept() sock.close() finally: _extra_fd = os.open('/dev/null', os.O_RDONLY) return else: raise if method == "tproxy": dstip = sock.getsockname() elif method == "pf": dstip = pf_dst(sock) else: dstip = original_dst(sock) debug1('Accept TCP: %s:%r -> %s:%r.\n' % (srcip[0], srcip[1], dstip[0], dstip[1])) if dstip[1] == sock.getsockname()[1] and islocal(dstip[0], sock.family): debug1("-- ignored: that's my address!\n") sock.close() return chan = mux.next_channel() if not chan: log('warning: too many open channels. Discarded connection.\n') sock.close() return mux.send(chan, ssnet.CMD_TCP_CONNECT, '%d,%s,%s' % (sock.family, dstip[0], dstip[1])) outwrap = MuxWrapper(mux, chan) handlers.append(Proxy(SockWrapper(sock, sock), outwrap)) expire_connections(time.time(), mux)
os.close(_extra_fd) try: sock, srcip = listener.accept() sock.close() finally: _extra_fd = os.open('/dev/null', os.O_RDONLY) return else: raise if method == "tproxy": dstip = sock.getsockname() else: dstip = original_dst(sock) debug1('Accept TCP: %s:%r -> %s:%r.\n' % (srcip[0], srcip[1], dstip[0], dstip[1])) if dstip[1] == sock.getsockname()[1] and islocal(dstip[0], sock.family): debug1("-- ignored: that's my address!\n") sock.close() return chan = mux.next_channel() if not chan: log('warning: too many open channels. Discarded connection.\n') sock.close() return mux.send(chan, ssnet.CMD_TCP_CONNECT, '%d,%s,%s' % (sock.family, dstip[0], dstip[1])) outwrap = MuxWrapper(mux, chan) handlers.append(Proxy(SockWrapper(sock, sock), outwrap)) expire_connections(time.time(), mux)