Вопрос или проблема
Недавно я столкнулся с проблемой ограничения доступа в Интернет для определенных программ. Может кто-нибудь порекомендовать хороший способ сделать это без использования какого-либо конкретного программного обеспечения?
Решением для меня оказалось довольно простым.
- Создайте, подтвердите новую группу; добавьте нужных пользователей в эту группу:
- Создать:
groupadd no-internet
- Подтвердить:
grep no-internet /etc/group
- Добавить пользователя:
useradd -g no-internet username
Примечание: если вы изменяете уже существующего пользователя, вам следует выполнить:
usermod -a -G no-internet userName
проверьте с помощью:sudo groups userName
- Создать:
- Создайте скрипт в вашем каталоге и сделайте его исполняемым:
- Создать:
nano /home/username/.local/bin/no-internet
- Исполняемый:
chmod 755 /home/username/.local/bin/no-internet
- Содержимое:
#!/bin/bash
exec sg no-internet "$@"
-
Добавьте правило iptables для блокировки сетевой активности для группы no-internet:
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Примечание: Не забудьте сделать изменения постоянными, чтобы они применялись автоматически после перезагрузки. Это зависит от вашей версии Linux.
-
Проверьте это, например, в Firefox, запустив:
no-internet "firefox"
Если вы хотите сделать исключение и разрешить программе доступ к локальной сети:
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
ПРИМЕЧАНИЕ: В случае создания потомков правила будут соблюдены. Например, если вы запускаете программу с правилом no-internet и эта программа откроет окно браузера, правила все равно будут применены.
Более простой вариант: используйте firejail. Он запускает приложение внутри песочницы. В песочнице вы можете контролировать доступ приложения к любой сети или папке на вашем компьютере.
Чтобы запустить определенное приложение без доступа к сети, выполните следующее:
firejail --net=none <application>
В этом случае “Песочница выглядит как компьютер без каких-либо сетевых интерфейсов.” (См. раздел Сети в документации)
Например, firejail --net=none firefox
запустит firefox без какого-либо сетевого соединения.
Установка
См. документацию по установке. Вам следует установить из системы пакетов в вашем дистрибутиве, или лучше получить последнюю версию LTS. (Например, эта последняя версия LTS, 9.56.2
, также работает в Ubuntu 16.04.)
Из ответа на Как отключить интернет-соединение для одного процесса и Блокировать сетевой доступ процесса
Затем, запуск процесса без сетевого доступа так же прост, как:
unshare -n программа ...
Это создает пустое сетевое пространство имен для процесса. То есть,
он выполняется без сетевых интерфейсов, включая отсутствие обратной петли. В нижеследующем
примере мы добавляем -r для запуска программы только после того, как текущие эффективные
идентификаторы пользователя и группы были сопоставлены с идентификаторами суперпользователя (избегая
sudo):
unshare -r -n ping google.com
nftables может устанавливать правила файрвола на основе cgroups (они могут быть привязаны к каждой программе), синтаксис:
socket cgroupv2 level NUM PATH
PATH:
‘PATH’ – это путь в /sys/fs/cgroup
, учтите, что ‘PATH’ относительный, поэтому вы должны исключить /sys/fs/cgroup/
из абсолютного пути. Например, /sys/fs/cgroup/system.slice/nginx.service
это cgroup для nginx и его ‘PATH’ будет system.slice/nginx.service
.
Большинство служб systemd ограничены в cgroups. Используйте systemd-cgls
для просмотра дерева cgroup и systemd-cgls -u XXX.service
для получения cgroup для конкретной службы. Например, systemd-cgls -u nginx.service
возвратит /system.slice/nginx.service
.
Обратите внимание, что вам следует удалить первый /, так что ‘PATH’ должен быть system.slice/nginx.service
. Если в вашем пути содержится символ ‘@’, пожалуйста, используйте nft --interactive
для установки правил файрвола, иначе символ будет неправильно интерпретирован.
Хотя cgroups будут настройны для каждой службы systemd автоматически, вы можете изменить или создать файлы единиц systemd для тонкой настройки параметров cgroup, если у вас есть специальные потребности. Теоретически, вы можете установить правила для всех программ в операционной системе с поддержкой systemd. См. systemd.unit(5) и systemd.slice(5) для получения дополнительной информации.
Даже самая базовая единица systemd прикреплена к cgroup:
[Unit]
Description="Моя программа"
[Service]
ExecStart="/usr/bin/my_program"
Если вы не используете systemd, вы также можете добавить программу в cgroups вручную. См. документацию по ядру cgroups для получения дополнительной информации.
NUM:
‘NUM’ указывает уровень cgroups, который будет сопоставлен в правиле файрвола.
В нашем предыдущем примере socket cgroupv2 level 2 "system.slice/nginx.service"
точно соответствует службе nginx. Тогда как socket cgroupv2 level 1 "system.slice/nginx.service"
соответствует всем cgroups под “system.slice/”, таким образом, не только nginx, но и другие программы в этом каталоге также будут соответствовать, например, “snapd.service”.
Очень простой пример:
Чтобы предотвратить доступ nginx в Интернет (предполагая, что у вас уже есть inet таблица под названием ‘filter’ и цепочка под названием ‘output’):
nft add rule inet filter output socket cgroupv2 level 2 "system.slice/nginx.service" drop
.
Ответ или решение
Ограничение доступа в интернет для определенных программ на Linux является распространенной задачей, особенно когда речь идет о защите данных или управлении сетевыми ресурсами. В этой статье мы рассмотрим несколько методов решения этой задачи без использования стороннего ПО, а также с применением дополнительных инструментов, таких как Firejail и nftables.
Теория
Обеспечение изоляции программ от сети можно осуществить несколькими способами. На базовом уровне это можно сделать с помощью управления пользователями и группами, а также инструментов командной строки, таких как iptables. Доступ к интернету можно ограничить через сценарии и правила, настраиваемые самим пользователем. Более сложные решения могут включать использование пространств имен или cgroups, которые позволяют более точно контролировать ресурсы системы, доступные для процесса.
Пример
Рассмотрим пример решения задачи с использованием iptables, Firejail и unshare, а также cgroups с nftables.
Создание новой группы и настройка iptables
-
Создание группы: Первым шагом является создание новой группы пользователей, например,
no-internet
.groupadd no-internet grep no-internet /etc/group # Проверка
-
Добавление пользователей в группу:
usermod -a -G no-internet yourusername # Для существующих пользователей
-
Создание сценария для запуска программ от группы без доступа к сети:
Создайте скрипт
/home/yourusername/.local/bin/no-internet
:#!/bin/bash exec sg no-internet "$@"
Сделайте его исполняемым:
chmod 755 /home/yourusername/.local/bin/no-internet
-
Настройка iptables: Ограничьте сетевой трафик для группы
no-internet
:iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Использование Firejail
Firejail позволяет запускать приложения в песочнице с ограниченным доступом к ресурсам, включая сеть. Это более простой способ изоляции процесса:
firejail --net=none firefox # Запуск Firefox без сети
Установить Firejail можно через менеджер пакетов вашего дистрибутива или скачав последнюю версию с официального сайта.
Применение unshare
unshare
создает изолированное пространство имен для процесса, включая пространство сетевых интерфейсов:
unshare -n yourprogram # Запуск программы без сетевых интерфейсов
Команда unshare
полезна для временного отключения сети для процесса без изменения системных настроек.
Использование nftables и cgroups
Для более продвинутого контроля за доступом используя cgroups и nftables, выполните:
-
Определение cgroup: Найдите путь до cgroup вашего процесса. Обычно представлено как
/sys/fs/cgroup
:systemd-cgls -u yourservice.service
-
Настройка nftables: Добавление правила для предотвращения доступа к сети:
nft add rule inet filter output socket cgroupv2 level 2 "system.slice/yourservice.service" drop
Это позволяет точно контролировать сеть для процессов, используя возможности, предоставляемые системой cgroups.
Применение
Выбор подхода для ограничения доступа в интернет зависит от конкретной задачи и инфраструктуры вашей системы. Если вам нужно быстро ограничить доступ для одной программы, то использование Firejail или unshare будет наиболее простым и удобным вариантом. Для более полной и постоянной изоляции можно интегрировать использование iptables или nftables с cgroups, что подходит для управления сетевыми ресурсами на уровне служб и больших систем.
Таким образом, в зависимости от потребностей и уровня технической подготовки, можно выбрать один из предложенных методов или их комбинацию для достижения желаемого результата.