- 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'а, который раздаёт инет любому воткнутому в него компу (ну кроме совсем паталогических случаев).
bormand 12.02.2015 14:29 # 0
inkanus-gray 12.02.2015 15:06 # 0
kegdan 12.02.2015 15:22 # 0
bormand 12.02.2015 15:56 # 0
Vasiliy 12.02.2015 16:15 # 0
Dummy00001 12.02.2015 18:10 # 0
даже я до `tcpdump | while read ` еще не опускался...
ЗЫ к слову, tcpdump по старой памяти позволяет фильтры задавать. может awk полностью не заменит, но а вдруг.
bormand 12.02.2015 19:13 # 0
А сама идея вот такая - скрипт на роутере видит ARP запрос в духе "who-has 192.168.1.1 tell 192.168.1.7" и добавляет себе айпишку 192.168.1.1 и маршрут на 192.168.1.7. После чего всё без проблем роутится и натится. И на подключенном компе не надо ничего перенастраивать... Заодно все DNS запросы DNAT'ом заруливаются на конкретный айпишник. Ну и DHCP демон крутится до кучи, чтобы покрыть оставшиеся случаи. В итоге - "воткнул и работай", очень удобная железка получилась.
Dummy00001 12.02.2015 19:25 # 0
если с BusyBox связался - учи awk.
на первый взгляд, все что ты делаешь одним awk скриптом реализуемо.
я собираюсь подобным то же пострадать: VPN гейтвей на каком banana pi или одроиде + socks5 прокся + килл свитч.
bormand 12.02.2015 19:19 # 0
Dummy00001 12.02.2015 19:28 # +1
bormand 12.02.2015 19:33 # +1
Ну. Влом было думать, почему tcpdump и awk каскадом не убиваются... Кстати, последний killall сначала стоял первым, и скрипт убивал себя не дойдя до оставшихся killall'ов.
P.S. В общем-то проект just for fun и на коленке, но народ железкой доволен - не надо выписывать айпишки, сбрасывать на автоопределение, потом вписывать айпишки обратно... Просто втыкаешь кабель и юзаешь инет.
Dummy00001 12.02.2015 20:00 # 0
LOL.
попробуй: в /tmp/ делаешь симлинк на себя, но под другим именем. запускашь монитор через другое имя, вместо $0.
> Просто втыкаешь кабель и юзаешь инет.
В общем случае оно так и работает по дефолту. Это ты нам наверное файерволов наворотил?
bormand 12.02.2015 23:52 # +2
Не, там иногда компы приносят со статическими айпишками. По DHCP они само собой нифига не получат, а менять настройки вломы, да и старые айпишки потом вернуть забывают. Из-за этого и приходится мониторить ARP'ы и прикидываться прописанным в настройках того компа шлюзом.
bormand 13.02.2015 00:06 # +4
Если у него DHCP - выдать айпишку. Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
Dummy00001 13.02.2015 00:09 # 0
Хм. Мудро. Но tcpdump в рилтайме на весь траффик... Не тормозит?
bormand 13.02.2015 00:25 # +1
Да там же не торренты качают... Так что не тормозит. Но фильтр надо бы утащить в параметры самого tcpdump'а. tcpdump (аля libpcap) вроде бы прямо на ядерном уровне должен фильтровать, не отдавая лишние пакеты в юзермод...
А в идеале написать бы сишную прогу с libpcap, но лень же.
Dummy00001 13.02.2015 00:39 # +2
в твоем случае нечто типа: `arp and ether src not $LAN_MAC`
bormand 13.02.2015 06:23 # 0
3.14159265 14.02.2015 17:31 # +1
> Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
До чего техника дошла, а. Идея - пиздатая.
Или это не техника дошла, а борманд уже совсем дошёл.
guest 14.02.2015 18:27 # +1
Похоже, он proxy-arp зачем-то решил слепить из баша и тцпдампа.
bormand 15.02.2015 08:13 # 0
bormand 15.02.2015 10:37 # +1
bormand 16.02.2015 14:34 # +1
3.14159265 25.06.2020 00:31 # 0
Но вот это какая-то питушня:
Я бы выполнил
busybox ifconfig -a
или
nmcli connection show
И выпарсил оттуда доступные интерфейсы, а то понаплодили своих usb0, enp2s0...
guest8 25.06.2020 00:32 # −999
bormand 11.07.2020 17:37 # 0
gost 11.07.2020 18:00 # 0
guest8 11.07.2020 18:18 # −999
bormand 11.07.2020 18:40 # 0
guest8 11.07.2020 18:47 # −999
gost 11.07.2020 18:50 # 0
«libpcap». «Сырые сокеты» («Raw Sockets») тоже можно использовать, но тогда тебе придётся в юзермоде обрабатывать все пакеты с соответствующего интерфейса, а это сильно нагружает процессор (если, конечно, у тебя на машине хоть какой-то трафик есть).
guest8 11.07.2020 18:51 # −999
gost 11.07.2020 18:54 # +1
Да, «tcpdump» так и работает.
Причём фильтры там очень мощные: https://www.tcpdump.org/manpages/pcap-filter.7.html.
guest8 11.07.2020 18:59 # −999
bormand 11.07.2020 19:01 # 0
А роутить трафик ты потом как будешь? Правилом в иптаблес?
guest8 11.07.2020 19:06 # −999
bormand 11.07.2020 18:59 # +1
Дык она и в виде говноскрипта практическую задачу решала. Переписывать на сишку было бы преждевременной оптимизацией. Да и времени на это ушло бы на порядки больше.
guest8 11.07.2020 19:00 # −999
gost 11.07.2020 19:01 # 0
bormand 11.07.2020 19:02 # 0
guest8 11.07.2020 19:03 # −999
gost 11.07.2020 19:04 # +1
Сгубили всю его семью.
Куда ж теперь идти солдату,
Кому нести печаль свою?
bormand 11.07.2020 19:05 # 0
gost 11.07.2020 19:05 # 0
guest8 11.07.2020 19:06 # −999
bormand 11.07.2020 19:08 # 0
guest8 11.07.2020 19:09 # −999
bormand 11.07.2020 19:11 # 0
З.Ы. А на настройки компа в данном случае пофиг т.к. это новая сетевуха из-за чего все оси юзают на ней dhcp. Не заработает разве что если ты анально всё зафаерволил и запретил.
guest8 11.07.2020 19:13 # −999
bormand 11.07.2020 19:15 # 0
TEH3OPHblu_nemyx 11.07.2020 21:26 # 0
guest 13.02.2015 00:13 # +1
bormand 13.02.2015 00:19 # 0
guest 13.02.2015 00:23 # 0
guest 13.02.2015 00:28 # 0
KOPOHABuPYC 25.06.2020 01:40 # +1