ne-vlezay80 Posted February 12, 2015 Posted February 12, 2015 Имеем dhcp-relay. Сервер имеет ip:10.99.215.7. Шлюз имеет: 10.99.200.11. Клиент с dhcp получает 10.99.100.10/32. Задача: получить сетевой интерфейс за которым скрывается клиент. На данный момдет она решается так: LANDEV=$(arp -n|grep $ETHER|gawk '{print $5}') Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp? Полный код скрипта: root@debian-01:~# cat /srv/cgi/cgi-bin/ip.cgi #!/bin/bash # Global script param # RTABLE=100 # LANDEV=eth1 PROTO=dhcp # Header to WWW echo "Content-Type: text/html" echo "" # Internal parametrs (no change) PASSKEY_1=/srv/cgi/passkey CMD_LINE=$(echo $QUERY_STRING|tr '&' ' ') ACTION=$(echo $CMD_LINE|gawk '{print $1}') ADDR=$(echo $CMD_LINE|gawk '{print $2}') # PASSKEY=$(echo $CMD_LINE|gawk '{print $3}') ETHER=$(echo $CMD_LINE|gawk '{print $3}') PASSKEY=$(echo $CMD_LINE|gawk '{print $4}') PASSKEY_LD=$(cat $PASSKEY_1) # Getting interface data LANDEV=$(arp -n|grep $ETHER|gawk '{print $5}') # Chack passkey if [ "$PASSKEY_LD" == "$PASSKEY" ] then # Setup to action case $ACTION in # Add route ADD) ip route add $ADDR dev $LANDEV proto $PROTO # Check state from ip route add if [ "$?" -eq "0" ] then STATE=SUCCESS else STATE=FAIL fi ;; # Remove route DEL) ip route del $ADDR proto $PROTO # dev $LANDEV # Check state from ip route del if [ "$?" -eq "0" ] then STATE=SUCCESS else STATE=FAIL fi ;; # Exit esac else # State to invalid STATE=INVALID_PKEY fi # Display internal state echo "IPROUTE: ACTION=$ACTION HOST=$ADDR ETHER=$ETHER STATE=$STATE" # End dhcp сервером запускается скрипт, который через curl отправляет данные на роутер. Вставить ник Quote
TheUser Posted February 12, 2015 Posted February 12, 2015 Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp? Чтобы MAC, но не ARP - можно в бридже (brctl showmacs bridge0). Вставить ник Quote
ne-vlezay80 Posted February 12, 2015 Author Posted February 12, 2015 Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp? Чтобы MAC, но не ARP - можно в бридже (brctl showmacs bridge0). У меня нет бриджа Вставить ник Quote
vop Posted February 12, 2015 Posted February 12, 2015 У меня сделан кеш таблички /proc/net/arp. Кеш обновляется раз в минутку. Из arp - пропал, в кеше остался. Вставить ник Quote
orlik Posted February 13, 2015 Posted February 13, 2015 а посмотреть в файле с лизами ? ну или как вариант включите логирование на dhcp-relay и парсите логи Вставить ник Quote
vop Posted February 13, 2015 Posted February 13, 2015 (edited) arping ? Для этого надо заранее знать mac. А для его "узнавания" обычного ping'а достаточно. :) PS У меня есть старая тулзовинка, которая создает кеш маков. Взять можно тут: http://topola.unity.net/files/tools/arpcoll-0.04.05.tar.gz Если не обращать внимание на дополнительные прибамбасы - она просто собирает коллекцию маков. Edited February 13, 2015 by vop Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.