1. bash / Говнокод #17629

    −113

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 12 Февраля 2015

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

    • SEO коммент.
      Ответить
    • суровый вы дядька, борман.

      даже я до `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 прокся + килл свитч.
          Ответить
      • Вот весь код этой говняшки: http://pastebin.com/mCMf4Rxx
        Ответить
        • killall'ы - от души :)
          Ответить
          • > 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 тут не поможет.
                      Ответить
                    • Подробнее: прокси арп не правит таблицу маршрутизации. Поэтому он вполне канает, если админ заранее знает, какие подсети в какую сторону. Но в моём случае о подключаемом компе ничего не известно (ну кроме того, что он как-то работал в своей локалке, либо настройки никто не лапал и там дефолтное дхцп) и заранее настроить маршруты я не могу.
                      Ответить
                    • Ради интереса попробовал поиграться с proxy arp. Отвечает только на ARP'ы с тех айпишек, для которых есть маршрут на интерфейс, с которого прилетел запрос. Т.е. все маршруты нужно прописать заранее. Неюзабельно для моего случая ;(
                      Ответить
        • Прикольно.

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


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

          И выпарсил оттуда доступные интерфейсы, а то понаплодили своих usb0, enp2s0...
          Ответить
    • >>ну кроме совсем паталогических случаев).
      Ответить
      • Упс. Сорри. Патология же.
        Ответить
        • И это всё?.. Лойс ставь...
          Ответить
        • Сяп. Я куплю на этот лойс керосин для моего пожилого примуса. Будет, на чём картошку жарить.
          Ответить
          • Примус тебе уже не понадобится. Да и картошка тоже. И лойс.
            Ответить

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