Ограничение доступа в интернет для приложений в Linux

    Иногда бывает необходимо запустить программу, предварительно заблокировав для неё доступ в интернет. Существует довольно простой трюк для решения этой задачи.

    Итак, идея заключается в том, чтобы при запуске приложения устанавливать особый ID группы, который будет сигналом блокировки доступа для netfilter.

    Шаг 1. Создаём группу-маркер и добавляем себя в неё


    Создаём группу (В нашем случае группа будет называться noinet):
    sudo groupadd noinet

    Добавляем в неё текущего пользователя:
    sudo gpasswd -a `id -un` noinet


    Шаг 2. Создаём правило для iptables, которое будет выполняться перед каждым подъёмом сетевого интерфейса


    Создадим файл в директории /etc/network/if-pre-up.d
    sudo vim /etc/network/if-pre-up.d/inet_access_blocking_rule

    со следующим содержимым:
    #!/bin/bash
    iptables -A OUTPUT -m owner --gid-owner noinet -j DROP

    Не забываем сделать его исполняемым:
    sudo chmod +x /etc/network/if-pre-up.d/inet_access_blocking_rule

    Шаг 3. Создаём скрипт запуска, устанавливающий группу-признак


    Разместим скрипт в /usr/local/bin
    sudo vim /usr/local/bin/noinet

    Содержимое скрипта несложное:
    #!/bin/bash
    sg noinet "$*"

    Опять же, не забываем сделать его исполняемым
    sudo chmod +x /usr/local/bin/noinet

    Шаг 4. Перезагрузка системы


    Наверняка это можно сделать проще, но в случае с karmic out-of-box ситуация выглядит следующим образом:

    sudo service networking restart сообщает:
    restart: Unknown instance:

    sudo initctl restart networking сообщает:
    initctl: Unknown instance:

    sudo invoke-rc.d networking restart сообщает:
    Ignoring unknown interface eth0=eth0

    К тому же, чтобы добавление пользователя в группу вступило в силу вам придётся перелогиниться (это как минимум перезапуск DE — sudo restart gdm).
    В общем, если вы просто перезагрузитесь, то все настройки выполнены и вступили в силу.

    Использование


    Использование простое:
    noinet ping habrahabr.ru
    noinet firefox

    Хардкорные линуксоиды шаг 3 могут опустить и использовать всё это так :)
    sg noinet "ping habrahabr.ru"
    sg noinet "firefox"
    Share post

    Similar posts

    Comments 34

    • UFO just landed and posted this here
      • UFO just landed and posted this here
          –16
          Спасибо!
            –15
            хаха) впечатляет. Спасибо!!!
            • UFO just landed and posted this here
              • UFO just landed and posted this here
                  +4
                  Меняете правило фаервола наоборот — чтобы оно разрешало доступ, а по умолчанию ставите запрет.
                    –2
                    man iptables
                      +3
                      Модифицировать описанный метод, сделать правило ACCEPT для группы welcome2inet, все остальное DROP'ать.
                      +6
                      Какое то убожество. man selinux, срочно.
                        +3
                        apparmor?
                          0
                          Вопрос (не наезд): apparmor сумеет применять разные правила для одного бинарника? Например, есть несколько приложений на VM (например, на той же java). Бинарник — один. Получится ли как-то контролировать разные приложения? Можно, в принципе, насоздавать симлинков на бинарник виртуальной машины (по одному для каждого приложения), но, имхо, неудобно.
                            0
                            Вообще не в курсе. Я только понимаю, что это две разные реализации примерно одного и того-же.
                            Но в моей жизни использовать осознанно не приходилось. Более того, selinux мне местами попортил настроение.
                            Наверное, всё это где-то надо и важно, но мои linux use cases не затрагивают…
                          +3
                          Selinux не лучший вариант.
                          Из-за особенностей работы, бывают проблемы с принтерами и сканерами например. В общем много подводных камней.
                          +1
                          Для рестарта сети лучше использовать "/etc/init.d/networking restart".
                            0
                            вещь хорошая конечно, а вот как сделать policy based routing по группам? на сколько я помню, метки ставить и одновременно проверять группу не получается в iptables. а очень хочется торренты завернуть мимо vpn соединения
                              –25
                              Фу, а зачем извращаться с группами и юзерами, нельзя просто по дефолту всем запретить выход в сеть, а избранным приложениям разрешить? А, это же Линукс :) тут нет простых путей)
                                –2
                                во фряшном ipfw возможно сделать правила для опеделенных uid, gid, думаю что iptables не уступает ему в функциональности, т.ч. гляньте в эту сторону в man iptables.
                                  +3
                                  Он вообще-то ровно это и предлагает — это правило для iptables по определенному gid:

                                  iptables -A OUTPUT -m owner --gid-owner noinet -j DROP
                                    0
                                    млин, втупил, извиняюсь ;)
                                  –4
                                  Спасибо!!! возьму на заметку!
                                    0
                                    А я просто шнур выдираю, а потом настраиваю прогу чтобы не лезла куда не надо… Я что-то не так делаю?
                                      0
                                      браво, самый простой способ для десктопа.
                                      однако «не так» начинается, когда ваша машина стоит где-то очень далеко от вас
                                        0
                                        Вообще-то играть с itables на удаленной машине чревато. Достаточно одного неверного символа и приходиться сделать так, чтобы машина стала от вас близко. (если некому перегрузить). Сам наступил на эти грабли. Выход нашел в сбросе всех правил на дофолтовые по крону каждые 15 мин.
                                          0
                                          И не забыть убрать или не удивляться
                                            0
                                            Я думаю любой админ через это проходит :)
                                            Это нормально.
                                            Я обычно делаю первым правилом разрешение себе на доступ по ssh — так безопаснее играться. Ну и проверить, чтобы в случае сброса была возможность продолжить работу.

                                            Так же рекомендуется использовать stateful фаервол. Можно разрешить любой пакет для уже устанолвенного соединения, а фильтровать только новые. См. ESTABLISHED.
                                              0
                                              > Выход нашел в сбросе всех правил на дофолтовые по крону каждые 15 мин.

                                              Просто и гениально! Спасибо за решение. А я заморачивался супервниательным прочитыванием и продумыванием написанного.
                                            +1
                                            После чего с чертыханием вспоминаете, что именно в этот момент как раз докачивался громадный файл с рапиды, и его теперь придётся тянуть по новой.
                                            –1
                                            Добавьте пожалуйста в топик обратную операцию — как потом вытащить из этой группы приложение?

                                            Или доступ приложения в сеть при использовании этого метода будет запрещён разово?
                                              +1
                                              Здесь использеутся sg, а sg — выполняет команду с правами другой группы
                                              Таким образом, чтобы запустить приложение с правами доступа в интернет, надо его просто запустить без использования этого скрипта: вместо noinet firefox, просто firefox.
                                              0
                                              Гуд.
                                              Вот только я не понял, зачем добавлять текущего пользователя в группу, если потом приложение и так запускается с другим GID?
                                                0
                                                Иначе будет запрос пароля (кажется, пароля группы).
                                                0
                                                спасибо
                                                  0
                                                  отличнейшее решение, жаль не позволяет менять правила для приложения «на лету» во время работы приложения.

                                                  Only users with full accounts can post comments. Log in, please.