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