Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    $100 for MAC prefix to vendor resolution

    Scheduled Pinned Locked Moved Completed Bounties
    38 Posts 7 Posters 26.8k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      Eugene
      last edited by

      I think I can take it.
      Places I've found:

      • Status->Interfaces
      • Status->DHCP leases
      • Diagnostics->ARP table

      Anything else?

      http://ru.doc.pfsense.org

      1 Reply Last reply Reply Quote 0
      • E
        Eugene
        last edited by

        This patch assumes that nmap package is installed and MAC->Vendor translation is done based on file /usr/local/share/nmap/nmap-mac-prefixes. If this package is not installed and the file does not exist then nothing breaks, you just still see MAC-addresses.

        Sorry, can't push it to rcs.pfsense.org as port 22 is blocked for me and it seems you do not support git-push over http(s).

        diff --git a/etc/inc/pfsense-utils.inc b/etc/inc/pfsense-utils.inc
        index 5d1bbc3..b277632 100644
        --- a/etc/inc/pfsense-utils.inc
        +++ b/etc/inc/pfsense-utils.inc
        @@ -2121,4 +2121,28 @@ function filter_rules_compare($a, $b) {
                        return compare_interface_friendly_names($a['interface'], $b['interface']);
         }
        
        +/****f* pfsense-utils/load_mac_manufacturer_table
        + * NAME
        + *   load_mac_manufacturer_table
        + * INPUTS
        + *   none
        + * RESULT
        + *   returns associative array with MAC-Manufacturer pairs
        + ******/
        +function load_mac_manufacturer_table() {
        +       /* load MAC-Manufacture data from the file */
        +       $macs=file("/usr/local/share/nmap/nmap-mac-prefixes");
        +       if ($macs){
        +               foreach ($macs as $line){
        +                       if (preg_match('/([0-9A-Fa-f]{6}) (.*)$/', $line, $matches)){
        +                               /* store values like this $mac_man['000C29']='VMware' */
        +                               $mac_man["$matches[1]"]=$matches[2];
        +                       }
        +               }
        +               return $mac_man;
        +       } else
        +               return -1;
        +
        +}
        +
         ?>
        diff --git a/usr/local/www/diag_arp.php b/usr/local/www/diag_arp.php
        index 8a39d3a..46a376b 100755
        --- a/usr/local/www/diag_arp.php
        +++ b/usr/local/www/diag_arp.php
        @@ -283,6 +283,8 @@ foreach ($data as &$entry) {
         // Sort the data alpha first
         $data = msort($data, "dnsresolve");
        
        +// Load MAC-Manufacturer table
        +$mac_man = load_mac_manufacturer_table();
         ?>
        
        @@ -298,7 +300,13 @@ $data = msort($data, "dnsresolve");
        
        -                                               
        +                                               
        
        +// Load MAC-Manufacturer table
        +$mac_man = load_mac_manufacturer_table();
         foreach ($leases as $data) {
                if (($data['act'] == "active") || ($data['act'] == "static") || ($_GET['all'] == 1)) {
                        if ($data['act'] != "active" && $data['act'] != "static") {
        @@ -353,10 +355,20 @@ foreach ($leases as $data) {
                         }
                        echo "\n";
                         echo "\n";
        +               $mac=$data['mac'];
        +               $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
                         if ($data['online'] != "online") {
        -                        echo "\n";
        -                } else {
        -                       echo "\n";
        +                       if(isset($mac_man[$mac_hi])){ // Manufacturer for this MAC is defined
        +                               echo "\n";
        +                       }else{
        +                               echo "\n";
        +                       }
        +                }else{
        +                       if(isset($mac_man[$mac_hi])){ // Manufacturer for this MAC is defined
        +                               echo "\n";
        +                       }else{
        +                               echo "\n";
        +                       }
                         }
                         echo "\n";
                                        if ($data['type'] != "static") {
        diff --git a/usr/local/www/status_interfaces.php b/usr/local/www/status_interfaces.php
        index d6fdced..519d53a 100755
        --- a/usr/local/www/status_interfaces.php
        +++ b/usr/local/www/status_interfaces.php
        @@ -68,6 +68,8 @@ include("head.inc");
                $ifdescrs = get_configured_interface_with_descr(false, true);
                foreach ($ifdescrs as $ifdescr => $ifname):
                $ifinfo = get_interface_info($ifdescr);
        +       // Load MAC-Manufacturer table
        +       $mac_man = load_mac_manufacturer_table();
         ?>
        
        @@ -160,7 +162,12 @@ include("head.inc");
        
        |  |  | 
        +                                               +                                               $mac=$entry['mac'];
        +                                               $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
        +                                               if(isset($mac_man[$mac_hi])){ print "{$mac_man[$mac_hi]}"; }
        +                                               else{ print $mac; }
        +                                               ?>
                                                         | 
                                                                                                                        echo str_replace("Z_ ", "", $entry['dnsresolve']);
        diff --git a/usr/local/www/status_dhcp_leases.php b/usr/local/www/status_dhcp_leases.php
        index 896b1af..915e6f1 100755
        --- a/usr/local/www/status_dhcp_leases.php
        +++ b/usr/local/www/status_dhcp_leases.php
        @@ -320,6 +320,8 @@ foreach ($pools as $data) {
              | [](#) | 
        | {$fspans}{$data['ip']}{$fspane}  | {$fspans}[{$data['mac']}](\"services_wol.php?if={$data['if']}&mac={$data['mac']}\" "\"""){$fspane}  | {$fspans}{$data['mac']}{$fspane}  | {$fspans}[{$mac_man[$mac_hi]}](\"services_wol.php?if={$data['if']}&mac=$mac\" "\"""){$fspane}  | {$fspans}[{$data['mac']}](\"services_wol.php?if={$data['if']}&mac={$data['mac']}\" "\"""){$fspane}  | {$fspans}{$mac_man[$mac_hi]}{$fspane}  | {$fspans}{$data['mac']}{$fspane}  | {$fspans}"  . htmlentities($data['hostname']) . "{$fspane}  | 
        |  | 
        -                       
        +                       +                       $mac=$ifinfo['macaddr'];
        +                       $mac_hi = strtoupper($mac[0] . $mac[1] . $mac[3] . $mac[4] . $mac[6] . $mac[7]);
        +                       if(isset($mac_man[$mac_hi])){ print "" . htmlspecialchars($mac_man[$mac_hi]); print ""; }
        +                             else {print htmlspecialchars($mac);}
        +                       ?>
                         |
        
        

        http://ru.doc.pfsense.org

        1 Reply Last reply Reply Quote 0
        • ?
          Guest
          last edited by

          Evgeny,

          Great job on that! Let me know once you are compensated for this work and I'll move this topic to "Completed".

          1 Reply Last reply Reply Quote 0
          • E
            Eugene
            last edited by

            I believe infofarmer should test it first. As I mentioned earlier I have port 22 blocked at the place I have cloned pfSense to. Tonight I'll try to make a tunnel over 443, push my patches and request a merge. If I am not successful then somebody should commit this changes so people could test them.
            Thanks.

            http://ru.doc.pfsense.org

            1 Reply Last reply Reply Quote 0
            • P
              Perry
              last edited by

              You could make a package instead where you replace the files with yours and install nmap.

              /Perry
              doc.pfsense.org

              1 Reply Last reply Reply Quote 0
              • E
                Eugene
                last edited by

                Do you think it is good idea to modify pfsense-utils.inc by replacing it from a package? especially now when pfSense-2.0 is still beta and this file can be easily changed by any commit…
                Probably community should decide on whether we need this functionality at all? It looks nice but is it needed? -)

                http://ru.doc.pfsense.org

                1 Reply Last reply Reply Quote 0
                • E
                  Eugene
                  last edited by

                  I've requested merge.

                  http://ru.doc.pfsense.org

                  1 Reply Last reply Reply Quote 0
                  • E
                    eri--
                    last edited by

                    I am sorry but this can be a package per se and does not need to be in pfSense.
                    In the package you can put a page same as status->dhcp_leases with your extra changes. This way you make sure nmap is installed.

                    That is just my opinion.

                    1 Reply Last reply Reply Quote 0
                    • E
                      Eugene
                      last edited by

                      Anyway it seems topic starter is not interested anymore.

                      http://ru.doc.pfsense.org

                      1 Reply Last reply Reply Quote 0
                      • ?
                        Guest
                        last edited by

                        So after sending you on that journey, he ended up reneging on the bounty he offered up?

                        1 Reply Last reply Reply Quote 0
                        • E
                          Eugene
                          last edited by

                          @submicron:

                          So after sending you on that journey, he ended up reneging on the bounty he offered up?

                          Well… I haven't heard anything from him/her since his/her last post.
                          I'll probably do a package as ermal and Perry suggested as major job is done here -)

                          http://ru.doc.pfsense.org

                          1 Reply Last reply Reply Quote 0
                          • jimpJ
                            jimp Rebel Alliance Developer Netgate
                            last edited by

                            Give them a little while and if you don't get a response in a few days/weeks, we can always issue a bountypig.  ;)

                            Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

                            Need help fast? Netgate Global Support!

                            Do not Chat/PM for help!

                            1 Reply Last reply Reply Quote 0
                            • E
                              Eugene
                              last edited by

                              I am not sure I know what bountypig is but anyway can we decide on preferable design please? We do not need nmap to be installed for this to work. We need the only one file nmap-mac-prefixes which is a text file with pairs MAC(3 octets) - Vendor name. We can put this file whenever we want and make this stuff independent of nmap package.
                              So two variants:

                              1. It is in 'mainline' but we permanently store mac-prefixes file somewhere.
                              2. A package that replaces pfsense-utils.inc, diag_arp.php, status_dhcp_leases.php, status_interfaces.php and installs mac-prefixes file. We can even leave pfsense-utils.inc untouched if we put function load_mac_manufacturer_table() in all of the rest files.

                              What variant would be preferable?
                              Thanks.

                              http://ru.doc.pfsense.org

                              1 Reply Last reply Reply Quote 0
                              • jimpJ
                                jimp Rebel Alliance Developer Netgate
                                last edited by

                                What is the license on that nmap file? Is it BSD, MIT, Public Domain, GPL? That may impact if we ship with it or not.

                                Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

                                Need help fast? Netgate Global Support!

                                Do not Chat/PM for help!

                                1 Reply Last reply Reply Quote 0
                                • E
                                  Eugene
                                  last edited by

                                  @jimp:

                                  What is the license on that nmap file? Is it BSD, MIT, Public Domain, GPL? That may impact if we ship with it or not.

                                  Sorry, I do not know anything about licenses. At the beginning this file states:

                                  Original data comes from http://standards.ieee.org/regauth/oui/oui.txt

                                  These values are known as Organizationally Unique Identifiers (OUIs)

                                  See http://standards.ieee.org/faqs/OUI.html

                                  We have added a few unregistered OUIs at the end.

                                  Can we create our own 'file'? - as I said it is a text file and I believe this information (MAC ranges assigned to manufacturers) is publicly available. We do not have to use this file from nmap.

                                  http://ru.doc.pfsense.org

                                  1 Reply Last reply Reply Quote 0
                                  • jimpJ
                                    jimp Rebel Alliance Developer Netgate
                                    last edited by

                                    If it's an IEEE standard file I think it's OK to use theirs, or make a new one from the raw OUI data. If there is no license stated in the nmap file it may be OK to include theirs regardless.

                                    Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

                                    Need help fast? Netgate Global Support!

                                    Do not Chat/PM for help!

                                    1 Reply Last reply Reply Quote 0
                                    • E
                                      Eugene
                                      last edited by

                                      Ok. And finally can we have a final word on what variant is preferable - 1) or 2) please?
                                      Thanks.

                                      http://ru.doc.pfsense.org

                                      1 Reply Last reply Reply Quote 0
                                      • jimpJ
                                        jimp Rebel Alliance Developer Netgate
                                        last edited by

                                        1. is probably out for 2.0, but for 2.1 it may be a possibility. We're trying to get RC1 out so adding features at this point isn't really feasible.

                                        2. would be fine as a package, though patches would be better than replacing whole files. I wouldn't bother with an nmap dependency, I'd just include the data file you need.

                                        Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

                                        Need help fast? Netgate Global Support!

                                        Do not Chat/PM for help!

                                        1 Reply Last reply Reply Quote 0
                                        • E
                                          Eugene
                                          last edited by

                                          Good. I'll go with 2) then without nmap dependency.
                                          Thanks.

                                          http://ru.doc.pfsense.org

                                          1 Reply Last reply Reply Quote 0
                                          • E
                                            Eugene
                                            last edited by

                                            I've created a package, let me know what you think.
                                            Thanks.

                                            http://ru.doc.pfsense.org

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.