Jump to content
Калькуляторы

Получить интерфейс, за которым находится mac адрес хоста

Имеем 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 отправляет данные на роутер.

Share this post


Link to post
Share on other sites

Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp?

Чтобы MAC, но не ARP - можно в бридже (brctl showmacs bridge0).

Share this post


Link to post
Share on other sites

Единственное, это конструкция периодически лагает, потому то необходимо чтобы этот mac был в arp. Как обойтись без arp?

Чтобы MAC, но не ARP - можно в бридже (brctl showmacs bridge0).

У меня нет бриджа

Share this post


Link to post
Share on other sites

У меня сделан кеш таблички /proc/net/arp. Кеш обновляется раз в минутку. Из arp - пропал, в кеше остался.

Share this post


Link to post
Share on other sites

а посмотреть в файле с лизами ? ну или как вариант включите логирование на dhcp-relay и парсите логи

Share this post


Link to post
Share on other sites

arping ?

 

Для этого надо заранее знать mac. А для его "узнавания" обычного ping'а достаточно. :)

 

PS У меня есть старая тулзовинка, которая создает кеш маков. Взять можно тут: http://topola.unity.net/files/tools/arpcoll-0.04.05.tar.gz Если не обращать внимание на дополнительные прибамбасы - она просто собирает коллекцию маков.

Edited by vop

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this