Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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()
Ejemplo n.º 9
0
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()
Ejemplo n.º 10
0
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()
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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()