- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
arp_monitor() {
echo "ARP monitor started on $LAN_IFACE..."
tcpdump -l -n -i $LAN_IFACE ether src not $LAN_MAC 2>/dev/null | awk 'BEGIN{FS="[ ,]"}{if ($2 == "ARP" && $4 == "Request") print $6, $8;}' | while read GATEWAY CLIENT; do
if [ "$GATEWAY" == "$CLIENT" ]; then
echo "Got ARP collision probe gw=$GATEWAY client=$CLIENT"
else
echo "Got ARP request gw=$GATEWAY client=$CLIENT"
ip addr add "$GATEWAY/32" dev "$LAN_IFACE" 2>/dev/null
ip route add "$CLIENT/32" dev "$LAN_IFACE" 2>/dev/null
fi
done
}
Фрагмент моего magic router'а, который раздаёт инет любому воткнутому в него компу (ну кроме совсем паталогических случаев).
даже я до `tcpdump | while read ` еще не опускался...
ЗЫ к слову, tcpdump по старой памяти позволяет фильтры задавать. может awk полностью не заменит, но а вдруг.
А сама идея вот такая - скрипт на роутере видит ARP запрос в духе "who-has 192.168.1.1 tell 192.168.1.7" и добавляет себе айпишку 192.168.1.1 и маршрут на 192.168.1.7. После чего всё без проблем роутится и натится. И на подключенном компе не надо ничего перенастраивать... Заодно все DNS запросы DNAT'ом заруливаются на конкретный айпишник. Ну и DHCP демон крутится до кучи, чтобы покрыть оставшиеся случаи. В итоге - "воткнул и работай", очень удобная железка получилась.
если с BusyBox связался - учи awk.
на первый взгляд, все что ты делаешь одним awk скриптом реализуемо.
я собираюсь подобным то же пострадать: VPN гейтвей на каком banana pi или одроиде + socks5 прокся + килл свитч.
Ну. Влом было думать, почему tcpdump и awk каскадом не убиваются... Кстати, последний killall сначала стоял первым, и скрипт убивал себя не дойдя до оставшихся killall'ов.
P.S. В общем-то проект just for fun и на коленке, но народ железкой доволен - не надо выписывать айпишки, сбрасывать на автоопределение, потом вписывать айпишки обратно... Просто втыкаешь кабель и юзаешь инет.
LOL.
попробуй: в /tmp/ делаешь симлинк на себя, но под другим именем. запускашь монитор через другое имя, вместо $0.
> Просто втыкаешь кабель и юзаешь инет.
В общем случае оно так и работает по дефолту. Это ты нам наверное файерволов наворотил?
Не, там иногда компы приносят со статическими айпишками. По DHCP они само собой нифига не получат, а менять настройки вломы, да и старые айпишки потом вернуть забывают. Из-за этого и приходится мониторить ARP'ы и прикидываться прописанным в настройках того компа шлюзом.
Если у него DHCP - выдать айпишку. Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
Хм. Мудро. Но tcpdump в рилтайме на весь траффик... Не тормозит?
Да там же не торренты качают... Так что не тормозит. Но фильтр надо бы утащить в параметры самого tcpdump'а. tcpdump (аля libpcap) вроде бы прямо на ядерном уровне должен фильтровать, не отдавая лишние пакеты в юзермод...
А в идеале написать бы сишную прогу с libpcap, но лень же.
в твоем случае нечто типа: `arp and ether src not $LAN_MAC`
> Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
До чего техника дошла, а. Идея - пиздатая.
Или это не техника дошла, а борманд уже совсем дошёл.
Похоже, он proxy-arp зачем-то решил слепить из баша и тцпдампа.
Но вот это какая-то питушня:
Я бы выполнил
busybox ifconfig -a
или
nmcli connection show
И выпарсил оттуда доступные интерфейсы, а то понаплодили своих usb0, enp2s0...
«libpcap». «Сырые сокеты» («Raw Sockets») тоже можно использовать, но тогда тебе придётся в юзермоде обрабатывать все пакеты с соответствующего интерфейса, а это сильно нагружает процессор (если, конечно, у тебя на машине хоть какой-то трафик есть).
Да, «tcpdump» так и работает.
Причём фильтры там очень мощные: https://www.tcpdump.org/manpages/pcap-filter.7.html.
А роутить трафик ты потом как будешь? Правилом в иптаблес?
Дык она и в виде говноскрипта практическую задачу решала. Переписывать на сишку было бы преждевременной оптимизацией. Да и времени на это ушло бы на порядки больше.
Сгубили всю его семью.
Куда ж теперь идти солдату,
Кому нести печаль свою?
З.Ы. А на настройки компа в данном случае пофиг т.к. это новая сетевуха из-за чего все оси юзают на ней dhcp. Не заработает разве что если ты анально всё зафаерволил и запретил.