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( )
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)
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)
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)
#!/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())
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())
#!/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()