Beri bash i ebash / Говнокод #17629 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 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 bormand, (Updated )

Комментарии (56) RSS

  • суровый вы дядька, борман.

    даже я до `tcpdump | while read ` еще не опускался...

    ЗЫ к слову, tcpdump по старой памяти позволяет фильтры задавать. может awk полностью не заменит, но а вдруг.
    Ответить
    • Да, надо фильтры посмотреть. Всё-таки весь трафик через awk гонять как-то не комильфо. Убрать его полностью не получится - мне же надо из этой строки айпишники выдрать, а ash на этой железке настолько убог, что сам регулярки не умеет (bash не влезет, там на флехе где-то 60кб свободного места осталось). А на сишке анализатор пакетов влом писать, раз всё и так работает.

      А сама идея вот такая - скрипт на роутере видит 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 прокся + килл свитч.
        Ответить
        • > killall'ы - от души
          Ну. Влом было думать, почему tcpdump и awk каскадом не убиваются... Кстати, последний killall сначала стоял первым, и скрипт убивал себя не дойдя до оставшихся killall'ов.

          P.S. В общем-то проект just for fun и на коленке, но народ железкой доволен - не надо выписывать айпишки, сбрасывать на автоопределение, потом вписывать айпишки обратно... Просто втыкаешь кабель и юзаешь инет.
          Ответить
          • > последний killall сначала стоял первым, и скрипт убивал себя не дойдя до оставшихся killall'ов.

            LOL.

            попробуй: в /tmp/ делаешь симлинк на себя, но под другим именем. запускашь монитор через другое имя, вместо $0.

            > Просто втыкаешь кабель и юзаешь инет.

            В общем случае оно так и работает по дефолту. Это ты нам наверное файерволов наворотил?
            Ответить
            • > Это ты нам наверное файерволов наворотил?
              Не, там иногда компы приносят со статическими айпишками. По DHCP они само собой нифига не получат, а менять настройки вломы, да и старые айпишки потом вернуть забывают. Из-за этого и приходится мониторить ARP'ы и прикидываться прописанным в настройках того компа шлюзом.
              Ответить
            • Суть задачи в том, чтобы раздать инет компу с произвольными и неизвестными (но вменяемыми) настройками сети.

              Если у него DHCP - выдать айпишку. Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
              Ответить
              • "Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза."

                Хм. Мудро. Но tcpdump в рилтайме на весь траффик... Не тормозит?
                Ответить
                • > Не тормозит?
                  Да там же не торренты качают... Так что не тормозит. Но фильтр надо бы утащить в параметры самого tcpdump'а. tcpdump (аля libpcap) вроде бы прямо на ядерном уровне должен фильтровать, не отдавая лишние пакеты в юзермод...

                  А в идеале написать бы сишную прогу с libpcap, но лень же.
                  Ответить
                  • к слову. согласно доке, `tcpdump -i $INTF arp` должно работать. (`arp` есть выражение которое матчит все пакеты которые содержат протокол arp.)

                    в твоем случае нечто типа: `arp and ether src not $LAN_MAC`
                    Ответить
              • >Суть задачи в том, чтобы раздать инет компу с произвольными и неизвестными (но вменяемыми) настройками сети.
                > Если у него статика - прикинуться тем, кто прописан у него в качестве шлюза.
                До чего техника дошла, а. Идея - пиздатая.
                Или это не техника дошла, а борманд уже совсем дошёл.
                Ответить
                • Борманд ТурбоБаш.

                  Похоже, он proxy-arp зачем-то решил слепить из баша и тцпдампа.
                  Ответить
                  • Подробнее: прокси арп не правит таблицу маршрутизации. Поэтому он вполне канает, если админ заранее знает, какие подсети в какую сторону. Но в моём случае о подключаемом компе ничего не известно (ну кроме того, что он как-то работал в своей локалке, либо настройки никто не лапал и там дефолтное дхцп) и заранее настроить маршруты я не могу.
                    Ответить
                  • Ради интереса попробовал поиграться с proxy arp. Отвечает только на ARP'ы с тех айпишек, для которых есть маршрут на интерфейс, с которого прилетел запрос. Т.е. все маршруты нужно прописать заранее. Неюзабельно для моего случая ;(
                    Ответить
      • Прикольно.

        Но вот это какая-то питушня:
        export BR_IFACE=br-lan
        export LAN_IFACE=eth0
        export WAN_IFACE=wlan0


        Я бы выполнил
        busybox ifconfig -a
        или
        nmcli connection show

        И выпарсил оттуда доступные интерфейсы, а то понаплодили своих usb0, enp2s0...
        Ответить
        • Думаю, Борманду спустя 5 лет стало похуй.
          Ответить
        • Да пофиг. Задачу решает, обновлять там никто ничего не будет пока коробка не сгорит.
          Ответить
          • А ты реально снифашь сеть, видишь ARP запросы компа, и подставляешь тот ип, которрый он ищет?)

            Какой лол)
            Ответить
              • Напиши лучше красивый демон, который слушает ethernet (кстати, как лучше? AF_PACKET? pcap?), логирует, и подсовывает айпишник по настройкам

                Такая штука реально будет полезной
                Ответить
                • > кстати, как лучше?
                  «libpcap». «Сырые сокеты» («Raw Sockets») тоже можно использовать, но тогда тебе придётся в юзермоде обрабатывать все пакеты с соответствующего интерфейса, а это сильно нагружает процессор (если, конечно, у тебя на машине хоть какой-то трафик есть).
                  Ответить
                  • а libcap позволит мне настроить ядро на нужные кадры (через пакет фильтры), да?

                    Тогда лучше pcap, ну и tcpdump же небось его и
                    Ответить
                      • вспомнил, я видел эти фильтры в вайршарк.

                        Но мне всё равно нужен роу сокет, чтобы ответить. Я не хочу добавлять свой ип, как броманд.
                        Ответить
                        • > не хочу добавлять свой ип

                          А роутить трафик ты потом как будешь? Правилом в иптаблес?
                          Ответить
                          • Хороший вопрос.

                            Если я хочу, чтобы клиент всегда работал со своим левым шлюзом, то мне придется себе тоже такой IP прописать, иначе придется все делать вручную
                            Ответить
                • > реально будет полезной

                  Дык она и в виде говноскрипта практическую задачу решала. Переписывать на сишку было бы преждевременной оптимизацией. Да и времени на это ушло бы на порядки больше.
                  Ответить
                  • мне не нравица добавление айпи без провеок и пр: легко можно тебя заспамить
                    Ответить
                    • Я так понимаю, что задачи защищаться от спама не стояло.
                      Ответить
                    • Блин, это была беспроводная коробочка с интернетом. Втыкаешь в неё любой комп и он получает интернет. Какой нафиг спам? Какие нафиг атаки?
                      Ответить
                        • Враги сожгли родную хату,
                          Сгубили всю его семью.
                          Куда ж теперь идти солдату,
                          Кому нести печаль свою?
                          Ответить
                        • Это для работы было. Чтобы чуваки не ебались и не лазили в настройки сети на компе который им притащили для настройки.
                          Ответить
                          • на самом деле охуенно остроумное решение, серьезно, мне нарвится
                            Ответить
                            • Ну сейчас проще можно. Любой девайс с андроидом втыкаешь через usb - вот тебе и интернет. Все операционки норм это понимают изкоробки.
                              Ответить
                                • Ведро умеет раздавать инет через usb. Определяется как стандартная usb сетевуха, dhcp и dns выдаёт, трафик роутит на вайфай или опсоса.

                                  З.Ы. А на настройки компа в данном случае пофиг т.к. это новая сетевуха из-за чего все оси юзают на ней dhcp. Не заработает разве что если ты анально всё зафаерволил и запретил.
                                  Ответить
                                  • не совсем понятно, как тебе это поможет.

                                    У тебя есть коробочка, и к тебе в гости пришел олень. Как ты ему дашь интернет? Купишь ему андрофон с интернетом?
                                    Ответить
                                    • Куплю самый дешёвый китайский смарт и буду юзать его вместо той коробочки с инетом. Самое главное - что думать и что-то писать не нужно.
                                      Ответить
  • >>ну кроме совсем паталогических случаев).
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8