Esempio n. 1
0
	def ap_func( self ):
		global selfmac
		def sendlan( o ):
			o.dst = gwmac
			o.src = selfmac
			print "发送出去"
			print `o`
			print "发送结束"
			#lancap.send( o )
			#self.send_s.sendto(str(o),0,(gwip,53) )
			print "结果:", wincap.sendto( self.send_s, str(o), (gwip,53)  )
		
		print "开始AP线程."
		lancap = getcap( lanid )
		apcap  = getcap( apid  )
		for a, b in apcap:
			d = dpkt.ethernet.Ethernet( b )
			#d.dst = gwmac
			if isinstance ( d.data, dpkt.ip6.IP6): continue
			print `d`
			ip = d.data
			if isinstance( d.data, dpkt.arp.ARP ):
				print "ARP包"
				#sendlan( d )
				continue
			if ip.dst == "\xff" * 6:
				# 广播包,直接转
				print "广播包"
				d.src = selfmac
				lancap.send( d )
			if isinstance( d.data.data, dpkt.udp.UDP ):
				if not selfmac: selfmac = d.dst
				udp = ip.data
				print "UDP 包",tip(ip.src),ip.data.sport,"==>", tip(ip.dst),udp.dport
				if udp.dport == 67:
					print "DHCP"
					pak = DhcpPacket()
					pak.DecodePacket( udp.data )
					print pak.str()
					if pak.GetOption("dhcp_message_type")
					continue
				p = self.up.handleOut( ip.src, ip.data.sport, ip.dst, ip.data.dport )
				d.data.src = selfip
				if( ip.data.dport == 53 ):
					d.data.dst = dnsip
				d.data.sum = 0
				d.data.id = 0
			#	sendlan( d )
			
	def lan_func(self ):
		lancap = getcap( lanid )
		apcap = getcap( apid )
		lancap.setfilter(  )
Esempio n. 2
0
    def HandleDhcpDiscover(self, packet):
        self.app.logger.info('DISCOVER from %s', packet.str_mac)
        self.app.logger.debug(packet.str())

        node = Node.query.get(packet.str_mac)

        if node is None:
            self.app.logger.info('Node %s has not listen in database', packet.str_mac)
            events.PyBootstrapperEventDhcpUnknownHost.register(packet.str_mac)
            return

        offer = DhcpPacket()
        offer.CreateDhcpOfferPacketFrom(packet)
        yiaddr = node.offer(self.icmp_test_alive)

        if packet.str_user_class == 'gPXE':
            options = node.gpxe_options
        else:
            options = node.pxe_options

        for opt in options:
            offer.SetOption(opt.option, opt.binary)

        offer.SetOption("yiaddr", yiaddr.words)
        offer.SetOption("siaddr", self.listen_on_ip.list())

        self.app.logger.debug(offer.str())

        if self.SendDhcpPacketTo(offer, self.broadcast, self.emit_port) <= 0:
            self.app.logger.error('Could not send DHCP offer to %s', packet.str_mac)
Esempio n. 3
0
    def HandleDhcpRequest(self, packet):

        self.app.logger.info('REQUEST from %s', packet.str_mac)
        self.app.logger.debug(packet.str())

        node = Node.query.get(packet.str_mac)

        renew_ip = self._list2long(packet.GetOption("ciaddr"))
        new_ip = self._list2long(packet.GetOption('request_ip_address'))

        server_id = self._list2long(packet.GetOption('server_identifier'))

        lease = None

        if not server_id:  # INIT-REBOOT
            lease = node.lease(new_ip)

        elif ipv4(server_id) == self.listen_on_ip:  # SELECT
            request_ip_address = renew_ip or new_ip
            if not request_ip_address:
                self.app.logger.error('Got DHCP REQUEST from %s with empty request_ip_address and ciaddr', packet.str_mac)
            else:
                lease = node.lease(request_ip_address, existen=renew_ip)

        else:
            self.app.logger.info('Node %s has accept offer from another server', packet.str_mac)
            node.cleanup_offers()
            return

        if not lease:
            self.nack(packet)
            return

        ack = DhcpPacket()
        ack.CreateDhcpAckPacketFrom(packet)

        if packet.str_user_class in ['gPXE', 'iPXE']:
            options = node.gpxe_options
        else:
            options = node.pxe_options

        for opt in options:
            ack.SetOption(opt.option, opt.binary)

        ack.SetOption("yiaddr", lease.yiaddr.words)
        ack.SetOption("siaddr", self.listen_on_ip.list())

        events.PyBootstrapperEventDhcpLeasing.register(packet.str_mac, lease.yiaddr)
        node.commit_lease(lease)

        self.app.logger.debug(ack.str())
        if self.SendDhcpPacketTo(ack, self.broadcast, self.emit_port) <= 0:
            self.app.logger.error('Could not send DHCP ACK to %s', packet.str_mac)
Esempio n. 4
0
def test_handle_dhcp_handshake(dhcprequest) -> None:
    success_mock = Mock()
    failure_mock = Mock()
    req = dhcprequest(
        cls=DhcpAddressInitialRequest,
        success_clb=success_mock,
        failure_clb=failure_mock,
        requestor=Mock(),
    )

    offer = DhcpPacket()
    offer.source_address = ("123.123.123.123", 67)
    req.handle_dhcp_offer(offer)

    packet = DhcpPacket()
    packet.AddLine("op: 2")
    packet.AddLine("domain_name: scc.kit.edu")
    packet.AddLine("yiaddr: 1.2.3.4")
    packet.AddLine("router: 2.3.4.5")
    packet.AddLine("subnet_mask: 255.255.255.0")
    packet.AddLine("domain_name_server: 1.0.0.0,2.0.0.0,3.0.0.0")
    packet.SetOption("classless_static_route",
                     bytes([0, 4, 0, 0, 0, 16, 10, 12, 5, 0, 0, 0]))
    packet.AddLine("ip_address_lease_time: 9000")
    packet.AddLine("renewal_time_value: 300")
    packet.AddLine("ip_address_lease_time: 9000")
    packet.AddLine("rebinding_time_value: 7000")
    packet.source_address = ("123.123.123.123", 67)

    print(packet.str())

    expected_res = {
        "dns": ["1.0.0.0", "2.0.0.0", "3.0.0.0"],
        "domain": "scc.kit.edu",
        "ip_address": "1.2.3.4",
        "gateway": "4.0.0.0",
        "static_routes": [("10.12.0.0", "255.255.0.0", "5.0.0.0")],
        "subnet_mask": "255.255.255.0",
        "lease_timeout": 1580009000,
        "renewal_timeout": 1580000300,
        "rebinding_timeout": 1580007000,
    }

    req.handle_dhcp_ack(packet)
    success_mock.assert_called_once_with(expected_res)
Esempio n. 5
0
#!/usr/bin/python

from pydhcplib.dhcp_packet import DhcpPacket
from pydhcplib.type_strlist import strlist
from pydhcplib.type_ipv4 import ipv4

packet = DhcpPacket()

packet.SetOption("op", [1])
packet.SetOption("domain_name", strlist("anemon.org").list())
packet.SetOption("router", ipv4("192.168.0.1").list() + [6, 4, 2, 1])
packet.SetOption("time_server", [100, 100, 100, 7, 6, 4, 2, 1])
packet.SetOption("yiaddr", [192, 168, 0, 18])
packet.SetOption("maximum_datagram_reassembly_size", [2, 1])
packet.SetOption("tcp_keepalive_interval", [8, 4, 2, 1])

print(packet.str())
Esempio n. 6
0
    1,
    02,
    3,
    4,
    5,
    6,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
])
packet.SetOption("htype", [1])

print packet.str()
p = packet.EncodePacket()

import socket as S
s = S.socket(S.AF_INET, S.SOCK_DGRAM, 0)
s.setsockopt(S.SOL_SOCKET, S.SO_BROADCAST, 1)
s.setsockopt(S.SOL_SOCKET, S.SO_REUSEADDR, 1)

s.bind(('1.1.1.106', 68))

s.sendto(p, ("255.255.255.255", 67))
#!/usr/bin/python

from pydhcplib.dhcp_packet import DhcpPacket
from pydhcplib.type_strlist import strlist
from pydhcplib.type_ipv4 import ipv4


packet = DhcpPacket()

packet.SetOption("op",[1])
packet.SetOption("domain_name",strlist("anemon.org").list())
packet.SetOption("router",ipv4("192.168.0.1").list()+[6,4,2,1])
packet.SetOption("time_server",[100,100,100,7,6,4,2,1])
packet.SetOption("yiaddr",[192,168,0,18])

print(packet.str())
Esempio n. 8
0
#!/usr/bin/python

from pydhcplib.dhcp_packet import DhcpPacket
from pydhcplib.type_strlist import strlist
from pydhcplib.type_ipv4 import ipv4


packet = DhcpPacket()

packet.SetOption("op",[1])
packet.SetOption("domain_name",strlist("anemon.org").list())
packet.SetOption("router",ipv4("192.168.0.1").list()+[6,4,2,1])
packet.SetOption("time_server",[100,100,100,7,6,4,2,1])
packet.SetOption("yiaddr",[192,168,0,18])

print packet.str()