Classles static routing DHCP-ből pfSense alatt

Ápr. 12

A DHCP 121-es és 249-es opciója lehetőséget ad rá, hogy adott subnetekhez tartozó routing információt tegyünk közzé. A pfSense nem ad erre kényelmes lehetőséget, de rábeszélhető.

A trükk az, hogy magunknak kell előállítani a dhcp üzenetet, majd azt hexadecimális kódok formájában megadni a pfSense-ben az Additional DHCP Options menüpontban String típusként megadva.

Rendben, de hogyan állítsuk elő ez a kódsort?

  • Először is át kell alakítanunk a netmask-ot hexa formátumra, ez lesz a stringünk eleje.
  • Utána vegyük a network címét. Ha a netmask kisebb mint 9, akkor hagyjuk el az utolsó 3 szakaszát. Ha a netmask nagyobb mint 8 de kisebb mint 17, akkor hagyjuk el az utolsó két szakaszt. Ha a netmask 16-nél nagyobb és 25-nél kisebb, akkor a network címének az utolsó szakaszát hagyjuk el. Az így megmaradt számokat alakítsuk át hexadecimálissá.
  • Végül vegyük a router ip címét, és annak minden szakaszát konvertáljuk hexadecimálissá.
  • A kapott kétjegyű hexadecimális számokat kettősponttal fűzzük össze.

Példa: A 192.168.4.0/22 tartományt a 152.66.83.241 című routeren keresztül szeretnénk elérni.

  • A netmask értéke 22, vagyis hexában 16.
  • A network címéből az első 3 jegyre van szükségünk. 192.168.4 = C0:A8:04
  • Végül a router címe: 152.66.83.241 = 98:42:53:F1
  • Vagyis a szükséges string: 16:C0:A8:04:98:42:53:F1

Legyünk kényelmesek, és bízzuk ennek a legenerálását egy bash scriptre:

#!/bin/bash
check_ip(){ 
  local n=0 val=1
  for i in ${1//./ }; do 
    [ $i -lt 0 -o $i -gt 255 ] && val=0
    n=$[n+1]
  done 
  [ $n -ne 4 ] && val=0
  if [ $val -ne 1 ] ; then
    echo "Invalid IP: $1" >&2
    exit 1
  fi
}

to_bin(){
  local BIN=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
  for i in ${1//./ }; do
   echo -n ${BIN[$i]}
  done
}

while [ $# -gt 0 ] ; do
  nw=${1%/*}; nm=${1#*/}; gw=$2
  check_ip $nw; check_ip $gw
  if [ ${#nm} -gt 2 ] ; then
    check_ip $nm
    nmbin=$(to_bin $nm)
    if echo $nmbin | grep -q "01" ; then
      echo "Invalid netmask: $nm" >&2
      exit 1
    else
      nmbin=${nmbin//0/}
    fi
    nm=${#nmbin}
    echo $nm
  fi
  gwhex=$(printf "%02x:%02x:%02x:%02x" ${2//./ })
  nwhex=$(printf "%02x:%02x:%02x:%02x" ${nw//./ })
  nmhex=$(printf "%02x" ${nm//./ })
  [ $nm -le 24 ] && nwhex=${nwhex%:*}
  [ $nm -le 16 ] && nwhex=${nwhex%:*}
  [ $nm -le 8 ]  && nwhex=${nwhex%:*}
  echo -n $nmhex:$nwhex:$gwhex
  shift 2
  [ $# -gt 0 ] && echo -n ":"
done
echo 

Lássuk, hogyan működik:

$ ./hexroute.sh 10.0.0.0/8 152.66.83.254
08:0a:98:42:53:fe
$ ./hexroute.sh 192.168.128.0/255.255.192.0 152.66.83.254
12:c0:a8:80:98:42:53:fe
$ ./hexroute.sh 10.0.0.0/8 152.66.83.254 192.168.128.0/18 152.66.83.254
08:0a:98:42:53:fe:12:c0:a8:80:98:42:53:fe

Következő bejegyzés Előző bejegyzés