Need help with LEASEQUERY..continued

Pat Winn ptwinn at cimtel.net
Fri May 21 16:25:22 UTC 2010


Matt,
Good thought. Unfortunately, I've already gone there.
As with your luck, I never got anything to respond to the
Perl code either. Even found a few snippets wherein people
claimed it worked for them and STILL...no response from
dhcpd when I tried it.

The packets on the wire look pretty much the same to me.

I keep wondering..am I just getting something wrong?
Am I missing a byte or bit somewhere that's throwing it off?
Is the ISC DHCPd simply not going to respond no matter what
I send it?

I've tried sending from the same server, bouncing off the same
nic/IP, bouncing off the local loopback, heck, I even tried
sending to it via a unix socket like dhcpd will use to send to
a local syslog daemon. Then I tried sending from a different system,
even faking a valid relay's IP on our network. Nothing.

According to one of the RFC's I was reading, I got the impression
that any "server" that is responding to a relay's leasequery packet
"should" throw out the packet if it looks like the giaddr (relay
IP) has been spoofed to be the same as the server. Given that, maybe
I can't send a packet to a dhcpd running on the same box that my
code is running on? That would really suck as I have written a
PHP based syslog daemon that replaces the real one, catches option-82
info being logged, then wants to send a leasquery packet to dhcpd to
query it for the remaining info about  the lease. Thus, I really
need all the pieces to run on the same box. Failing that, I'd have to
have another daemon running elsewhere that the PHP syslog daemon would
have to send a message to and have it connect back to do the query.
At that point, that's one more piece than I want in the equation,
and one more piece that can break in a production environment.

I'd really rather not have to hack on ISC's code to make it work
the way I want and have to keep up with patching future versions, etc.

Really fishing for ideas as to what to try next...

-- 
Patrick T. Winn
Systems Engineer
Cimarron Telephone Co.
(918) 865-3311 x280 - office
(918) 606-6602 - cell




While counting 0's and 1's, Matt Pascoe said:
> One thought for comparison.. try using the perl leasequery tool to see if
> you see it generating the same packet on the wire.
>
> I have tried the perl tool before and was never able to get it working
> either.  I'm wondering if there is a common issue here (probably me not
> getting it to work right either way :)
>
> I went as far as trying to get a perl cli tool to work for what I needed
> so
> that I could just "exec" it from within PHP.  This was not ideal of course
> but I never got either one working.
>
> Just a thought... I'd work on it too but I'm seriously swamped at work
> right
> now.  Hopefully that will get better soon............
>
> Thanks.
>
> On Fri, May 21, 2010 at 9:12 AM, Pat Winn <ptwinn at cimtel.net> wrote:
>
>> All,
>> I have gotten as far as to send a packet which in my WireShark
>> packet trace..at least..LOOKS to me like it *should* be correct.
>> Yet, I still receive no response.
>>
>> The code snippet I'm attaching is but a simple single file
>> with the basic code needed to construct and send a DHCPLEASEQUERY
>> packet in PHP. It will send the packet but not listen for a
>> response. As yet, I'm only watching the server output, server logs
>> and WireShark packet sniff/traces to see what is going back and
>> forth over the wire.
>>
>> The packet goes out, looks good but as I mentioned above, the
>> server never responds to it. Either I'm still off on something
>> in the packet or something is not right in the server?
>> (running 4.1.1 freshly compiled).
>>
>> The code (real IP's replaced with dummys of course..):
>> (sorry if my web mail client borks up the formatting)..
>>
>> #!/usr/bin/php -e
>> <?
>>
>> $packet = Array();
>>
>> $packet['op']     = '01';
>> $packet['htype']  = '00';
>> $packet['hlen']   = '00';
>> $packet['hops']   = '00';
>> $packet['xid']    = '12345678';
>> $packet['secs']   = '0005';
>> $packet['flags']  = '0000';
>> $packet['ciaddr'] = ip2hex("1.2.3.4");
>> $packet['yiaddr'] = ip2hex("0.0.0.0");
>> $packet['siaddr'] = ip2hex("0.0.0.0");
>> $packet['giaddr'] = ip2hex("1.2.5.1");
>> $packet['chaddr'] = '00000000000000000000000000000000';
>> $packet['sname']  =
>>
>> '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
>> $packet['file'] =
>>
>> '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
>> $packet['magic'] = '63825363';
>> $packet['options']  = int2hex(53) . int2hex(1) . int2hex(10);   //
>> DHCPLEASEQUERY packet type
>> $packet['options'] .= int2hex(55) . int2hex(2) . int2hex(58);
>> $packet['options'] .= int2hex(82) . int2hex(255);
>>
>> $myPacket = pack("H2H2H2H2H8H4H4H8H8H8H8H32H128H256H8H*",
>>    $packet['op'], $packet['htype'], $packet['hlen'], $packet['hops'],
>> $packet['xid'],
>>    $packet['secs'], $packet['flags'], $packet['ciaddr'],
>> $packet['yiaddr'], $packet['siaddr'],
>>    $packet['giaddr'], $packet['chaddr'], $packet['sname'],
>> $packet['file'],
>>    $packet['magic'], $packet['options']);
>>
>> $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
>> socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
>> socket_bind($socket, "1.2.5.1", 68);
>>
>> $error = socket_sendto($socket, $myPacket, strlen($myPacket), 0,
>> '1.2.5.1', 67);
>>
>> if ($error === FALSE) {
>>    print("Send failed for address");
>>    print_r("ERROR: ". $error ." while trying to send.");
>> } else {
>>    echo "Sent ". $error ." bytes\n";
>> }
>>
>> // convert a string to hex values
>> function str2hex($s) {
>>    $hex = '';
>>    for ($i = 0 ; $i < strlen($s); $i++) {
>>        $hex .= dechex(ord($s[$i]));
>>    }
>>
>>    return($hex);
>> }
>>
>> // convert an ip address to hex values
>> function ip2hex($ip) {
>>    $t = explode(".", $ip);
>>    return int2hex($t[0]) . int2hex($t[1]) . int2hex($t[2]) .
>> int2hex($t[3]);
>> }
>>
>> // convert an int value to 0 padded hex value
>> function int2hex($int) {
>>    $hex = base_convert($int, 10, 16);
>>
>>    switch(strlen($hex)) {
>>        case 1:
>>        case 3:
>>        case 7: $hex = '0' . $hex; break;
>>        case 5: $hex = '000' . $hex; break;
>>    }
>>
>>    return $hex;
>> }
>>
>> ?>
>>
>>
>> ..and then, the packet trace (what was actually sent):
>>
>> No.     Time        Source                Destination           Protocol
>> Info
>>  104942 1994.263153 1.2.5.1        1.2.5.1        DHCP     DHCP Lease
>> query - Transaction ID 0x12345678
>>
>> Frame 104942 (292 bytes on wire, 292 bytes captured)
>>    Arrival Time: May 21, 2010 09:56:26.129252000
>>    [Time delta from previous captured frame: 0.000276000 seconds]
>>    [Time delta from previous displayed frame: 1.795716000 seconds]
>>    [Time since reference or first frame: 1994.263153000 seconds]
>>    Frame Number: 104942
>>    Frame Length: 292 bytes
>>    Capture Length: 292 bytes
>>    [Frame is marked: False]
>>    [Protocols in frame: sll:ip:udp:bootp]
>>    [Coloring Rule Name: UDP]
>>    [Coloring Rule String: udp]
>>    Protocol: IP (0x0800)
>> Internet Protocol, Src: 1.2.5.1 (1.2.5.1), Dst: 1.2.5.1 (1.2.5.1)
>>    Version: 4
>>    Header length: 20 bytes
>>    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
>>        0000 00.. = Differentiated Services Codepoint: Default (0x00)
>>        .... ..0. = ECN-Capable Transport (ECT): 0
>>        .... ...0 = ECN-CE: 0
>>    Total Length: 276
>>    Identification: 0x0000 (0)
>>    Flags: 0x04 (Don't Fragment)
>>        0... = Reserved bit: Not set
>>        .1.. = Don't fragment: Set
>>        ..0. = More fragments: Not set
>>    Fragment offset: 0
>>    Time to live: 64
>>    Protocol: UDP (0x11)
>>    Header checksum: 0x7ffb [correct]
>>        [Good: True]
>>        [Bad : False]
>>    Source: 1.2.5.1 (1.2.5.1)
>>    Destination: 1.2.5.1 (1.2.5.1)
>> User Datagram Protocol, Src Port: bootpc (68), Dst Port: bootps (67)
>>    Source port: bootpc (68)
>>    Destination port: bootps (67)
>>    Length: 256
>>    Checksum: 0xd472 [correct]
>>        [Good Checksum: True]
>>        [Bad Checksum: False]
>> Bootstrap Protocol
>>    Message type: Boot Request (1)
>>    Hardware type: NET/ROM pseudo
>>    Hardware address length: 0
>>    Hops: 0
>>    Transaction ID: 0x12345678
>>    Seconds elapsed: 5
>>    Bootp flags: 0x0000 (Unicast)
>>        0... .... .... .... = Broadcast flag: Unicast
>>        .000 0000 0000 0000 = Reserved flags: 0x0000
>>    Client IP address: 1.2.3.4 (1.2.3.4)
>>    Your (client) IP address: 0.0.0.0 (0.0.0.0)
>>    Next server IP address: 0.0.0.0 (0.0.0.0)
>>    Relay agent IP address: 1.2.5.1 (1.2.5.1)
>>    Client address not given
>>    Server host name not given
>>    Boot file name not given
>>    Magic cookie: (OK)
>>    Option: (t=53,l=1) DHCP Message Type = DHCP Lease query
>>        Option: (53) DHCP Message Type
>>        Length: 1
>>        Value: 0A
>>    Option: (t=55,l=2) Parameter Request List
>>        Option: (55) Parameter Request List
>>        Length: 2
>>        Value: 3A52
>>        58 = Renewal Time Value
>>        82 = Agent Information Option
>>    End Option
>>
>>
>> Umm....help?
>>
>> Thanks again for any help offered!!
>>
>>
>> --
>> Patrick T. Winn
>> Systems Engineer
>> Cimarron Telephone Co.
>> (918) 865-3311 x280 - office
>> (918) 606-6602 - cell
>>
>>
>>
>> _______________________________________________
>> dhcp-hackers mailing list
>> dhcp-hackers at lists.isc.org
>> https://lists.isc.org/mailman/listinfo/dhcp-hackers
>>
>





More information about the dhcp-hackers mailing list