Linux запретить программе доступ в интернет

Обновлено: 05.07.2024

Я хотел бы использовать программное обеспечение для контроля, какая программа может подключаться к Интернету. Я знаю, что такое поведение связано со словом «брандмауэр», но некоторые пользователи Linux очень расстраиваются, если кто-то требует персонального брандмауэра. Я не хочу расстраивать вас требованием такой программы.
Я не хочу «защищать порты» или другие вещи, которые Персональный брандмауэр обещает в Windows. Я посмотрел, iptables но это не соответствует моим требованиям.

Я увидел здесь отличный ответ ( «Как заблокировать доступ в интернет для винных приложений» ), но настроить его очень неудобно.

Существует ли программное обеспечение, которое запрашивает каждую программу, может ли она получить доступ к Интернету?

на Mac есть программное обеспечение под названием маленький стукач, который делает это. Я думаю, что есть версия для Windows также .

На немецком форуме Ubuntu ( переведенный на английский язык ), похоже, есть Perl-скрипт . Я никогда не пробовал, и я не стал внимательнее смотреть на сценарий, но, возможно, он работает для вас. Описание только на немецком языке, поэтому вам может потребоваться услуга перевода (например, Google Translate; см. Выше).

Я посмотрю на это. Это интересно и может быть правильным инструментом. К сожалению, нет

Мое приложение блокирует все неизвестные приложения (блокируются новые версии авторизованного приложения) и спрашивает, разрешить или запретить его трафик.

Посмотрите на сайт ;-)

Здорово! Я также посмотрел на ppa, но там не было пакета, несмотря на то, что там было создано приложение. Также мне интересно, мог ли он показать ip, разрешенный для читаемого имени сайта? И, я собираюсь следовать инструкциям по компиляции, я видел там много советов для пакетов ubuntu dep, и я буду использовать checkinstall, чтобы создать свою локальную копию пакетов .deb, чтобы легко управлять обновлениями (удалить / установить). Может быть, checkinstall может быть использован для создания ваших распространяемых файлов, я думаю. кажется, именно то, что мне нужно !! Но я не могу найти пакет для его установки в Ubuntu.

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

Создать группу no-internet . Вы не присоединиться к этой группе

Добавьте в iptables правило, которое запрещает no-internet использование сети всеми процессами, входящими в группу ( ip6tables также для предотвращения трафика IPv6).

Вы можете легко написать скрипт-обертку, который использует sudo для вас. Вы можете избавиться от запроса пароля, добавив

или что-то похожее с sudo visudo

Используйте iptables-save и iptables-restore для сохранения правил брандмауэра.

Я попробовал ваше руководство, sudo -g no-internet firefox подключается быстрее, чем по умолчанию. Не работает @kenn Могу только сказать, что здесь все отлично работает. Я предполагаю, что вы делаете что-то не так при создании правила. Не сохранять правило, не делать исполняемый скрипт или что-то в этом роде. Я перезагрузил и снова применил вышеуказанные правила без удачи работал отлично для меня, даже с Firefox. благодарю вас! Похоже, это не работает для меня, на Ubuntu 19.04. Мне нужно было установить iptables-persistent, чтобы изменения могли быть сохранены между перезагрузками. (Так что вы можете добавить это к решению выше). Тем не менее, sudo -g no-internet firefox не ограничивает Firefox в доступе к Интернету. Концептуально, похоже, что это решение должно работать. Есть ли что-то фундаментальное, что упускается из виду? Например, нам нужно настроить ОБА ipv4 и ipv6, чтобы это работало?

В Ubuntu уже есть брандмауэр, ufw но он по умолчанию отключен. Вы можете включить и использовать его с помощью командной строки или ее внешнего интерфейса, gufw , который можно установить непосредственно из Ubuntu Software Center.

Если вам нужно заблокировать доступ в Интернет к определенному приложению, вы можете попробовать LeopardFlower , который все еще находится в бета-версии и недоступен в Центре программного обеспечения Ubuntu:

Запуск программы под другим пользователем будет использовать файлы конфигурации для этого пользователя, а не для вас.

Вот решение, которое не требует изменения правил брандмауэра и работает под тем же пользователем (через sudo ) с измененной средой, где находится ваш пользователь my_user и приложение, которое вы хотите запустить my_app :

Для более подробной информации смотрите man unshare и этот ответ .

Linux GUI firewall

Если вы ищете брандмауэр с графическим интерфейсом, у меня были хорошие результаты с OpenSnitch - его пока нет в репозиториях Ubuntu, и я бы не назвал его производственным уровнем, но выполнение шагов сборки на странице github помогло мне.

ПРИМЕЧАНИЕ. ЭТОТ ВАРИАНТ УДАЛЕН ИЗ IPTABLES В 2005 ГОДУ, ЗА 8 ЛЕТ ДО ЭТОГО ОТВЕТА

Для всех, кто хочет пометить это: это не комментарий, а ответ на заданный вопрос . @ user141987 Я рекомендую расширить это, чтобы предоставить больше информации о том, как настроить iptables ограничения для каждого приложения. Я рекомендую включить важную информацию в ваш ответ (и по-прежнему предоставлять ссылку, для справки). Эта статья, похоже, является дезинформацией, поскольку такой возможности нет. Причина, по которой запросы на создание такой опции в прошлом были отклонены, заключается в том, что она по своей сути ненадежна; приложение может просто изменить свое имя. @psusi Вы говорите, что «если ваше ядро ​​было скомпилировано с CONFIG_IP_NF_MATCH_OWNER, то вы можете настроить брандмауэр iptables для разрешения или отклонения пакетов для каждой команды» неверно? Или просто, что большинство ядер не включают эту опцию? Если это неверно, существуют ли источники информации, которые его опровергают? (Также обратите внимание, что основная цель ограничений брандмауэра для каждого приложения состоит не в том, чтобы сделать его совершенно безопасным для запуска ненадежных приложений. Цель состоит в том, чтобы дать пользователю контроль над встроенными параметрами конфигурации приложений. )

Другой вариант - пожарная тюрьма . Он запускает приложение в песочнице, где вы контролируете, может ли приложение видеть сеть:

Эта команда запустит браузер Firefox без доступа в интернет. Обратите внимание, что дистрибутив firejail в репозитории Ubuntu устарел - лучше загрузите его последнюю версию LTS с домашней страницы firejail.

Я нашел решение, размещенное здесь, чтобы быть хорошим. Он включает создание группы пользователей, для которой разрешен доступ в Интернет , и настройку правил брандмауэра, разрешающих доступ только этой группе. Единственный способ для приложения получить доступ к Интернету, если он запущен членом этой группы. Вы можете запускать программы из этой группы, открыв оболочку с помощью sudo -g internet -s .

Напомним, что в посте, который я связал выше:

Создайте группу «интернет», набрав в командной строке следующее: sudo groupadd internet

Убедитесь, что пользователь, который запустит приведенный ниже скрипт, будет добавлен в sudo группу в /etc/group . Если вы в конечном итоге измените этот файл, то вам нужно будет выйти и снова войти в систему, прежде чем будет работать приведенный ниже скрипт.

Создайте скрипт, содержащий следующее, и запустите его:

Запустив приведенный выше скрипт, вы получите оболочку, в которой вы сможете запускать приложения с доступом в интернет.

Обратите внимание, что этот скрипт ничего не делает для сохранения и восстановления правил брандмауэра. Вы можете изменить скрипт для использования команд iptables-save и iptables-restore команд оболочки.

Часто требуется лишить программу возможности работы с сетью. То есть для отдельного приложения создать иллюзию, что сети нет и тем самым запретить ей передавать какие-либо данные.

Запрет программе доступа в сеть через iptables

Есть такой трюк через файрвол iptables. Любым доступным вам способом нужно добавить правило, которое сбрасывает (DROP) пакеты, основываясь на имени пользователя.

sudo iptables -A OUTPUT -p tcp -m owner --uid-owner NAME_USER_NO_INET -j DROP .

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

sudo -u NAME_USER_NO_INET программа

То есть у вас в системе нужно создать отдельного пользователя и запускать программы от его имени, а iptables будет лишать программу доступа в сеть.

Но есть и другой способ.

Запрет программе доступа в сеть через AppArmor

Можно создать профиль AppArmor для данной программы и в профиле лишить программу сетевых возможностей. Так как цель - запрет выхода в сеть программе, то тонкая настройка профиля для программы это отдельная история и она рассматривается в статье Правила AppArmor.

В данном случае, нам достаточно только запретить сеть, разрешив всё остальное. "Разрешив всё" имеется в виду, что мандатный доступ AppArmor не работает для программы и вся защита основывается на классических правах доступа.

Что делает скрипт и как?
Так как AppArmor - это мандатный доступ основанный на путях, то для AppArmor крайне важен путь к программе. Для примера и наглядности продемонстрируем запрещение доступа для утилиты wget.

В переменной PROGRAM="/usr/bin/wget" указан полный путь к wget. Подсказать путь к бинарнику программы поможет команда whereis -b имя_программы .

В переменной NAME_PROFILE=`echo $PROGRAM| tr "/" "." | cut -c 2-` будет имя будущего профиля wget, которое создаётся из /usr/bin/wget в usr.bin.wget. То есть / заменяется на точку, кроме первого символа.

В RELOAD_APPARMOR="sudo service apparmor reload" укажите как нужно перегружать в вашей системе AppArmor.

DIR_AA_PROFILES="/etc/apparmor.d/" указывает на каталог с профилями AppArmor.

Запустив скрипт sudo sh ./deny-app-net.sh вы создадите файл $NAME_PROFILE в каталоге $DIR_AA_PROFILES.

Содержимое файла /etc/apparmor.d/usr.bin.wget будет таким

profile "/usr/bin/wget" deny network,
deny capability net_bind_service,
deny capability net_broadcast,
deny capability net_admin,
deny capability net_raw,
capability chown,
. сокращено .
/** rwmlkux,
/ rwmlkux,
>

Мы лишаем wget сети, указывая deny network. Так же отключаем возможности (capability) сети, указав deny capability net_*.

Остальные возможности разрешаем, так как не знаем какой программе и что понадобится.

Конструкция вида
/** rwmlkux,
/ rwmlkux,
не мешает программе получить доступ ко всем файлам и папкам (/**) в системе и даёт ей возможность их прочесть (r), записать (w), отобразить в память (m), создать ссылку (l), заблокировать файл (k), ЕСЛИ это позволяют классические права доступа!

С помощью ux мы указываем неконтролируемое AppArmor выполнение программы, так как наша цель была просто лишить программу сети.

Многих испугает фраза, что /** rwmlkux даёт такие широкие возможности программе, НО не забывайте, что речь идёт о мандатном доступе в AppArmor и только! Проще говоря, если классические права доступа не дают программе прочесть некоторый файл, то /** rwmlkux и не даст их.

AppArmor - это дополнительная защита к классическим правам доступа (rwxr-xr-x), а не его замена!

Если вы хотите более тонко настроить профиль и одновременно лишить программу доступа в сеть, то вам придётся освоить синтаксис AppArmor и указать в профиле ваши пожелания. В данной статье это не рассматривается.

Как вернуть программе доступ в сеть?
Удалите созданный профиль и заставьте AppArmor перечитать профили.

как запретить конкретному приложению выход в инет?

Модератор: SLEDopit

как запретить конкретному приложению выход в инет?

или доступ к конкретным портам/адресам

а также как зашейпить скорость сетевого соединения для конкретного приложения?

apparmor разве не этим занимается?

не катит:
--cmd-owner name
Matches if the packet was created by a process with the given command name. (this option is present only if iptables was compiled under a kernel supporting this feature)

NOTE: pid, sid and command matching are broken on SMP

вот мне тоже показалось, что его можно использовать. только пока непонятно как им пользоваться.

но как я понял, простых и удобных гуевых средств нету? типа аналога вендового netlimiter или хотя бы маковского little snitch?

Порты блокировать - это iptables. Шейпить на SMP траффик отдельного приложения, наверное, действительно придётся apparmor'ом. Однако, если приложение отдельные порты использует, то можно обойтись iptables + tc (из iproute2 который). Однако, если приложение отдельные порты использует, то можно обойтись iptables + tc (из iproute2 который). не отдельные. скажем надо закрыть 80 порт конкретному приложению. neru_dead,
и опять говорю - надо по ПРИЛОЖЕНИЮ. не по владельцу, не по группе, не по пиду.

Что есть "приложение"? Побайтное совпадение бинарника? путь? md5-хэш?

"В природе не существует инструмента, машины или устройства, по силе и виртуозности сравнимого с человеческой рукой."
В. Г. Бэнхэм.
---
Ваяю "нелинейный" клавиатурный тренажёр для GNU/Linux - nlkt. Что есть "приложение"? Побайтное совпадение бинарника? путь? md5-хэш?

видимо по пути и имени бинарника.
вы видели как работают такие проги в виндузе? например в netlimiter выбираешь среди активных процессов нужный и выставляешь лимит скорости. в следующий раз эти ограничения уже действуют.
или скажем касперский (да и нетлимитер тоже) спрашивает - "такая-то прога долбится в инет, разрешить/запретить?". запретил - все, в следующий раз уже не спрашивает, а прога думает, что инета нет.
уверен, что запоминается просто по имени и расположению файла (что логичней всего).

неужели под линух нет ничего подобного?! типа вирусов нет, троянов нет, зачем что-то ограничивать? ну и скорость тоже незачем - все на быстром халявном инете (а страдальцев на ЖПРС или скайлинке не учитываем)


Я искал способ заблокировать доступ к Интернету для всех моих приложений, кроме 1 или 2 выбранных приложений.

Я посмотрел на несложный брандмауэр (ufw) и его соответствующий Gui (gufw):


но у gufw, похоже, нет возможности блокировать доступ к Интернету определенных программ (что делает брандмауэр Windows с исходящими правилами).

ВОПРОС: Кто-нибудь знает, как я могу это сделать?

  • В зависимости от того, что более важно, Little Snitch отлично справляется с этим на Mac, хотя obdev.at/products/littlesnitch/index.html

gufw и другие брандмауэры по умолчанию не предназначены для фильтрации по приложениям - gufw это несложный графический интерфейс для ufw , и не предназначен для фильтрации на уровне приложения, это просто несложный интерфейс для настройки основных правил фильтрации на основе IP, порта и т. д.

То, что вы ищете, выходит за рамки стандартных наборов правил межсетевого экрана в Linux, которые ufw и gufw может вместить. Существует несколько предлагаемых методов (связанный - это элементы управления на основе групп, поэтому вам нужно добавить приложения, которые вы хотите получить доступ к сети, в определенную группу), но есть также другие приложения, такие как Douane, которые могут делать это в приложении слой тоже.

  • Любопытно, почему меня отвергли, когда я даже связался с Дуаном, что является еще одним решением .
  • Я не голосовал против, скачаю приложение и посмотрю, как оно работает! :)
  • @Webeng не сказал, что вы это сделали, просто глобальная трансляция того, что я наблюдал: P
  • @ThomasWard Похоже, у Douane есть ошибка зависания, что ужасно. На сайте неясно, решена эта проблема или нет. Вы знаете, происходит ли это до сих пор?

Персональный брандмауэр Douane для GNU / Linux

Я нашел для вас одно возможное решение: Персональный брандмауэр Douane для GNU / Linux - целевая страница, новая домашняя страница.

Однако я не нашел упакованной версии для вашей Ubuntu.

Поддерживается:

  • Любое исходящее соединение генерируется приложением / библиотекой
  • Протоколы: все (такие же, как NetFilter)
  • Направление: Исходящий - Прослушивание

Не поддерживается:

Поскольку все кажется довольно хорошо описанным на странице компиляции Douane - GitLab, я не вижу проблем с процессом компиляции.

Часто сетевой доступ к приложениям и из них косвенно контролируется с помощью правил брандмауэра. Обычно бывает, что приложение пытается согласованно взаимодействовать (либо к конкретный порт / адрес или из определенный порт / адрес), а с помощью брандмауэра вы можете запретить доступ к / из определенного порта или адреса, чтобы отключить возможность доступа приложения к Интернету (или другому компьютеру). Однако, если приложение не обменивается данными согласованным образом, было бы очень сложно написать правила брандмауэра, которые вы были уверены, что заблокировали всю его сеть. Также возможно, что приложение, с которым вы хотите работать, также обменивается данными, используя тот же порт / адрес, и брандмауэр, скорее всего, заблокирует оба приложения.

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

Читайте также: