class MainHandler(websocket.WebSocketHandler): def __init__(self, *args, **kwargs): super(MainHandler, self).__init__(*args,**kwargs) self.thread = None def open(self): self.set_nodelay(True) self.tun = TunTapDevice(flags= (IFF_TAP | IFF_NO_PI)) self.tun.addr = '192.168.1.1' self.tun.dstaddr = '192.168.1.2' self.tun.netmask = '255.255.255.0' self.tun.mtu = 1500 self.tun.up() self.thread = TunThread(tun=self.tun, socket = self) self.thread.start() def on_message(self, message): print('wrote %s byte message to %s' % (len(message), self.tun.name)) print(':'.join('{0:x}'.format(ord(c)) for c in message)) self.tun.write(message) def on_close(self): print('Closing %s' % self.tun.name) self.tun.close() if self.thread is not None: self.thread.running = False
class TunThread(threading.Thread): def __init__(self, *args, **kwargs): super(TunThread, self).__init__(*args, **kwargs) self.running = True self.tun = TunTapDevice(flags=(IFF_TAP | IFF_NO_PI)) self.tun.addr = '10.5.0.1' self.tun.netmask = '255.255.0.0' self.tun.mtu = 1500 self.tun.up() def run(self): p = poll() p.register(self.tun, POLLIN) try: while (self.running): #TODO: log IP headers in the future pollret = p.poll(1000) for (f, e) in pollret: if f == self.tun.fileno() and (e & POLLIN): buf = self.tun.read( self.tun.mtu + 18) #MTU doesn't include header or CRC32 if len(buf): mac = buf[0:6] if mac == BROADCAST or (ord(mac[0]) & 0x1) == 1: #print 'sending broadcast frame:' #print ':'.join('{0:02x}'.format(ord(c)) for c in buf) for socket in macmap.values(): def send_message(): try: socket.write_message(str(buf), binary=True) except: pass loop.add_callback(send_message) elif macmap.get(mac, False): def send_message(): try: macmap[mac].write_message(str(buf), binary=True) except: pass loop.add_callback(send_message) else: print( "couldn't find recipient for mac %s from %s " % (':'.join('{0:02x}'.format(ord(c)) for c in mac), ':'.join( '{0:02x}'.format(ord(c)) for c in buf[6:12]))) except: print 'closing due to tun error' finally: self.tun.close()
class TunThread(threading.Thread): def __init__(self, *args, **kwargs): super(TunThread, self).__init__(*args, **kwargs) self.running = True self.tun = TunTapDevice(flags=(IFF_TAP | IFF_NO_PI)) self.tun.addr = '10.5.0.1' self.tun.netmask = '255.255.0.0' self.tun.mtu = 1500 self.tun.up() def write(self, message): self.tun.write(message) def run(self): p = poll() p.register(self.tun, POLLIN) try: while (self.running): #TODO: log IP headers in the future pollret = p.poll(1000) for (f, e) in pollret: if f == self.tun.fileno() and (e & POLLIN): buf = self.tun.read( self.tun.mtu + 18) #MTU doesn't include header or CRC32 if len(buf): mac = buf[0:6] if mac == BROADCAST or (ord(mac[0]) & 0x1) == 1: for socket in macmap.values(): def send_message(): try: socket.rate_limited_downstream( str(buf)) except: pass loop.add_callback(send_message) elif macmap.get(mac, False): def send_message(): try: macmap[mac].rate_limited_downstream( str(buf)) except: pass loop.add_callback(send_message) except: logger.error('closing due to tun error') finally: self.tun.close()
class TunThread(threading.Thread): def __init__(self, *args, **kwargs): super(TunThread, self).__init__(*args, **kwargs) self.running = True self.tun = TunTapDevice(flags= (IFF_TAP | IFF_NO_PI)) self.tun.addr = '10.5.0.1' self.tun.netmask = '255.255.0.0' self.tun.mtu = 1500 self.tun.up() def run(self): p = poll() p.register(self.tun, POLLIN) try: while(self.running): #TODO: log IP headers in the future pollret = p.poll(1000) for (f,e) in pollret: if f == self.tun.fileno() and (e & POLLIN): buf = self.tun.read(self.tun.mtu+18) #MTU doesn't include header or CRC32 if len(buf): mac = buf[0:6] if mac == BROADCAST or (ord(mac[0]) & 0x1) == 1: #print 'sending broadcast frame:' #print ':'.join('{0:02x}'.format(ord(c)) for c in buf) for socket in macmap.values(): def send_message(): try: socket.write_message(str(buf),binary=True) except: pass loop.add_callback(send_message) elif macmap.get(mac, False): def send_message(): try: macmap[mac].write_message(str(buf),binary=True) except: pass loop.add_callback(send_message) else: print("couldn't find recipient for mac %s from %s " % (':'.join('{0:02x}'.format(ord(c)) for c in mac), ':'.join('{0:02x}'.format(ord(c)) for c in buf[6:12]))) except: print 'closing due to tun error' finally: self.tun.close()
class TunThread(threading.Thread): def __init__(self, *args, **kwargs): super(TunThread, self).__init__(*args, **kwargs) self.running = True self.tun = TunTapDevice(flags= (IFF_TAP | IFF_NO_PI)) self.tun.addr = '10.5.0.1' self.tun.netmask = '255.255.0.0' self.tun.mtu = 1500 self.tun.up() def write(self, message): self.tun.write(message) def run(self): p = poll() p.register(self.tun, POLLIN) try: while(self.running): #TODO: log IP headers in the future pollret = p.poll(1000) for (f,e) in pollret: if f == self.tun.fileno() and (e & POLLIN): buf = self.tun.read(self.tun.mtu+18) #MTU doesn't include header or CRC32 if len(buf): mac = buf[0:6] if mac == BROADCAST or (ord(mac[0]) & 0x1) == 1: for socket in macmap.values(): def send_message(): try: socket.rate_limited_downstream(str(buf)) except: pass loop.add_callback(send_message) elif macmap.get(mac, False): def send_message(): try: macmap[mac].rate_limited_downstream(str(buf)) except: pass loop.add_callback(send_message) except: logger.error('closing due to tun error') finally: self.tun.close()
class TunTap(object): def __init__(self): self.tun = TunTapDevice(name="fhdi") self.cs = Lock() def open(self): self.tun.addr = '172.16.0.1' self.tun.netmask = '255.255.255.0' self.tun.mtu = 1500 self.tun.up() def close(self): self.tun.close() def write(self, buf): self.cs.acquire() self.tun.write(buf) self.cs.release()
def main(): parser = argparse.ArgumentParser() parser.add_argument('-s', '--source-addr', default='10.8.0.1') parser.add_argument('-d', '--dest-addr', default='10.8.0.2') parser.add_argument('-m', '--netmask', default='255.255.255.0') parser.add_argument('-l', '--mtu', default=1500, type=int) args = parser.parse_args() tun = TunTapDevice() try: tun.addr = args.source_addr tun.dstaddr = args.dest_addr tun.netmask = args.netmask tun.mtu = args.mtu while True: buf = tun.read(tun.mtu) print(buf) tun.write(buf) finally: tun.close()
tun0 = TunTapDevice(name='tun0', flags=IFF_TUN + IFF_NO_PI) #'127.0.0.1' tun0.addr = '10.1.8.82' tun0.dstaddr = '10.1.8.83' tun0.netmask = '255.255.255.0' tun0.mtu = 1500 ip = IP(src="192.168.1.2", dst="192.168.1.1") udp = UDP(sport=4444, dport=4444) payload = Raw(load="Hi! I'm UDP-packet") packet = ip / udp / payload packet.show() new_packet = change_dst_ip(packet, "192.168.1.3") new_packet.show() try: tun0.up() while True: tun0.write(str(packet)) #tun0.write("Hi! I'm UDP-packet") time.sleep(5) tun0.write(str(new_packet)) time.sleep(5) finally: tun0.close()
from pytun import TunTapDevice tun = TunTapDevice(name='mytun') print(tun.name) tun.addr = '192.168.137.1' tun.dstaddr = '192.168.137.10' tun.netmask = '255.255.255.255' tun.mtu = 1500 tap.hwaddr = '\x00\x11\x22\x33\x44\x55' print(tap.hwaddr) tun.persists(True) tun.up() buf = tun.read(tun.mtu) tun.write(buf) tun.close()
print "Name %s" % tun1.name tun1.addr = '10.8.0.1' tun1.dstaddr = '10.8.0.2' tun1.netmask = '255.255.255.0' tun1.mtu = 1500 tun1.up() print "Name %s" % tun2.name tun2.addr = '10.8.0.2' tun2.dstaddr = '10.8.0.1' tun2.netmask = '255.255.255.0' tun2.mtu = 1500 tun2.up() while True: r = select([tun1, tun2], [], [])[0][0] try: buf = r.read(r.mtu) if r == tun1: read = tun1.name tun2.write("Hi tun1!") else: read = tun2.name tun1.write("Hi tun2!") print "Read from %s: %s" % (read, buf.encode('hex')) #time.sleep(5) except: tun1.close() tun2.close() exit()
sys.exit(ERROR) packetnumber = 0 try: while (True): raw_packet = tap.read(tap.mtu) # buf = tun.read(tun.mtu) eth_frame = eth.Ethernet_Frame(raw_packet) print(str(eth_frame)) if f.ETHER_TYPE[eth_frame.eth_type.hex()] == 'ARP': arp_packet = arp.ARP_packet(eth_frame.data) print(str(arp_packet)) if f.OP[arp_packet.op.hex()] == 'ARP_request': if arp_packet.conv_reply_packet(): eth_frame.src_mac_addr = arp_packet.sender_mac_addr eth_frame.dst_mac_addr = arp_packet.target_mac_addr eth_frame.data = arp_packet.packet print(str(arp_packet)) tap.write(eth_frame.frame) packetnumber += 1 except KeyboardInterrupt: tap.close() # tun.close() print('\nExit') sys.exit(SUCCESS)
high = (short & 0xff00) >> 8 low = (short & 0x00ff) return chr(high) + chr(low) if __name__ == '__main__': tap = TunTapDevice(name='ipsec-tap', flags=IFF_TAP) tap.up() tap.persist(True) while True: try: buf = tap.read(tap.mtu) print 'old', hexlify(buf) # Valeri @ studentpub new_addr = struct.pack('4B', 192, 168, 10, 174) new_buf = buf[:34] + new_addr + buf[38:] ip_header = new_buf[18:38] checksum = ip_checksum([format(ord(c), "x") for c in ip_header], 20) print hex(checksum) final_buf = new_buf[:28] + shortToBytes(checksum) + new_buf[30:] print 'new', hexlify(final_buf) print tap.write(final_buf) # TODO encrypt buf # TODO send to wlan0 # TODO enable routing except KeyboardInterrupt: tap.close()