Ограничить доступ в интернет для приложений в Linux
Часто в работе сталкиваюсь с ситуацией, когда бывает нужно запускать программу таким образом, чтобы она не имела доступа в интернет. Делается это по разным причинам. Эту задачу можно решить несколькими способами. В статье будет описан один из вариантов решения.
При запуске приложения мы можем присвоить ему ID особой группы — по которому будем блокировать доступ в интернет через netfilter.
Создаём группу-маркер
Создаём группу (назовем ее NO_INTERNET ):
sudo groupadd NO_INTERNET
Добавляем в неё текущего пользователя:
sudo gpasswd -a `id -un` NO_INTERNET
Создаём правило для 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 NO_INTERNET -j DROP
Нужно сделать его исполняемым:
sudo chmod +x /etc/network/if-pre-up.d/inet_access_blocking_rule
Далее создаём скрипт запуска, в котором устанавливаем саму группу по которой будем блокировать
Разместим скрипт в /usr/local/bin
sudo vim /usr/local/bin/NO_INTERNET
Содержимое скрипта будет таким:
#!/bin/bash
sg NO_INTERNET "$*"
Делаем его исполняемым
sudo chmod +x /usr/local/bin/NO_INTERNET
Перезагружаем систему.
Использование данного маркера простое:
NO_INTERNET ping ya.ru
NO_INTERNET firefox
Сделал себе все наоборот. По умолчанию для всех -A OUTPUT -j DROP, а ACCEPT только для polipo, через который у меня идут в интернет только те приложения, которые мне нужны, включая apt (у меня ubuntu). Спасибо, класный блог! (в первую очередь контент, а не из-за dofollow ;))
imatvey, ну да, действительно логичнее сделать -A OUTPUT -j DROP для всех) как-то даже сразу в голову не пришло)
а как узнать какое приложения использует интернет? и возможно ли сделать лог файл для слежки за такими приложениями (что и куда они подключаются)?
Команда netstat с ключами.
Я как-то долго пытался вникнуть и запомнить все ключи iptables, и более-менее получалось. Но т.к. я не админ линукс сервера, а пользователь десктопного пингвина, для меня открытием стал FWBuilder, с тех пор не парюс с таблицами и ключами iptaiptables, а в фвбилдере мышой составляю правила и генерю скрипт, на который стоит симлинк в /etc/network/if-up.d/ В случае нкобходимости внесения изменений все занимает не более пары минут сгенерить новый скрипт и перезапустить сеть для применения, чего нельзя было бы добиться каждый раз вспоминая ключи для iptables