Akkadius / glass-isc-dhcp

Glass - ISC DHCP Server Interface
MIT License
684 stars 142 forks source link
alerting api-server dhcp dhcp-lease-data email glass isc-dhcp-server mit-license monitor nodejs oui realtime rest-api server slack sms statistics subnets utilization websocket

[npm]() License: MIT

Glass Glass

Table of Contents

Features

Dashboard

dashboard_1

DHCP Config Editing

dhcp_config

DHCP Config Snapshots

dhcp_config_snapshots

DHCP Server Restart

dhcp_server_restart

Statistics

statistics_1

Log Streaming

dhcp_log_stream_filter

log_stream

Glass API

api_examples

Alerting

Alert Delivery Methods

E-Mail

Slack

SMS - Simple Format

Installation

Install NodeJS (If not installed)

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

Install Glass (as root)

cd /opt
git clone https://github.com/Akkadius/glass-isc-dhcp.git
cd glass-isc-dhcp
mkdir logs
chmod u+x ./bin/ -R
chmod u+x *.sh

sudo npm install
sudo npm install forever -g
sudo npm start

Apparmor

sed -i '/\/etc\/dhcp\/\*\*/a\ \ \/var\/lib\/dhcp\/\*\* lrw,' /etc/apparmor.d/usr.sbin.dhcpd 
sed -i '/\/etc\/dhcp\/\*\*/a\ \ \/opt\/glass-isc-dhcp\/\*\* lrw,' /etc/apparmor.d/usr.sbin.dhcpd 
service apparmor restart

Glass Configuration

Defaults

{
  "admin_user": "glassadmin",
  "admin_password": "glassadmin",
  "leases_file": "/var/lib/dhcp/dhcpd.leases",
  "log_file": "/var/log/dhcp.log",
  "config_file": "/etc/dhcp/dhcpd.conf",
  "shared_network_critical_threshold": "95",
  "shared_network_warning_threshold": "0",
  "slack_webhook_url": "",
  "slack_alert_channel": "",
  "leases_per_minute_threshold": "50",
  "ip_ranges_to_allow": [
    ""
  ],
  "email_alert_to": "",
  "sms_alert_to": ""
}

Glass Process Keepalive

crontab -l > mycrontab
echo "@reboot cd /opt/glass-isc-dhcp && /usr/bin/forever --minUptime 10000 --spinSleepTime 10000 -a -o ./logs/glass-process.log -e ./logs/glass-error.log ./bin/www" >> mycrontab
crontab mycrontab
rm mycrontab

Secure your Server

iptables (Recommended)

iptables -A INPUT -p tcp --dport 3000 -s 127.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -s x.x.x.x/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000 -j REJECT --reject-with icmp-port-unreachable

Building dhcpd-pools (Optional)

sudo apt-get install -y unzip
sudo apt-get install -y libtool

git clone https://github.com/Akkadius/dhcpd-pools.git

cd /tmp
wget https://github.com/troydhanson/uthash/archive/master.zip
unzip master.zip

cd /tmp/dhcpd-pools
./bootstrap # only when building git clone
./configure --with-uthash=/tmp/uthash-master/include
make -j4
make check
make install

Glass API

Use Cases

Example Calls

GET: /api/get_active_leases

Output example truncated - some info redacted

  "64.90.X.X": {
    "start": 1507177832,
    "end": 1507181432,
    "mac": "14:91:82:6e:77:0a",
    "mac_oui_vendor": "Belkin International Inc.",
    "options": {
      "ClientMac": "14:91:82:6e:77:a",
      "ClientIP": "64.90.X.X",
      "vendor-class-identifier": "udhcp 1.19.4",
      "vendor-string": "udhcp 1.19.4",
      "agent.remote-id": "3:c:0:0:d1:d4:29:81:f6:3:2:8a:0:be"
    },
    "host": "Vargo"
  },
  "209.212.X.X": {
    "start": 1507177401,
    "end": 1507181001,
    "mac": "20:aa:4b:12:bd:9b",
    "mac_oui_vendor": "Cisco-Linksys, LLC",
    "options": {
      "ClientMac": "20:aa:4b:12:bd:9b",
      "ClientIP": "209.212.X.X",
      "agent.remote-id": "3:c:0:0:d1:d4:29:81:f6:3:1:4e:4:51"
    },
    "host": "snarley55"
  },
...

GET: /api/get_subnet_details

Output example truncated - some info redacted

{
  "subnets": [
    {
      "location": "69.168.x.x/26",
      "range": "69.168.x.x - 69.168.x.x",
      "defined": 55,
      "used": 0,
      "touched": 0,
      "free": 55
    },
    {
      "location": "10.70.48.0/21",
      "range": "10.70.48.2 - 10.70.55.254",
      "defined": 2045,
      "used": 0,
      "touched": 0,
      "free": 2045
    },
...

GET: /api/get_mac_oui_list

Output example truncated - some info redacted

{
  "100000": "Private",
  "100501": "PEGATRON CORPORATION",
  "100723": "IEEE Registration Authority",
  "101212": "Vivo International Corporation Pty Ltd",
  "101218": "Korins Inc.",
  "101248": "ITG, Inc.",
  "101250": "Integrated Device Technology (Malaysia) Sdn. Bhd.",
  "101331": "Technicolor",
  "102279": "ZeroDesktop, Inc.",
...

GET: /api/get_server_info

Output example

{
  "cpu_utilization": 3.1,
  "leases_per_second": 4,
  "leases_per_minute": 310,
  "host_name": "DHCP-Server"
}

GET: /api/get_vendor_count

Output example truncated

{
  "Belkin International Inc.": 1230,
  "Cisco-Linksys, LLC": 1345,
  "Calix Inc.": 4368,
  "Billion Electric Co. Ltd.": 404,
  "Apple, Inc.": 528,
  "Wistron Corporation": 18,
  "ASUSTek COMPUTER INC.": 266,
  "Zyxel Communications Corporation": 320,
  "Billion Electric Co., Ltd.": 611,
  "NETGEAR": 2797,
  "Cisco Systems, Inc": 65,
  "Hewlett Packard": 87,
  "Sonicwall": 11,
...

GET: /api/get_mac_oui_count_by_vendor

Output example truncated

{
  "149182": {
    "count": 131,
    "mac_prefix": "149182",
    "vendor": "Belkin International Inc."
  },
  "180373": {
    "count": 4,
    "mac_prefix": "180373",
    "vendor": "Dell Inc."
  },
  "186590": {
    "count": 1,
    "mac_prefix": "186590",
    "vendor": "Apple, Inc."
  },
...

GET: /api/get_dhcp_requests

Output example truncated - some info redacted

{
  "20:aa:4b:1d:d0:17": {
    "request_for": "68.170.X.X",
    "request_via": "209.212.X.X",
    "request_count": 139,
    "request_vendor": "Cisco-Linksys, LLC"
  },
  "58:6d:8f:aa:37:6a": {
    "request_for": "68.170.X.X",
    "request_via": "209.212.X.X",
    "request_count": 171,
    "request_vendor": "Cisco-Linksys, LLC"
  },
...